IT EXPERT, 리눅스 커널 프로그래밍

http://kangcom.com/common/bookinfo/bookinfo.asp?sku=200612180006

주요 내용은 다음과 같습니다.

1장. 리눅스 커널 프로그래밍 환경 구축
리눅스의 소스 코드를 가져다가 컴파일하는 것부터 시작해서 자신만의 리눅스를 만드는 것은 그리 만만한 일이 아닙니다. 그래서 리눅스를 좀더 쉽게 설치할 수 있도록 만들기 시작한 것이 배포판입니다.
1장에서는 리눅스 배포판에 대해서 살펴보고, 다양한 배포판 중에 한 가지를 선택해서 리눅스를 직접 설치해 봅니다.

2장. 커널 컴파일 및 개발 환경 구축
사 용하기에 편리하도록 만든 배포판이지만, 배포판에 들어있는 커널은 거의 모든 시스템에서 실행되어야 하기 때문에 불필요한 것들을 많이 가지고 있습니다. 그러나 직접 커널을 컴파일하면 자신의 시스템에 필요한 기능들만 설정할 수 있고 비교적 가벼운 커널을 만들 수가 있습니다. 많은 커널 해커들이 커널을 컴파일하는 이유는 최신 버전의 커널을 사용하기 위한 것도 있지만 자신이 직접 수정한 커널을 실행해 보기 위한 것입니다.
2장에서는 커널 컴파일을 해보고, 커널을 분석하는데 도움이 되는 소스 코드 분석 도구들을 살펴봅니다.

3장. 리눅스 시스템 호출
3장부터 실제 리눅스 커널을 살펴봅니다. 리눅스 커널에서 가장 먼저 살펴보는 것은 시스템 호출입니다. 시스템 호출을 위한 기본 지식을 살펴보고, 커널에 시스템 호출을 직접 추가해본 후에는 커널에서의 동작을 살펴보겠습니다.
시 스템 호출과정을 C 언어의 write( ) -> sys_write( )와 같이 이뤄진다고 간단하게 설명할 수도 있지만, 그런 동작의 이면에는 CPU의 기능, 인터럽트 처리, 커널의 역할에 대해 알아야 할 것들이 많습니다. 하드웨어가 어떻게 동작하는지 모르면서 코드만을 따라가는 것은 무의미합니다.

4장. 모듈 프로그래밍
윈 도우는 디바이스 드라이버를 설치하고, 재부팅하는 것만으로 새로운 하드웨어를 설치할 수 있지만, 초기의 리눅스 커널에서는 반드시 커널 설정을 다시 하고, 커널을 다시 컴파일해야 했습니다. 상당히 불편했겠죠? 그래서 모듈이 탄생한 것입니다. 여기서는 모듈에 대해 간단히 살펴보고, 직접 모듈을 만들어보면서 커널 공간에서 어떻게 상호작용할 수 있는지 살펴봅니다. 그리고 재미있는 시스템 호출 래핑에 대해서도 살펴봅니다.

5장. 문자 디바이스 프로그래밍
이 장에서는 디바이스 드라이버에 대해서 살펴봅니다. 리눅스 커널이 다루는 전체 디바이스 종류에 대해 설명하고, 문자 디바이스와 관련된 커널 API들을 살펴봅니다. 그 다음 간단한 문자 디바이스를 작성합니다. 또한, 디바이스 제어에 쓰이는 IOCTL을 이용한 디바이스 드라이버를 작성해 보겠습니다. 마지막으로 문자 디바이스를 활용하는 의미로, 입력 데이터에 대한 MD5 해시를 반환하는 문자 디바이스를 작성해 보겠습니다.

6장. proc 파일시스템
사 용자 영역과 커널 영역은 분리되어 있기 때문에 사용자 응용프로그램에서 커널에 대한 다양한 정보를 얻는 것은 상당히 불편합니다. 시스템 호출을 추가하거나 커널 내부의 정보를 가져오고, 심지어 커널의 내부 변수를 조정해서 커널을 제어하거나 최적화 하기 위해 proc 파일시스템이 등장했습니다.
6장에서는 proc 파일시스템에 대해 살펴보고, 간단한 proc 파일시스템 예제를 통해 관련 커널 함수들의 사용법과 커널 내부의 타이머에 대해 살펴봅니다.

