반응형
Notice
Recent Posts
Recent Comments
관리 메뉴

꿈꾸는 사람.

[ARM] stext label, start_kernel() 호출. 본문

IT/Linux

[ARM] stext label, start_kernel() 호출.

현무랑 니니 2014. 1. 25. 23:27
반응형









부트로더에서 커널이 로드되고 arch/arm/head.S/stext가 실행된다.

stext에서 start_kernel를 호출하기까지 수행하는 작업을 이번 글에서 다루기로 한다.


stext에서 start_kernel() 호출하는 개요.

커널이 시작할 진입점이 stext 레이블이다.

stext 레이블이 실행될 때 요구되는 사항은 다음과 같다.

  • MMU = off,
  • D-cache = off
  • r0 = 0
  • r1 = machine number
  • r2 = atags pointer


1. IRQ를 비활성화하고 SVC mode로 설정한다.

2. coprocessor에서 프로세스 ID를 읽어 온다.

3. __lookup_processor_type 레이블에서 프로세서 정보를 찾아낸다.

4. __lookup_machine_type 레이블에서 머신 정보를 찾는다.

5. __vet_atags 레이블에서 부트로더로부터 넘겨받은 인자의 유효성을 검사한다.

6. __create_page_tables에서 가상 메모리를 사용하기 위해 초기 페이지 테이블을 설정한다.

9~10. __v6_setup 레이블에서 ARM core를 설정한다. 여기에서 TLB, 캐수, MMU를 초기화 한다.

12. __enable_mmu 레이블에서 MMU 활성화를 위한 설정을 하고 도메인 액세스 레지스터와 페이지 테이블 포인터를 설정한다.

13. __turn_mmu_on 레이블에서 MMU를 활성화 한다.

15. __mmap_switched 레이블부터 MMU가 활성화된 상태에서 실행되고 절대 주소를 사용한다. data segment를 복사하고 BSS를 0으로 초기화하고 프로세서 ID, 머신 정보와 제어 레지스터 값을 저장한다.

그리고 start_kernel() 함수를 호출한다. (start_kernel() 함수부터 C코드로 작성되어 있다.)


1. MMU 비활성화 일때 가상 주소를 물리 주소로 변경하기

__enable_mmu 레이블에서 MMU를 활성화하기 전에는 가상 주소를 통해 메모리 접근이 안된다.

__lookup_processor_type 레이블에서 프로세서 정보를 찾으려면 가상 주소 __proc_info_begin과 __proc_info_end  정보르 읽어 물리 주소로 변경해야 __proc_info 리스트들의 정보를 저장한 영역에 접근할 수 있다.

코드 예는 아래 arch/arm/head-common.S 파일에서 찾을 수 있다. 

__lookup_processor_type: adr r3, 3f ldmda r3, {r5 - r7} sub r3, r3, r7 @ get offset between virt&phys add r5, r5, r3 @ convert virt addresses to add r6, r6, r3 @ physical address space ... .long __proc_info_begin @ 가상 주소 .long __proc_info_end @ 가상 주소 3: .long . @ 가상 주소

레이블 3은 물리 주소이고 [adr r3 3f] 명령으로 r3레지스터 값에 저장된다.

레이블 3의 위치 카운터(.)값이 저장된 r7 레지스터 값은 가상 주소이다.

따라서 두 주소의 차이가 가상 주소와 물리 주소의 오프셋이고 [sub     r3, r3, r7] 명령으로 구할 수 있다.

[add r5, r5, r3] 명령으로 __proc_info_begin의 가상 주소에 오프셋을 더하여  __proc_info_begin의 물리 주소를 구할 수 있다.


2. 가상 메모리와 물리 메모리

32비트 ARM 프로세서가 직접 액세스할 수 있는 최대 물리 메모리는 4GB가 된다. (232=4G)

ARM 프로세서는 멀티 프로세스를 지원하므로 각각의 프로세스는 최대 4GB의 가상 메모리를 가진다.

때문에 가상 주소를 물리 주소로 변환할 페이지 테이블이 필요하다.

__create_page_tables 레이블에서 이런 페이지 테이블을 초기화하고 각 엔트리에 대한 물리 주소와 가상 주소를 설정한다.



반응형
Comments