|
ncloader
0.1
|
어떻게 만들 수 있을까? 더 자세히 ...
Development에 대한 협력 다이어그램:모듈 | |
| Stage 1 Boot Loader | |
| 최초의 프로그램 | |
| Stage 2 Boot Loader | |
| 시스템을 초기화 하고 커널을 로딩한다. | |
| C Library | |
| 가장 기본적으로 사용되는 C Library 인터페이스를 정의한다. | |
어떻게 만들 수 있을까?
앞으로 필자가 막무가내로 써대는 용어들에 대해 이해를 돕기 위해 간략히 정리한 테이블을 제일 먼저 보여주려고 한다. 살짝 훑어 보고 뒷 이야기를 계속 따라가 주기 바란다.
| 용어 | 의미 |
|---|---|
| Stage 1 Boot Loader | Disk 의 부트 섹터에 저장되는 512 Bytes 크기의 Boot Loader |
| Stage 2 Boot Loader | Stage 1 에서 Memory 의 사용 가능 공간 중 임의의 위치에 로딩되고 실행 될 Boot Loader |
| Chain Loading | Boot Loader 가 또 다른 Boot Loader 를 Loading 하는 방식을 일컫는 말 |
| Kernel | 우리가 만들. 이 프로젝트의 목표 |
| ELF | Executable Linkable File Format, Linux 에서 주로 사용되는 실행 파일 포맷 |
| PE/COFF | Portable Executable File Format, Microsoft Windows 에서 주로 사용되는 실행 파일 포맷 |
부트로더란 우리가 개발하게 될 OS를 CPU 가 실행할 수 있도록 설정해주는 역할을 하는 것이다. 그렇다면, 부트로더 올릴 위치에 커널을 올려서 바로 실행시켜 버리면 되지 않을까?”, 왜 힘들게 커널을 바로 실행시키지 않고 부트로더라는 이상한 녀석을 만들어야 하는 수고를 해야 하는 걸까?
Q) 부트로더는 무엇인가? A) CPU 가 커널 코드를 실행할 수 있도록 메모리의 특정 위치에 올려주고 제반 환경을 준비해주는 역할을 한다.
Q) 부트로더가 올라갈 위치에 커널을 바로 올리면 안되는가? A) 일반적으로 x86 PC 의 경우 BIOS 에서 부팅 가능한 디스크의 첫 번째 섹터 한개를 읽어 메모리의 지정된 위치로 복사한 후 해당 위치로 CPU 의 실행 위치를 옮기고 있다. 512 바이트 크기의 커널을 만드는 것이 아니라면, 커널을 원하는 위치에 모두 올리는 것은 불가능하다.
아무래도 우리가 만드는 OS 는 512 Bytes 안에 모든 것을 구현한다는 것은 불가능한 것이므로, 부트로더가 필요하다. 부트로더는 일반적으로 다음과 같은 종류로 분류 할 수 있다.
| 1 stage loader |
| 2 stages loader |
1 stage loader 는 512 bytes 범위 안에서 부트로더를 구현하고 모든 처리를 한 후 커널을 로딩하는 것이다. 필자가 처음 만들었던 부트로더가 이 형식에 속했던 것으로, FAT12 filesystem 을 위한 BPB 정보를 포함하고 있었으며, FAT12 파일 시스템의 Root directoy 에서 ncloader.bin 이라는 flat binary 를 메모리의 임의의 위치에 로딩하는 일을 했었다.
2 stage loader 는 512 bytes 범위 안에 구현된 첫번째 로더가 임의의 위치에 저장된 두번째 로더를 메모리의 특정 위치에 로딩을 하고, 그 위치에서 나머지 작업을 진행한 후, 커널을 로딩하는 역할을 하는 것이다. 그러므로 좀 더 융통성있는 기능들을 구현할 수 있으며, 커널을 위한 준비도 많은 것을 해 줄 수 있다.
이외에 자주 사용되는 용어로 Chain loading 이라는 것이 있는데, 이것은 하나의 부트로더가 다른 부트로더를 로딩해주는 것을 의미한다. 다른 부트로더를 로딩해주기 위해서 자신의 위치를 메모리의 임의의 위치로 이동을 한 후 대상 부트로더를 0x7c00 에 로딩한 후 그 위치로 점프하는 일련의 과정을 포함한다.