리눅스커널(Linux Kernel) 코드 분석을 시작하며

나는 이번 포스팅을 기점으로 하여 앞으로 ARM Linux Kernel 의 Build 과정부터 Booting 과정을 거쳐 우리에게 Shell Prompt 를 보여주기까지의 길고 긴 Kernel 의 분석과정을 상세히 기술해볼 것이다.
사실 Operation System 의 실제적인 동작은 그 이후부터라고 할 수 있겠으나, 그 이후의 동작은 Booting 과정부터 준비작업까지 Kernel 이 하는 일을 바탕으로 이루어진다고 볼 수 있다. 대부분의 커널지식은 초기 과정에서 이미 대부분 필요하다.

즉, Booting 과 준비과정에 대한 코드를 모두 이해하고 있다면 OS 개발자로서의 기본 기술은 축적한 셈이라고 봐도 될 것이다.
이 준비과정까지 코드레벨로 Kernel 을 철저히 분석하는데 보통 2 년 가까운 시간이 소요된다.
(물론 시간투자를 어느 정도 하느냐에 달려있다.)

이 포스팅은 나의 첫 Linux Kernel 코드에 대한 도전기이며 모험을 기록한 흔적이 될 것이다.
그 과정은 아마도 누구보다 내 자신에게 가장 큰 성장을 가져다주지 않을까 생각한다.

워낙 내용이 방대하기 때문에 코드 분석의 전 과정을 다 기록하지는 못하겠지만, 중요한 분석내용들을 많이 다룰 수 있도록 노력하겠다.

커널 코드 분석은 다음과 같은 순서로 진행한다. (bootloader 코드는 생략)

(1) KERNEL_ROOT/arch/arm/boot/compressed/head.S
(2) KERNEL_ROOT/arch/arm/kernel/head.S
(3) KERNEL_ROOT/init/main.c 의 start_kernel

위에서는 분석의 시작시점이 되는 파일만을 기록한 것이다. 해당 파일의 내용을 분석하다보면 이 파일 저 파일 많이 왔다갔다 하게 될 것이다. 하지만, 주요한 줄기는 위의 파일들 내에 있다.

(1)은 bootloader 에 의해 커널이미지(실제 커널이미지를 내부에 가지고 있는 로드용 이미지)가 물리메모리에 로드된 후 압축을 해제하기 위한 코드이다.
(2)는 압축이 해제된 원래의 커널이미지의 시작지점이다. 여기에서 mmu 나 page table 관련 필수 초기화 작업을 수행한 후 main.c 의 start_kernel 로 pc 를 이동하게 된다.
(3)파일이 실제로 kernel 의 모든 준비과정을 담고 있다. start_kernel 함수를 보면 수십여개의 함수 호출만으로 이루어져 있는데, 그 하나하나의 함수가 실로 방대한 내용들을 담고 있다. 이 부분에서 70~80 % 의 분석 시간을 사용하게 될 것이다.

You may also like...

0 0 votes
Article Rating
Subscribe
Notify of
guest
0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x