arm/kernel/head.S (1) – Code Flow

arch/arm/boot/compressed/head.S 파일의 경우는 사실 이래저래 복잡해보여도, 핵심 역할은 다음과 같았습니다.

  • 메모리에 올린 zImage 가 위치를 잘못잡았을 경우 이미지의 위치를 재배치한다.
  • zImage 속에 삽입된 원래의 압축된 커널 이미지를 zImage 가 속한 128 M 메모리 경계 시작지점 + TEXT_OFFSET(0x8000) 위치에 압축해제한다.
  • pc 를 압축이 해제된 이미지의 처음으로 변경하여 본격적으로 커널이 시작되도록 한다.

이제는 arch/arm/kernel/head.S 부터 살펴볼 차례입니다. 이 파일이 실제 커널의 시작지점이라고 할 수 있습니다.
head.S 는 몇가지 초기화 작업을 수행하고, 최종적으로는 초기화 작업 후에 init/main.c 의 start_kernel 함수로 실행 위치를 옮기게 되는 중간단계의 역할을 수행하는 파일입니다.

arch/arm/kernel/head.S 의 주요 흐름을 그림으로 그려 보았습니다.

arm_kernel_head.S 파일 Flow.gliffy

앞으로 계속해서 살펴보다보면 알게 되겠지만, 이 부분까지 수행을 하고나면 kernel 의 general 한 코드 영역, 즉 start_kernel 함수로 이동하게 됩니다. 즉, 지금까지는 주로 아키텍쳐 의존적인 코드들을 실행하였기 때문에 arch/arm 디렉토리 내의 파일들을 돌아다녔지만(물론 압축코드같은 것은 general gzip lib 코드를 사용하기도 했다), 이제는 모든 아키텍쳐를 아우르는 KERNEL_ROOT/init 디렉토리의 main.c 파일로 이동하게 되는 것입니다.

main.c 파일의 start_kernel 함수내에서도 다양한 초기화 작업 함수들을 수행하는데, 이러한 초기화 작업들 또한 중간중간에 아키텍쳐 의존적인 것들을 수행할 때가 있기 때문에, 이 때는 다시 arch/arm 아래의 코드들을 분석해야하는 상황들을 만날 것입니다.

커널 코드 분석을 할 때는 항상 tag 를 따라갈 때 현재 보고 있는 내용이 어느 아키텍쳐에 해당되는 것인지 파악해야한다는 것을 명심해야 합니다. 그렇지 않으면, 분석 환경과 맞지 않은 definition 들을 따라가면 틀린 내용을 분석하게 됩니다.

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