리눅스 커널에 대한 나의 경험을 책으로 펴 내리라고 처음 결정했을 때 솔직히 어떻게 해야 할지를 몰랐다. 무엇이 내 책을 이 분야의 가장 좋은 책으로 만들어줄 것인가? 나는 어떻게 하면 이 책이 특별한 책이 될 수 있을까에 대해 고심했다.
결국 커널에 대해 아주 특별한 접근 방법을 생각해 낼 수 있었다. 내 일은 커널을 해킹하는 것이다. 내 취미도 커널을 해킹하는 것이다. 내가 사랑하는 것도 커널을 해킹하는 것이다. 수년간 이렇게 지내오면서, 나는 재미있는 일화와 중요한 기법들을 모아 두었다. 내 경험을 통해 나는 어떻게 커널을 해킹하는지(그리고 그에 못지 않게 중요한) 어떻게 해야 커널을 망가뜨리지 않을지에 대한 책을 펴낼 수 있었다. 이 책의 주요 주제는 물론 리눅스 커널의 설계와 구현이다. 하지만 다른 책들과 달리 이 책은 실제 일에 도움이 되는, 그리고 일을 올바르게 할 수 있는 방법을 배우는 데 중점을 두고 있다. 나는 실용 엔지니어이고 이 책 또한 실용 서적이다. 이 책은 재미있고 읽기 쉬우며 유용할 것이다.
나는 독자가 이 책을 통해 (기록된 또한 기록되지 않은) 리눅스 커널의 규칙을 잘 이해하게 되기를 바란다. 그리고 여러분이 이 책과 커널 소스를 읽은 다음 유용하고, 제대로 동작하며, 깔끔하게 구현된 커널 소스를 작성할 수 있기를 기대한다. 물론 재미 삼아 읽는 것도 좋다.
여기까지는 1판에 대한 이야기였다. 시간이 흘렀고, 다시 한번 도전의 시간이 돌아왔다. 이번 개정 3판은 1판과 2판에 비해 많은 것이 바뀌었다. 많은 부분이 개선되고 수정되었으며, 새로운 내용도 많이 추가되었다. 이번 판은 2판 이후 커널 변화를 반영했다. 중요한 사실은 리눅스 커널 공동체가 2.7 커널 개발을 빠른 시일 내에 진행하지 않을 것임을 선언한 것이다. 대신 커널 개발자들은 2.6 커널 개발 및 안정화 작업을 계속하기로 했다. 이 결정은 많은 것을 시사하는데, 그 중 이 책과 관련해 중요한 부분은 바로 최근에 나와 있는 2.6 커널에 대한 책이 한동안 계속 그 유용함을 유지할 수 있다는 것이다. 리눅스 커널이 성숙단계에 접어듦에 따라,
앞으로도 존속할 커널의 내용에 대해 공부하는 것은 더욱 의미 있는 일이 되었다. 이 책은 리눅스 커널의 역사를 이해함과 동시에 미래를 준비하는 관점에서 커널에 대해 서술함으로써 리눅스 커널에 대한 교과서적인 책이 되기를 기대한다.---저자 서문 중에서
잡지 부록으로 딸려온 알짜 리눅스 배포본을 가지고 사용하던 PC에 리눅스를 처음 설치해 본 때가 아련히 떠오릅니다. 그 후 제법 많은 시간이 흘렀습니다. 그 사이 리눅스는 수많은 개발자들의 자발적인 노력을 통해 진화를 거듭해 그 영역을 넓혀 왔습니다. 대부분의 인터넷 서비스가 리눅스 서버로 운영되고 있으며, 슈퍼 컴퓨터에서 손 안의 스마트폰까지 컴퓨터가 관련된 곳에서 리눅스가 쓰이지 않는 분야를 찾기가 더 어렵습니다. 제가 그 동안 해온 일들도 리눅스를 떼어 놓고는 생각할 수 없습니다.
2011년 7월, 리눅스의 창시자인 리누스 토발즈는 리눅스 출시 20주년을 기념해 리눅스의 버전 3.0을 선언합니다. 특별히 주목할 만한 큰 변경 사항이 없었음에도 주 버전을 바꾼 이유에 대해 리누스는 버전 숫자가 너무 커져서(2.6 버전은 2.6.39까지 있습니다.) 불편해서라고 밝히기도 했습니다. 그도 틀린 말은 아니었겠지만, 한편으로는 2.6 버전의 안정적인 집권이 장기간 이어짐에 따라, 이제는 리눅스 커널 완성도에 대한 자신감의 표현으로 보는 것도 타당할 것입니다. 아직 현장에서는 2.6버전을 사용한 리눅스 배포판이 많이 쓰이고, 지원도 지속되고 있습니다. 그렇기 때문에, 커널 버전 2.6.34를 주 대상으로 삼은 이 책의 내용은 3.0 버전으로 바뀐 이 시점에도 그대로 유효합니다. 저자의 말마따나 성숙 단계에 접어듦에 따라 변경의 가능성은 점점 적어지므로, 현 상태에서 얻는 지식의 유효 기간도 길어지고 있는 것입니다.
이 책은 코드를 무작정 늘어 놓고 구구절절 내용을 설명하는 책이 아닙니다. 세부 코드에 대한 내용은 과감히 생략하고, 더욱 중요한 커널의 설계 방향과 의도를 설명하는 데 집중합니다. 이 때문에 커널이나 어셈블러에 대한 경험이 없는 개발자도 쉽게 내용을 따라갈 수 있습니다. 그렇다고 해서 대충 겉핥기로 넘어가지도 않습니다. 커널 동작을 이해하는 데 꼭 필요한 부분은 부족하지 않을 정도로 충분히 설명합니다. 세부적인 내용은 말로 설명하기 보다는 코드를 읽어 보고 스스로 코드를 작성해 보는 것이 더 효과적인 것이 사실입니다. 제한된 지면하에서 리눅스 커널의 핵심 내용을 효율적으로 전달하는 훌륭한 구성입니다.
이 책은 꼭 리눅스 커널 개발자에게만 유용한 것은 아닙니다. 리눅스 커널은 대부분 C로 작성되어 있습니다. C++, 오브젝티브C, 자바 등의 객체지향 언어가 주류를 이루는 요즘, C로 작성된 커널은 거리감을 더하는 것이 사실입니다. 하지만, 리눅스 커널에는 컴퓨터의 등장과 함께한 운영체제의 역사가 녹아 들어 있습니다. 운영 체제에서 사용하는 알고리즘, 인터페이스 설계 등은 프로그램 작성 과정에서 마주치는 많은 문제에 대한 지금까지의 고민 결과를 담고 있습니다. 문제를 해결한다는 본질에 있어서 사용하는 언어는 수단에 불과합니다. 일부 리눅스 서브 시스템은 C언어 하에서도 객체 지향 프로그래밍이 가능하다는 것을 보여주기도 합니다. 커널 개발을 하지 않는다 하더라도 커널이 문제를 해결하는 방식을 살펴보는 것은 일반적인 개발 업무에도 큰 도움이 되리라 믿습니다. 특히 커널과 비슷한 고민을 하는 프로그램을 작성하거나 이미 C로 구현된 기존 프로젝트를 손질하는 경우라면 커널에서 의외의 힌트를 얻을 수도 있습니다.
객관적으로 보면 우리나라는 IT 분야의 선진국임에 분명합니다. 인구 5천만에 불과한 나라에서 세계 최고 수준의 하드웨어를 생산하고, 세계 최고 수준의 통신 인프라를 갖췄으며, 세계적인 수준의 서비스를 개발, 운영하고 있습니다. 이 같은 현실이 만들어진 데에는 여러 유능한 개발자와 리눅스 같은 오픈 소스 제품들이 큰 역할을 했을 것입니다. 하지만 사람들의 관심사가 쉽게 결과를 얻는 쪽으로만 편중된다는 점과 그 과정에서 얻어진 오픈 소스 관련 지식이 공유되지 못하고 파편화된다는 점이 아쉬움으로 남습니다. 지금도 커널 코드를 붙들고 씨름하고 있는 분들이 물론 적지 않겠지만, 실제로는 당장의 돈벌이에 도움이 되기 힘든 커널에 관심을 가진 사람이 많지 않은 것이 현실입니다. 커널이라는 분야는 어찌보면 전산학에 있어서 기초과학으로 비유할 수 있을 것 같습니다. 탄탄한 기초과학 발전이 산업혁명을 가능케 했듯이, 많은 분이 커널 개발에 참여함으로서 또 다른 발전을 이끌어 나갈 수도 있지 않을까 생각해 봅니다. 이 책을 통해 리눅스 커널에 대한 이해를 높이고 커널 개발에 참여하는 개척자 분들이 많이 나오길 기대합니다.
---옮긴이의 말 중에서