다음 이전 차례

3. 스위치를 켰을 때 컴퓨터에는 어떤 일이 일어나는가?

실행되는 프로그램이 없는 컴퓨터는 단지 둔한 전자제품 덩어리에 불과하다. 컴퓨터의 스위치가 켜졌을 때 제일 먼저 해야 할 일은 운영체계라 불리우는 특별한 프로그램을 실행시키는 것이다. 운영체계가 하는 일은 복잡한 하드웨어의 제어권을 가지고 다른 프로그램들이 동작하는 것을 돕는 것이다.

운영체계를 불러오는 작업을 부팅이라 한다. (원래 bootstrapping이란 말에서 유래된 것이고 다른 도움 없이 스스로 어떤 상황을 발전시켜 나아가는 것에 대한 어려움을 나타낸다고 한다.) 컴퓨터는 우선 어떻게 부팅이 되어야 하는지를 알아야 하는데, 이것은 바이오스(BIOS: Basic Input/Output System)라는 칩 안에 그 내용이 담아놓았기 때문에 그곳을 참고하면 알 수 있다.

BIOS 칩은 가장 낮은 숫자를 가진 하드 디스크(부트 디스크)의 고정된 위치를 찾아서 Boot loader라는 특별한 프로그램을 실행시키려고 한다. (리눅스에서는 boot loader를 LILO라 한다). Boot loader가 찾아지면 이 프로그램이 core로 옮겨와 실행되게 되는데, boot loader는 실제 운영 체계를 실행시키는 일을 한다.

Boot loader는 우선 커널을 찾고, 이를 core에 위치시킨 후 실행시킨다. 당신이 리눅스로 부팅하면서 LILO 프롬프트를 화면에서 본 후 여러 개의 점이 화면에 찍히는 것을 본적이 있을 텐데, 이것이 커널을 실행시키는(loading하는) 과정을 나타낸다. (각각의 점은 커널 코드의 서로 다른 디스크 블록을 불러오고 있다는 것을 의미한다.)

(왜 BIOS가 직접 커널을 불러오지 못하는지 궁금해 할지도 모르겠다. -- 왜 boot loader와 함께 두 단계의 과정이 필요한 것일까? 우선 BIOS는 그렇게 똑똑하지 못하다. 사실 이것은 매우 멍청하기 때문에, 리눅스는 부팅이 끝나면 이것을 전혀 사용할 수 없게 된다. 이것은 아주 작은 디스크를 가진 원시적인 8비트 컴퓨터를 위해 만들어졌기 때문에 커널을 직접 불러오기에 충분할 정도로 디스크 접근(access)이 힘들다. Boot loader가 작동하는 단계에서는 또한 당신이 서로 다른 디스크 공간에 존재하는 여러 가지 다른 운영체계를 선택적으로 실행시킬 수 있게 해주는데, 유닉스 운영 체계가 충분히 만족스럽지 못하여 다른 운영 체계를 사용하고자 할때 -사실 그런일은 거의 일어나지 않는다.- 사용될 수 있다.)

커널이 시작되면 이것은 다른 하드웨어들을 살피면서 프로그램들을 실행시킬 준비를 한다. 이 작업은 일상적인 메모리 공간에서 이루어지지 않고, I/O 포트 (명령을 받기 위한 디바이스 콘트롤러 카드의 특별한 버스 주소) 에서 이루어진다. 커널은 임의로 메모리 공간을 구성하는 것이 아니다; 커널은 어디에서 어떤 정보를 찾을 수 있는지, 콘트롤러가 존재할 때 어떻게 반응하는지 등에 대한 많은 사전 지식을 갖고 있다. 이런 프로세스를 autoprobing이라 한다.

부팅이 이루어질 때 보이는 메시지는 대부분이 커널이 하드웨어를 I/O 포트를 통해서 자동검색(autoprobing)을 하는 과정을 보여준다. 이 과정에서 어떤 것이 현재 사용 가능 하며 어떤 것이 적용되는지를 알 수 있다. 리눅스는 이 과정에 있어서 매우 좋은 성능을 가지고 있는데, 대부분의 다른 유닉스보다는 물론이고 도스나 윈도에 비해서도 아주 뛰어난 성능을 자랑한다. 사실 리눅스를 오래전부터 사용해오던 사람들 상당수는 부팅시 이루어지는 스마트한 검색(이것은 시스템의 인스톨을 보다 쉽게 만들기도 한다)이, 비판적인 생각을 가지고 있는 많은 사용자들에게 자유로운 유닉스 계열의 시스템이 매력적일 수 있었던 이유 가운데 하나라고 생각했다.

하지만, 커널이 모두 탑재되고 실행되었다고 해서 부트 프로세스가 모두 끝난 것은 아니다; 이것은 단지 첫단계일 뿐이다.(그래서 이 단계를 run level 1이라 한다).

커널의 다음 단계는 디스크가 정상인지를 확인하는 것이다. 디스크 파일 시스템은 매우 깨지기 쉬운 것이다; 만일 하드웨어적인 문제나 급작스런 정전 등에 의해 디스크가 손상되었다면, 유닉스 시스템은 정상적인 실행 전에 그것을 확인하고 복구하는 단계가 필요하게 된다. 이 부분에 대한 내용은 후에 파일 시스템은 어떻게 고장나는가 부분에서 더 이야기할 것이다.

커널이 다음에 하는 일은 몇개의 데몬을 실행시키는 것이다. 데몬이란 프린트 스풀러, 메일 감시자(mail listener)나 웹서버와 같은 프로그램을 말하는데, 이들은 백그라운드에 숨어서 무언가 하기를 기다리고 있는다. 이 특별한 프로그램들은 충돌을 일으킬 수 있는 요청들을 조정하는 역할도 한다. 보통 항상 실행되면서 모든 요청들을 알고 있어야 하는 프로그램을 짜는 것이 수많은 복사본의 프로그램(동시에 실행되면서 각각이 하나씩의 요청을 처리하는)이 서로 충돌하지 않는 것을 확인하려고 하는 것보다 쉽기 때문에 데몬 프로그램들이 존재하게 된다. 시스템이 시작할 때 실행되는 데몬의 집합은 변할 수 있지만, 프린트 스풀러(프린터에 대한 수문장과 같은 데몬)같은 것은 대부분의 경우 포함된다.

모든 데몬들이 시작하게 되면 시스템은 run level 2에 접어들게 된다. 다음 단계는 사용자를 위한 준비이다. 커널은 getty라는 프로그램을 복사하여 콘솔을 지켜본다 (전화로 접속하는 직렬포트를 같이 지켜보기 위해서는 더 많은 복사본이 필요할 것이다). 이것이 login프롬프트가 콘솔에 생기게 하면, 이제 시스템은 run level 3에 접어들고 사용자를 받아들이고 프로그램을 실행시키기 위한 준비를 한다.

이름과 비밀번호를 넣고 로그인을 할 때, 당신은 스스로를 getty와 컴퓨터에 확인시킨다. 그리고는 (당연히) login이라는 프로그램을 실행시키는데, 이것은 보안에 관련된 몇가지 기능을 수행하고 명령어 번역기인 을 가동시킨다. (물론, gettylogin은 하나의 프로그램으로 존재할 수 있다. 이들 프로그램이 분리된 데에는 역사적인 원인이 있는데, 이곳에서 다룰 필요는 없다고 생각된다.)

다음 장에서는 셀에서 프로그램을 실행시킬 때 어떤 일이 일어나는지에 대해서 이야기할 것이다.


다음 이전 차례