7장. 블록 디바이스 프로그래밍
7 장에서는 블록 디바이스와 관련된 커널의 자료구조를 살펴보고, 블록 디바이스를 효율적으로 사용하기 위해 리눅스 운영체제가 선택한 방법이 무엇인지에 대해 살펴봅니다. 블록 디바이스는 커널 2.4와 2.6에서 많은 변화가 있었으므로, 그 차이점에 대해서도 살펴보고, 간단한 램디스크 예제를 작성합니다.

8장. 메모리 관리
8 장에서는 운영체제의 핵심 기능 중에 하나인 메모리 관리에 대해 살펴봅니다. 메모리 모델과 i386 CPU를 살펴보고, 리눅스의 메모리 관리에 대해 살펴본 후 프로세스의 메모리 정보를 보여주는 프로그램을 제작하면서 리눅스가 실제로 메모리를 어떻게 관리하는지 살펴볼 것입니다. 그리고 디바이스와 메모리가 데이터를 효율적으로 전달하기 위해 사용하는 메모리 매핑(Memory Mapping) 과정에 대해 살펴보고, 이와 관련 예제와 디바이스 드라이버를 작성할 것입니다. 마지막으로는 LRU 정책에 대해 간략하게 살펴봅니다.

9장. 프로세스 관리
9장에서는 프로세스와 관련된 전반적인 내용들을 살펴봅니다. 먼저, 커널에서 프로세스를 관리하기 위해 사용하는 자료구조와 프로세스의 생성, 제거 과정을 살펴볼 것입니다. 그 이후로는 프로세스에게 실행할 시간을 분배하는 스케줄링에 대한 내용을 살펴볼 것입니다.
실습 으로 SJF 스케줄러와 커널 2.6의 O(1) 스케줄러를 커널 2.4에 백포팅하기 위해 커널 2.4와 2.6의 스케줄러와 관련 함수, 자료구조들을 세세하게 살펴볼 것입니다. 기본적인 배경 지식이 없이는 실습의 내용을 이해할 수 없기 때문에 다소 지루한 면이 있더라도 끈기있게 살펴보기 바랍니다.

10장. 파일시스템
파 일시스템은 운영체제에서 저장 장치를 관리하기 위한 핵심 요소입니다. 디스켓이나 CF 메모리 등에 널리 쓰이고 있는 FAT 파일시스템, CD-ROM을 위한 ISO-9660, 리눅스에서 사용하는 EXT2, EXT3, 윈도우에서 사용하는 NTFS 등이 있습니다.
10장에서는 다양한 파일시스템을 지원하기 위해 도입된 가상 파일시스템(Virtual File System)에 대해 살펴보고, 간단한 파일시스템을 구현해 보겠습니다.

11장. 네트워크
이 장에서는 네트워크와 관련된 내용을 살펴봅니다. 네트워크나 네트워크 프로그래밍에 대해 모르는 분들을 위해 네트워크 표준 모델인 OSI 모델과 TCP/IP의 구현, 간단한 네트워크 프로그램을 살펴보면서 기본적인 지식들을 학습합니다. 그런 다음 리눅스 커널에서 네트워크 관련 기능들이 어떻게 동작하는지 살펴보고, 커널을 수정해서 MSN 메신저 차단 기능을 구현해 봅니다. 커널에 포함된 방화벽의 일부인 넷필터(Netfilter)를 살펴보고, 넷필터 API를 이용해서 MSN 메신저 차단 기능을 구현해 봅니다.

부록 A. 레드햇9 설치
이 장에서는 레드햇9 설치 방법을 설명합니다. 리눅스 커널 프로그래밍을 하는 데에는 어떤 배포판을 사용해도 관계가 없지만 실습 환경에서 널리 사용되는 배포판 중에 하나가 레드햇9이므로 이를 위한 VMware 환경 설정과 설치 과정을 설명합니다.

