28 lines
1.5 KiB
Markdown
28 lines
1.5 KiB
Markdown
---
|
|
title: 부트로더와 커널 로딩
|
|
date: 2023-11-22T05:35:09.645Z
|
|
slug: bootloader-and-loading-kernel
|
|
---
|
|
부트로더에서 커널 넘어가는 과정을 애매하게 알고 있다 다시 공부했다.
|
|
|
|
부트로더가 하는 일은
|
|
|
|
1. CPU 초기화
|
|
|
|
2. IVT 초기화 (이건 펌웨어 자체에서 초기화되는 거니까 수동으로 할 필요는 없다)
|
|
|
|
3. 하드웨어 초기화 및 커널 위치 찾기 (ROM 인터페이스 초기화 및 FS 인식하는 과정)
|
|
|
|
4. 커널을 메모리에 올리고 커널 Entry로 점프
|
|
|
|
인데, 여기서 부트로더가 커널을 메모리에 올릴때 어디에 어떻게 올리냐가 헷갈렸다.
|
|
|
|
컴파일 된 커널을 보면 relative 주소로 되어 있는데 커널의 .data랑 .bss를 부트로더가 다른 프로세스처럼 알아서 적절한 곳에 두는 걸로 착각했다. 당연히 부트로더 단계에서는 MMU나 페이징이 아직 없고, 커널은 메모리에 매핑이 된게 아니라 고정된 주소에 있어야 한다.
|
|
|
|
커널은 PIC(Position Independant Code)인데, \`.text\`, \`.data\`, \`.bss\`가 정해진 offset 차이로 고정되어 메모리에 올라가기 때문에 dynamic address resolution 없이 base address에 relative한 address로 모든것이 어디있는지 알 수 있다.
|
|
|
|
생각해보면 간단하고 당연한 거였다.
|
|
|
|
|
|
|
|
그리고 외부적인 요소가 없이 프로세스가 context를 계속 잡고 있으면 다시 커널로 돌아올 방법은 없다. timed inturrupt나 watchdog이 필요하다. |