1.1          리눅스 x86 부팅 과정

시스템에 전원이 들어와서 새롭게 시작되는 것을 부팅(booting)이라고 하며, 이 과정을 부트스트랩(bootstrap)이라고 한다. 이는 운영체제의 최소부분을 주 메모리 공간에 로드하여 프로세서(CPU)가 이를 실행할 수 있도록 하는 것을 의미한다.

 

이러한 부트스트랩 코드는 어셈블러로 작성되어 있으며, (1)커널 자료구조 초기화, (2)스택/레지스터 초기화를 하고 C코드(start_kernel)함수가 실행할 수 있도록 만들어 준다.

 

커널 부팅 과정은 크게 3가지로 1단계: BIOS 동작, 2단계:부트로드 실행, 3단계:리눅스커널 부팅 로 이루어져 있다.

 

o  1단계: BIOS 동작

1.     컴퓨터 하드웨어에 대한 테스트를 수행한다(POST)

2.     하드웨어 장치를 초기화한다. (각각 하드웨어의 IRQ가 충돌하지 않도록 한다)

3.     각각의 디스크들에서 부팅할 운영체제를 찾는다. (디스크의 첫번째 섹터에 접근)

4.     부팅할 운영체제를 찾으면 장치의 첫번째 섹터의 내용을 읽어서 물리주소 0x0007c00으로 복사하고 그 주소로 점프하여 방금전에 읽어들인 코드를 수행한다.

 

 

o  2단계: 부트로드 실행

부트로더는 운영체제를 메모리에 올려서 실행할 수 있도록 해주는 프로그램이다. LILO, GRUB등이 이에 해당하는 프로그램이다.

하드디스크의 첫번째 섹터는 “마스트 부트 레코드(MBR)”이라고 불리우는 레코드 파티션 테이블과 시작할 운영체제가 들어가 있는 파트션의 첫번째 섹터를 읽어들이는 작은 프로그램이 있다.

 

o  3단계 리눅스 커널 부팅

리눅스 커널을 부팅하기 위해서는 크게 3개의 어셈블러가 동작한다.

(1). bootsect.S : 커널이 부팅이 되면 bootsect.S 에서 바이오스에서 0x7C00으로 로드된 커널을 0x90000으로 복사한다. 부팅과 관련된 기본적인 디스크정보 및 파라메터 정보를 살펴보고, setup.S를 호출한다.

(2). setup.S : 시스템에서 사용할 data를 BIOS로부터 읽어와서 system 메모리에 저장한다.

(3). head.S : 압축된 커널의 압축을 해제하고 커널을 실행하는 start_kernel()을 호출한다.

+ Recent posts