부록 B. 페도라 코어6 설치
레 드햇9 배포판을 끝으로 새롭게 시작된 배포판이 페도라 코어입니다. 레드햇 사의 배포판은 모두 자유 소프트웨어로 누구든지 RHEL 소스 코드를 다운로드 해서 사용할 수 있어서 일부 그룹에서는 RHEL의 소스 코드를 다운로드 해서 레드햇 사의 로고 등을 제거하고, 레드햇 사의 업데이트 서버 대신 자신들의 업데이트 서버를 이용하도록 소스를 수정한 버전을 내놓고 있습니다. 이를 RHEL 클론(clones)이라 부릅니다.
레드햇 사의 RPM 기반 배포판을 사용하고 싶다면 몇 가지 선택지가 있지만, 여기서는 가장 널리 쓰이는 페도라 코어를 설치하겠습니다.

부록 C. 데비안에서 GUI 환경 구축하기
이 책에서는 데비안 리눅스로 커널 프로그래밍 환경을 구축합니다. 최소 설치 버전을 사용해서 커널 개발 환경을 구축하며, GUI 환경도 함께 사용하기를 원하는 사람들을 위해서 GUI 환경을 구축하는 방법에 대해 설명합니다. 데비안 관련 책이 시중에 있다면 소개하지 않아도 되겠지만, 따로 소개된 책을 찾아보기 어려우므로 부록을 통해서나마 간단하게 GUI 환경 구축을 정리합니다.

부록 D. 커널 변경 사항
2.6.14.6 이후에 2.6.19가 개발되는 과정에서 발생한 변경사항을 정리했습니다. 모든 변경사항을 정리한 것은 아니며, 대부분의 내용은 LWN(http://lwn.net)에 소개된 것입니다. LWN은 커널과 관련된 소식을 가장 빠르게 알려주며, 매주 잘 정리된 문서로 제공하기 때문에 커널에 관심이 있다면 꾸준히 살펴보기 바랍니다.

부록 E. 윈도우 디바이스 드라이버
왜 윈도우 디바이스 드라이버를 이야기할까 생각될 수도 있지만, 윈도우의 구현을 보면 리눅스 커널과 마찬가지로 공통점들을 갖고 있습니다. 두 운영체제가 내부적으로 구현한 방법이 다르고, 코드를 작성하는 방법도 다르지만 그 원리는 같습니다.
이 장에서는 간단한 윈도우 디바이스 드라이버를 작성하면서 리눅스 커널과 공통된 운영체제의 원리에 대해 살펴봅니다.

저자는 한동훈씨이고, 이곳에 드나드는 분은 아시겠지만 제가 아는 대단한 엔지니어 중 한명이시죠. 그래서 책의 내용에 대한 신뢰도는 높다고 하겠습니다. 또 Monaca블로그를 통해서도 책에 대해 논의가 가능할 것으로 예상하구요. 한편 이 분은 데비안을 사랑하시는 분인돼 어째서, 어째서, 어째서 레드햇과 페도라의 설치 방법만 다루었는가에 대해서는 의문입니다. (우분투는…? OTL)

늦었지만 저도 한권 주세요;; 열심히 공부하고 홍보하겠습니다!

음, 그리고 홍보한마디도 써야겠군요. 많은 대학에서 운영체제 수업을 하고 있고, 또 많은 학교에서 그 수업의 실습 환경으로 리눅스를 사용합니다. 그러다보면 늘 등장하는 것이 커널의 내부구조 발표나 커널 프로그래밍 숙제입니다. 그런데 의외로 찾아보면 자료가 그리 많지 않습니다. 제가 학부때는 쓸만한게 아마도 2권 정도? 이런 상황에서 쓸만한 한권의 책이 추가된 것을 기쁘게 생각합니다.

Update:
Fedora만 왜 부록에 있는가에 대한 답을 알아왔습니다: “그리고, 1장에서 데비안 설치로 시작해요. 데비안을 사랑하기 때문에. 대신에, 레드햇을 사랑하는 교수님들을 위해 레드햇과 페도라 설치는 부록으로 넣었어요 ^^;;”

결론적으로, 데비안이 있었군요.. 데비안 쓰세요 여러분~!

Similar Posts:

Comments 2