커널 시작 과정
linker와 entry 설정
kernel.ld 파일은 링커 스크립트로 커널 코드를 메모리에 어떻게 배치할지 알려준다.
- kernel.ld 에서는 대상 아키텍쳐 와 Entry point (코드 실행 시작 지점)을 지정한다.
- CPU가 실행하는 첫 번째 코드 블럭은 _entry 로 entry.S에 정의되어있다.
- 이 _entry 섹션의 시작 주소는 0x80000000 다.
주소 0x00000000 ~ 0x80000000 영역은 QEMU/RISC-V 구조 상 디바이스 IO 용 영역으로 사용되고 실제 커널 코드는 0x80000000 부터 시작된다.
커널 코드 블럭 종류
다음과 같은 4가지 세그먼트가 커널에 포함된다.
- text: kernel code
- rodata: 읽기 전용 상수 데이터
- data: 읽기/쓰기 가능한 초기화된 변수들
- bss: 초기화 되지 않는 변수들 (0으로 초기화됨)
멀티 코어(Multi Core) 환경 준비
xv6 멀티 코어 시스템을 지원하며 모든 CPU는 고유한 ID (hartid) 를 가진다. 이 hartid는 control status register (CSR) 를 통해 확인할 수 있다.
각 CPU 의 스택 설정
모든 CPU 는 _entry 코드로부터 시작하며 실행 전 자신만의 스택을 갖도록 설정해야 한다.
#define NCPU 8
최대 8개의 CPU가 있다고 가정하며 총 4096 * NCPU 바이트의 스택 공간을 확보한다.
__attribute__((aligned(16))) char stack[4096 * NCPU];
스택 포인터 계산 방식
References
'System Programming > Kernel' 카테고리의 다른 글
| sanitizer interceptor의 구현 원리 (0) | 2026.01.19 |
|---|