1.1. lilo 로부터 커널 이미지 vmlinuz 의 로딩

우리의 PC 의 전원을 켜면 PC 는 BIOS 에 저장되어 있는 초기화 프로그램을 실행합니다. 초기화 프로그램에 의해 메모리 체크 등이 수행되고 필요한 초기화가 완료되고 나면, 하드 디스크 혹은 다른 부팅 매체 (플로피 디스크나 CDROM 등)의 0 번 섹터의 부트 프로그램을 읽습니다. 보통, 0번 섹터를 MBR (Master Boot Record, 하드디스크의 경우. 플로피디스크의 경우는 부트섹터라고 합니다.) 이라고 합니다. 여기는 리눅스를 위한 lilo 나 grub 등이 들어 있을 수도 있고, NT 나 OS/2 등 다른 운영체제의 부트 로더가 들어 있을 수도 있습니다. lilo 가 MBR 에 있다고 가정하고 계속 진행하겠습니다. lilo 는 커널을 실행하기 위해서 사용자의 입력을 기다립니다. 여러분이 컴퓨터를 켰을때 나오는

	lilo:

라는 프롬프트가 그것입니다. 이때 우리는 lilo 라는 프롬프트 뒤에 커널에 주고싶은 옵션이나, 부팅하고자 하는 커널의 이미지를 지정해 줄 수 있습니다. 이에 관한 자세한 내용은 lilo HOWTO 문서를 참조하십시오.

이제, 사용자는 lilo 에 실행시키기를 원하는 커널의 이미지를 커널에 넘겨주고자 하는 옵션값과 함께 알려줍니다. 그리고, lilo 는 해당하는 커널의 이미지를 로딩해서 실행하게 됩니다. 기본 설정으로는 /vmlinuz 또는 /boot/vmlinuz 이미지가 메모리에 로드되고, 실행을 시작합니다.

vmlinuz 는 리눅스 커널의 압축 이미지입니다. 여기서 swapper 라고도 불리우는 프로세스 id 0 인 프로세스가 실행됩니다. 이 프로세스는 운영체제 그 자체라고도 할 수 있는 프로세스로써, 메모리 관리, 디스크 관리, 프로세스 관리 등을 수행합니다. 이 프로세스는 프로세스 id 1 인 init 라는 프로세스를 실행시키고는 본연의 기능인 swapper 로써의 기능을 수행하기 시작합니다. [1]

주석

[1]

The design of the UNIX Operating System 에 의하면, 이 설명이 맞습니다. 그러나, 리눅스 시스템에서 프로세스 id 0 인 프로세스와 id 1 인 프로세스의 역할은 좀 다릅니다. 물론, 역사적인 이유로 0번 프로세스가 swapper 라고 불리우기는 하지만, 리눅스에서는 0 번 프로세스는 아무것도 하지 않는, idle 프로세스입니다. 즉, cpu 가 할 일이 없을 때 실행되는 프로세스입니다. 그래서 ps aux 를 해 보아도 PID 0 인 프로세스는 없습니다. 단, 모든 프로세스들의 '조상' 임에는 틀림없죠.

ps aux 를 실행했을 때, 나오는 [kswapd], [bdflush] 등의 프로세스들은 커널 스레드(kernel thread) 라고 부르는 것들입니다. 자세한 내용은 이 문서의 성격에 맞지 않으므로 생략하겠습니다. 그런데, ps aux 를 실행했을 때, 1 번 프로세스는 [init] 라고 나오지 않고 그냥 init 라고 나오죠? (커널 2.4.4 기준) 그 이유는, 1번 커널 스레드인 (편의상 init 프로세스라고 부릅니다.) init 프로세스가 자신의 할 일을 마치고, /sbin/init 프로그램으로 자신을 대체해 버리기 때문입니다. 내용이 본문의 취지에서 너무 벗어난거 같네요 :-) 이만 줄이겠습니다.