ncloader  0.1
 모두 데이타 구조 파일들 함수 변수 타입정의 열거형 타입 열거형 멤버 매크로 그룹들 페이지들
Development

어떻게 만들 수 있을까? 더 자세히 ...

+ Development에 대한 협력 다이어그램:

모듈

 Stage 1 Boot Loader
 최초의 프로그램
 
 Stage 2 Boot Loader
 시스템을 초기화 하고 커널을 로딩한다.
 
 C Library
 가장 기본적으로 사용되는 C Library 인터페이스를 정의한다.
 

상세한 설명

어떻게 만들 수 있을까?

용어의 정의

앞으로 필자가 막무가내로 써대는 용어들에 대해 이해를 돕기 위해 간략히 정리한 테이블을 제일 먼저 보여주려고 한다. 살짝 훑어 보고 뒷 이야기를 계속 따라가 주기 바란다.

용어의미
Stage 1 Boot LoaderDisk 의 부트 섹터에 저장되는 512 Bytes 크기의 Boot Loader
Stage 2 Boot LoaderStage 1 에서 Memory 의 사용 가능 공간 중 임의의 위치에 로딩되고 실행 될 Boot Loader
Chain LoadingBoot Loader 가 또 다른 Boot Loader 를 Loading 하는 방식을 일컫는 말
Kernel우리가 만들. 이 프로젝트의 목표
ELFExecutable Linkable File Format, Linux 에서 주로 사용되는 실행 파일 포맷
PE/COFFPortable Executable File Format, Microsoft Windows 에서 주로 사용되는 실행 파일 포맷

1. 구조

ModuleView-BlockDiagram.png
Module View (Block Diagram)

부트로더란 우리가 개발하게 될 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 에 로딩한 후 그 위치로 점프하는 일련의 과정을 포함한다.