일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- 우분투
- python
- 뉴스타파
- 프로야구
- arm
- 타이젠
- 해외직구
- 문파문파
- Linux
- Tizen
- 국정원
- NC 다이노스
- 디자인 패턴
- 손민한
- 인공지능
- 데이터베이스
- 김경문
- 태그를 입력해 주세요.
- 야구
- mysql
- ubuntu
- 애플
- 안드로이드
- 블로그
- ubuntu 12.04
- 리뷰
- 문파문파 공략
- NC다이노스
- 조세피난처
- 단통법
- Today
- Total
꿈꾸는 사람.
[ARM] stext label, start_kernel() 호출. 본문
부트로더에서 커널이 로드되고 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 레이블에서 이런 페이지 테이블을 초기화하고 각 엔트리에 대한 물리 주소와 가상 주소를 설정한다.
'IT > Linux' 카테고리의 다른 글
[우분투] 루트 패스워드 초기화. (8) | 2014.02.11 |
---|---|
[Ubuntu] System settings 재 설치. (0) | 2014.01.28 |
[ubuntu] 우분투 12.04 크롬 브라우저 설치 오류 해결. (2) | 2014.01.21 |
[ubuntu] 우분투 12.04 크롬 브라우저 설치. 삭제. (0) | 2014.01.20 |
[JAVA] ubuntu 12.04에서 jdk1.7.0_45 설치, 삭제. (2) | 2014.01.14 |