__arm920_setup과 __enable_mmu에서 설정한 제어 레지스터의 값(R0)을 실제로 CP15 Register 1, control register 에 저장한다. 이제부터 MMU가 작동하고 가상 메모리 공간을 사용하게 된다. 모든 메모리 주소 참조는 주소 변환 과정을 거친다. IP 레지스터에 저장되어 있던 __mmap_switched 로 분기한다.
 
[__mmap_switched ] /arch/arm/kernel/head-common.S
 
__data_loc과 __data_start의 위치가 다를 경우 __data_start 부터 __bss_start 까지 __data_loc에 위치한 데이터를 복사한다. XIP 커널은 ROM에 있는 data 섹션(__data_loc)의 내용을 RAM(__data_start)으로 복사해야 한다.
BSS 영역을 0으로 초기화한다. CP15 Register 0 에서 읽어온 ID code (R9)와 부트로더 에서 넘긴 ARCH 넘버(R1)를 arch/arm/kernel/setup.c의 processor_id와 __machine_arch_type 변수에 저장한다.

__enable_mmu에서 처리했던 CP15 Register 1, control register 의 값(R0)을
arch/arm/kernel/entry-armv.S의 cr_alignment에 저장하고, A bit(Alignment Fault Checking)을 클리어 한 값을 cr_no_alignment에 저장하고,
스택포인터(sp)를 init_thread_union + THREAD_START_SP 로 설정한다. 

start_kernel 로 분기한다.

'리눅스커널' 카테고리의 다른 글

[ volatile , barrier ]  (0) 2009.10.02
Memory Barrier  (0) 2009.10.02
[ __enable_mmu ] arch/arm/kernel/head.S  (0) 2009.10.02
[ __arm920_setup ] arch/arm/mm/proc-arm920.S  (0) 2009.10.02
[ __create_page_tables ] /arch/arm/kernel/head.S  (0) 2009.10.02
Posted by blee
,