부팅: 전원 한 번에, 배운 모든 것이 무대에 오르는 순간
방금 끈 컴퓨터는 캄캄해요. 화면도 꺼져 있고, 메모리는 텅 비어 있죠. 그런데 우리는 늘 커널이 모든 걸 관리한다고 배웠잖아요. 프로세스를 띄우고, 메모리에 벽을 세우고, 시스템 콜을 받아 준다고요. 그 커널은 지금 어디 있을까요? 전원이 꺼져 있으니 메모리에는 아무것도 없어요. 그럼 전원 버튼을 누르는 그 한 순간에, 텅 빈 컴퓨터가 어떻게 살아 움직이는 컴퓨터로 바뀌는 걸까요?
전원을 누르면: 텅 빈 컴퓨터가 깨어나요
전원이 꺼진 컴퓨터를 떠올려 봐요. 메모리는 깨끗하게 비어 있어요. 우리가 그렇게 배웠던 커널도, 거기서 가지를 뻗던 프로세스들도, 지금은 메모리에 한 줄도 없어요. 전기가 흐르지 않으니 당연하죠. 그런데 전원 버튼을 누르면 이상한 일이 시작돼요. 누군가는 첫걸음을 떼야 하잖아요. 그 첫걸음을 떼는 건 화려한 커널이 아니라, 칩 안에 늘 새겨져 있는 아주 작은 프로그램이에요. 이걸 시동 프로그램, 또는 펌웨어라고 불러요. 펌웨어는 전원이 들어오면 가장 먼저 깨어나도록 처음부터 그 자리에 박혀 있어요.
전원을 눌러 보세요. 메모리는 텅 비어 있다가, 칩 안의 작은 시동 프로그램(펌웨어, 파랑)이 가장 먼저 깨어나요. 커널은 아직 어디에도 없어요.
깨어난 건 작은 펌웨어 하나뿐이에요. 메모리는 여전히 거의 비어 있죠. 펌웨어는 똑똑하지 않아요. 화면을 멋지게 꾸미거나 앱을 띄울 줄도 모르죠. 펌웨어가 아는 건 딱 하나, 진짜 일꾼을 데려오는 법이에요. 그 진짜 일꾼이 바로 커널이고요. 그런데 커널은 지금 메모리에 없어요. 전원이 꺼져 있던 동안 커널은 디스크에 파일로 잠들어 있었거든요. 그럼 펌웨어가 할 일은 분명해요. 디스크로 가서 그 커널을 데려오는 거예요. 다음에서 그 장면을 봅시다.
펌웨어가 디스크에서 커널을 메모리로 올려요
여기서 지난 강의 약속 하나를 떠올려 봐요. 커널은 늘 메모리에 상주하면서 모든 걸 관리한다고 했죠. 그런데 잘 생각해 보면, 늘 상주한다는 커널도 어느 순간엔 처음으로 메모리에 올라와야 하잖아요. 그 순간이 바로 지금이에요. 펌웨어는 디스크에서 커널 파일을 찾아, 한 덩이씩 메모리로 옮겨 와요. 텅 비어 있던 메모리에 드디어 커널이 자리를 잡는 거죠. 우리가 area 내내 모든 일의 주인공으로 불러 온 그 커널이, 부팅의 이 한 장면에서 비로소 무대에 처음 등장하는 거예요.
펌웨어를 눌러 보세요. 디스크에 파일로 잠들어 있던 커널(금색)이 한 덩이씩 메모리로 올라와요. 늘 상주한다던 커널이, 바로 지금 처음 자리를 잡아요.
커널이 메모리에 다 올라오자, 펌웨어는 조용히 임무를 넘겨요. 작은 시동 프로그램의 역할은 딱 여기까지예요. 진짜 일꾼을 깨워서 자리에 앉혔으니, 이제 무대는 커널의 것이죠. 깨어난 커널은 가장 먼저 무엇을 할까요? 커널 혼자서는 우리에게 보이는 일을 하나도 하지 못해요. 화면의 아이콘도, 키보드 입력도, 우리가 여는 앱도, 전부 누군가가 실행되어야 생기는 일이거든요. 그래서 커널이 맨 처음 하는 일은, 첫 번째 프로세스를 낳는 거예요. 다음에서 봅시다.
커널이 첫 프로세스를 낳고, 거기서 가지가 뻗어요
프로세스를 다룬 강을 떠올려 봐요. 프로그램은 디스크에 잠든 파일이고, 그게 실행되어 살아 움직이는 상태가 프로세스라고 했죠. 부팅에서 커널은 바로 그 일을, 가장 처음으로 해내요. 디스크에 잠들어 있던 어떤 프로그램 하나를 골라 실행해서, 이 컴퓨터에서 살아 움직이는 첫 번째 프로세스로 만드는 거예요. 그런데 커널은 모든 앱을 자기가 일일이 띄우지 않아요. 대신 이 첫 프로세스가 또 다른 프로세스를 낳고, 그 자식이 또 자식을 낳으면서, 마치 한 그루 나무처럼 가지를 뻗어 나가요. 우리가 쓰는 수많은 프로그램은 모두 이 첫 프로세스에서 갈라져 나온 가지들이에요.
커널을 눌러 첫 프로세스를 낳아 보세요. 다시 누르면 그 자식 프로세스들이 가지처럼 뻗어 나와요. 커널(금색)에서 첫 프로세스로, 첫 프로세스에서 여러 프로세스로(초록).
한 번의 누름으로 첫 프로세스가 생기고, 또 한 번에 그 아래로 자식들이 주르륵 뻗어 나왔죠. 이게 우리가 매일 보는 그 화면의 출발점이에요. 바탕화면을 그리는 프로그램도, 시계도, 알림도, 전부 이 가지들 어딘가에 있는 프로세스예요. 그리고 이 프로세스들은 각자 자기 메모리 공간을 가지고, 무언가 필요할 때마다 커널에게 시스템 콜로 부탁해요. area에서 따로따로 배운 조각들이, 부팅이라는 한 장면 안에서 착착 제자리를 찾아 들어가고 있죠. 이제 그 조각들을 한 그림에 층층이 쌓아 봅시다.
층층이 쌓여 완성돼요 (하드웨어에서 앱까지)
이제 전체를 한 그림으로 봐요. 맨 아래에는 하드웨어가 있어요. 디스크, 메모리, 화면, 키보드 같은 실제 부품들이죠. 그 위에 작은 펌웨어가 깨어나 첫걸음을 떼고, 그 펌웨어가 커널을 올려요. 커널은 하드웨어 바로 위에 앉아, 모든 부품과 직접 이야기하면서 메모리에 벽을 세우고 일정을 관리하죠. 커널 위에는 첫 프로세스가, 그 위로 우리가 쓰는 앱들이 차례로 쌓여요. 아래층이 든든히 받쳐 줘야 위층이 설 수 있어요. 하드웨어 없이는 펌웨어가, 펌웨어 없이는 커널이, 커널 없이는 프로세스가, 프로세스 없이는 앱이 설 수 없거든요.
아래부터 한 층씩 눌러 점등해 보세요. 하드웨어, 펌웨어, 커널, 첫 프로세스, 앱 순서로 쌓여요. 아래층이 먼저 서야 위층을 올릴 수 있어요.
맨 위 앱까지 불이 들어오면, 비로소 우리가 보는 그 화면이 완성돼요. 캄캄하던 컴퓨터가 이제 살아 움직이는 거죠. 재미있는 건, 이 탑이 완성된 뒤에는 펌웨어가 한 일이 거의 잊힌다는 거예요. 우리는 앱을 쓰면서 그 아래에 커널이, 또 그 아래에 펌웨어와 하드웨어가 받치고 있다는 걸 거의 의식하지 않잖아요. 하지만 그 모든 층은 부팅이라는 한 순간에 아래에서부터 차곡차곡 세워진 거예요. 이제 마지막으로, 전원 한 번에 이 모든 게 어떻게 한 줄로 이어지는지 처음부터 끝까지 따라가 봅시다.
전원 한 번에 이 모든 게: area 한 장으로
전체를 한 줄로 이으면 이래요. 전원을 누른다, 칩 안의 작은 펌웨어가 깨어난다, 펌웨어가 디스크에서 커널을 메모리로 올린다, 커널이 첫 프로세스를 낳고 거기서 앱들이 가지를 뻗는다. 단 몇 초 사이에 벌어지는 이 한 줄 안에, 우리가 area에서 배운 거의 모든 게 들어 있어요. 디스크에 잠든 파일과 메모리, 늘 상주하는 커널, 살아 움직이는 프로세스, 프로세스마다의 메모리 공간, 부품과 이야기하는 드라이버, 누가 무엇을 해도 되는지 정하는 권한, 그리고 프로세스가 커널에게 부탁하는 시스템 콜까지요. 부팅은 이 모든 조각이 처음으로 한자리에, 그것도 정해진 순서대로 등장하는 장면이에요.
단계를 차례로 눌러 부팅 한 바퀴를 따라가 보세요. 전원, 펌웨어 깨어남, 커널 적재, 첫 프로세스, 앱 스택까지. area에서 배운 조각들이 한 줄로 꿰여요.
이제 전원 버튼을 누르는 그 짧은 순간이 전과는 다르게 보일 거예요. 그 안에서는 작은 시동 프로그램이 커널을 깨우고, 커널이 첫 프로세스를 낳고, 그 위로 우리의 앱들이 한 층씩 올라서는 거대한 조립이 벌어지고 있으니까요. 운영체제가 무엇을 하는 살림꾼인지 물으며 이 area를 시작했죠. 부팅은 그 살림꾼이 아침에 일어나, 집안 살림을 처음부터 차근차근 차리는 바로 그 장면이에요. 캄캄한 기계가 우리를 맞이할 준비를 마치는, 매일 조용히 되풀이되는 그 한 순간 말이에요.