Top

리눅스 커널 심층분석 (개정 2판)

  • 원서명Linux Kernel Development Second Edition (ISBN 9780672327209)
  • 지은이Robert Love
  • 옮긴이이상근, 강호관
  • ISBN : 8989975859
  • 25,000원
  • 2005년 12월 28일 펴냄
  • 페이퍼백 | 432쪽 | 190*255mm
  • 시리즈 : 임베디드 시스템

책 소개

이 책은 커널 코드를 작성하고 개발하는 것뿐만 아니라 운영체제에 대한 폭넓은 이해를 통해 좀더 효율적이고 생산적으로 코딩하고 싶어하는 프로그래머에게 도움이 되도록 리눅스 커널의 디자인과 구현방식에 대해 상세히 설명하고 있다.

이 책에서는 리눅스 커널의 주요 하부시스템과 기능들을 설명하면서 특히 그 설계 및 구현방식과 인터페이스에 대해 언급하고 있다. 따라서 다양한 방면에 관심을 갖고 필요성을 느끼는 독자들에게 모두 좋은 정보를 제공할 것이다.

핵심 커널 개발자이기도 한 이 책의 저자는 2.6 리눅스 커널에 대한 자신의 귀중한 지식과 경험을 독자들과 공유하고자 한다. 이 책에서 다루는 주제에는 프로세스 관리, 스케줄링, 시간 관리 및 타이머, 시스템 콜 인터페이스, 메모리 어드레싱, 메모리 관리, 페이지 캐시, VFS, 커널 동기화, 이식성 이슈, 디버깅 테크닉 등이다. 이 책은 2.6 리눅스 커널에 추가된 흥미로운 기능들, 즉 O(1) 스케줄러나 선점형 커널, 블록 I/O 레이어, I/O 스케줄러에 대해서도 상세히 다루고 있다.


★ 개정2판에서 추가된 내용 ★

• 현재 2.6 리눅스 커널의 주요 하위시스템과 기능들에 대한 최신 내용
• 커널 모듈에 대한 새롭고 상세한 설명
• 가상메모리와 메모리 할당에 대한 더욱 자세한 설명
• 커널 코드 디버깅에 대한 추가 정보
• 커널 동기화와 타이머에 대한 예제
• 커널 패치를 제출하거나 리눅스 커널 커뮤니티를 관리하기 위한 유용한 조언

저자/역자 소개

★ 저자 소개 ★

로버트 러브는 초기 버전부터 지금까지 리눅스를 줄곧 사용해 온 오픈소스 전문가이다. 그는 리눅스 커널과 GNOME 커뮤니티에서 활동 중이며, Novell의 Ximian Desktop Group에서 수석 커널 엔지니어로 일하고 있다.
그가 커널에 공헌한 프로젝트로는 선점형 커널, 프로세스 스케쥴러, 커널 이벤트 레이어, VM 개선, 멀티프로세싱 향상 등이 있다. 또한 그는 schedutils과 GNOME Volume Manager를 만든 주인공이기도 하다. 그는 플로리다 대학에서 컴퓨터과학과 수학 분야에서 학사학위를 받았다.


★ 저자의 말 ★

개정2판은 1판에 비해 상당히 많은 것이 달라졌다. 많은 부분이 개선/수정되거나 업데이트되었고 완전히 새로운 많은 내용이 추가되었다. 이것들은 모두 1판이 나온 이후에 커널에 생긴 변화를 반영하기 위한 것이다. 하지만 더욱 중요한 것은 리눅스 커널 커뮤니티가 가까운 미래에 2.7 개발 커널로 진행하지 않을 것임을 선언한 것이다. 그 대신 커널 개발자들은 2.6 커널을 개발하고 안정화하는 작업을 계속한다는 것이다. 이것은 많은 것을 시사하는데 그 중 이 책과 관련된 중요한 부분은 바로, 최근에 나와 있는 2.6 커널에 대한 책들이 한동안 계속 그 힘을 유지할 것이란 점이다. 움직임이 크지 않다는 것은 미래에도 계속 남아있을 커널의 내용에 대해 공부할 절호의 기회라는 해석도 가능하다. 어떤 책이 될지는 모르지만, 어떤 한 권은 끝까지 남아서 커널에 대한 정석이라 불릴 것이다.


★ 역자 소개 ★

강호관 naremo@empal.com

포항공과대학교 컴퓨터공학과와 동 대학원을 졸업했으며 주로 방화벽 개발을 비롯한 네트워크 보안 제품 관련 개발 업무에 참여해왔다. 주요 관심 분야는 시스템 성능 향상과 관련된 각종 기술들이며, 요즘에는 합리적이고 공평한 개발 일정 관리 방안에 대해 독학하고 있다. 현재는 네트워크 보안 관련 업체에서 방화벽 개발과 OS, 특히 커널과 관련된 업무를 수행하고 있다.


이상근 sanglee77@gmail.com

서울대학교 컴퓨터공학부를 졸업하고 (주)브리지텍에서 ITI 서버 플랫폼과 프로토콜 스택을 개발했으며 (주)넥슨에서 크레이지 아케이드 BnB를 개발했다. 또한 임베디드 리눅스 기반 PDA 개발 프로젝트에 참여했다. 서울대학교 컴퓨터공학부 바이오지능 연구실에서 인공지능 석사 학위를 취득했으며, 현재는 미국 University of Wisconsin-Madison의 Computer Science Department에서 Optimization on Machine Learning and Statistics 분야를 공부 중이다.


★ 역자 서문 ★

1990년대 초반이었다. 학교 기숙사에서 요즘 말로 하면 폐인처럼 살아가던 친구 방을 찾아갔을 때, 그 친구가 재미있는 걸 보여주겠다며 자신의 컴퓨터에 설치된 리눅스를 보여줬다. 하긴, 보여줬다라고 해봐야, 까만 터미널에 커서만 깜빡거리고 있었고, 내가 입력할 수 있는 명령이라야 ls 아니면 vi 정도였다. 재미? 그 때 역자가 그 친구에게 했던 말이 "이게 다냐?"였던 걸 기억해보면, 별 흥미를 느끼지는 못했던 것 같다. 사실 그 때 역자에게 재미를 줄 수 있던 건, 일본 K사가 판매했던 PC 게임들이나, X 윈도 환경에서 즐길 수 있었던 Xmris 같은 게임이었을 게다. 하지만 그 친구는 5.25인치 플로피 수십 장으로 몇 번씩 설치했던 걸 보면, 분명 자기만 아는 재미가 있었던 것 같다.
리눅스 커널에서 재미를 찾는다는 것도 이와 같을 것이다. 커널 프로그램을 하다 보면, 유저 공간에서 동작하는 일반 응용 프로그램과는 다른 제약 사항이 존재한다. X 윈도우처럼 멋진 UI를 보면서 프로그램을 작성할 수 있는 것도 아니고, 사용자로부터 입력을 자유롭게 받아들일 수 있는 것도 아니다. 하지만 역으로 커널이기 때문에 할 수 있는 작업들도 많다. 물론 프로그램 오류가 시스템 전체를 멈추게 할 수 있는 만큼 고려해야 할 일도 많고 알아야 할 내용도 많다. 단순히 자기가 하고자 하는 작업만 생각하는 것이 아니라 그로 인해 시스템이 어떻게 영향을 받을 것인지, 더욱이 해당 작업이 시스템의 설계 철학을 위배하는 건 아닌지는 꼭 짚고 넘어가야 하는 내용들이다.
이러한 내용은 보통의 경우 그 시스템의 설계 문서를 살펴봄으로써 알 수 있게 된다. 하지만 리눅스는 그 특성상 전체에 대한 설계 문서를 구하는 것이 불가능하다. 전체 시스템을 구성하는 각 부분들에 대한 심도 있는 설명과 설계 자료들을 구할 수는 있지만, 그들을 체계적으로 엮어 설명해줄 태초의 설계도가 없는 것이다. 이로 인해 리눅스에 대한 많은 책들이 비슷한 것 같으면서도 다들 서로 조금씩은 다르다. 물론 이것은 어디까지나 본인의 생각이다.
이 책, 『리눅스 커널 심층분석 개정2판』도 리눅스에 대한 많은 책, 특히 커널에 대한 책들 중 하나이지만, 그만의 특징이 있다. 무엇보다도 여러분들이 타이핑해서 컴파일해보고 실행해볼 만한 코드가 없다. 이는 이 책이 "커널 모듈 만드는 법"과 같은 것을 설명하지는 않음을 의미한다. 대신, 다양한 참고문헌과 커뮤니티의 웹사이트들을 소개하고 있으며, 책의 모든 부분을 온전하게 리눅스 커널을 구성하고 있는 핵심 부분에 대한 심도 있는 설명으로 채워놓았다. 그렇기에 여러분이 이제 막 시작하는 입장이라면, 게다가 뭔가 실체적인 것을 만들어보면서 커널을 공부하고 싶다면, 지금 당장 이 책을 읽으라고 권할 수는 없다. 하지만 여러분이 알고자 하는 리눅스라는 대상에 대해, 자신의 이해 수준에서 한 번이라도 조감해보고 싶다면, 이 책만큼 좋은 책도 고르기 힘들다. 커널은 하루 아침에 이해하기에는 양이 좀 많다. 게다가 그 길고 긴 코드들에겐 구비구비 사연도 많다. 그런 여정을 자동차 드라이브 지도 한 장 들고 주마간산으로 본다면 무엇이 남겠는가?
이 책과 함께 리눅스 커널의 경치를 한번 꼼꼼하게 살펴본다면, 그 안에 여러분 스스로 즐길만한 것들이 얼마나 많은지 놀라게 될 것이다. 다른 사람이 모르는 나만의 즐거움은 그리 쉽게 발견할 수 있는 건 아닐 게다. 누군가 "그게 그렇게 재미있냐?"라고 묻는다면, 십수년 전에 역자의 친구가 그랬듯, 그저 씨익 한번 웃어줄 수 있는 Guru가 되시길.
창 밖으로 뽀얗게 피어 오르는 겨울 새벽을 바라 보며 이렇게 마무리를 하고 있으니, 짧지 않은 기간에 감사드릴 이들이 많아졌다는 걸 새삼 느낀다. 일의 진행이 느리기만 한 역자를 달래면서 이제는 득도하셨을 김희정 과장님과, 함께 고생하셨을 황영주 대리님을 비롯한 에이콘 가족, 특유의 언변으로 이 험난한 업계에 발을 들이게 한 박재호씨(!), 모두 감사합니다. 그리고 무엇보다도 책상에 앉으면 5분 내에 잠이 드는 아빠를 위해 때맞춰 번갈아 가며 울어주던 쌍둥이와, 항상 늦게 퇴근하는 남편의 조기 귀가를 10년 가까이 포기해주지 않는 아내에게 사랑한다는 말을 전하고 싶다.

- 강호관

목차

목차
  • 1장 리눅스 커널
    • 리눅스의 개발
    • 운영체제와 커널
    • 리눅스 커널과 전통적인 유닉스 커널
    • 리눅스 커널 버전
    • 리눅스 커널 개발 커뮤니티
    • 시작하기 전에
  • 2장 커널과의 첫 만남
    • 커널 소스 구하기
    • 커널 소스 트리
    • 커널 빌드하기
    • 다른 성질의 야수
    • 이제 여기까지 왔다
  • 3장 프로세스 관리
    • 프로세스 서술자와 태스크 구조체
    • 프로세스 생성
    • 리눅스의 스레드 구현
    • 프로세스 종료 35
  • 4장 프로세스 스케쥴링
    • 정책
    • 스케쥴링 알고리듬
    • 선점과 컨텍스트 스위칭
    • 실시간
    • 스케쥴러와 관련된 시스템 콜
  • 5장 시스템 콜
    • API, POSIX, C 라이브러리
    • 시스콜
    • 시스템 콜 핸들러
    • 시스템 콜의 구현
    • 시스템 콜 컨텍스트
  • 6장 인터럽트와 인터럽트 핸들러
    • 인터럽트
    • 인터럽트 핸들러
    • 인터럽트 핸들러 등록
    • 인터럽트 핸들러 작성
    • 인터럽트 컨텍스트
    • 인터럽트 핸들링 구현
    • 인터럽트 컨트롤
  • 7장 보톰하프와 지연된 작업
    • 보톰하프
    • Softirq
    • 태스크릿
    • 워크큐
    • 어떤 보톰하프를 사용해야 하는가?
    • 보톰하프 사이의 록
  • 8장 커널 동기화 개요
    • 위험구역과 경쟁상태
    • 락킹
    • 데드락
    • 경쟁과 확장성
    • 코드 잠그기
  • 9장 커널 동기화 방법
    • 원자적 동작
    • 스핀락
    • 리더-라이터 스핀락
    • 세마포어
    • 리더-라이터 세마포어
    • 비교: 스핀락과 세마포어
    • 완료 변수
    • 큰 커널 락
    • 선점의 비활성화
    • 오더링과 배리어
  • 10장 타이머와 시간 관리
    • 커널에 있어서의 시간의 개념
    • 진동수 : HZ
    • 지피
    • 하드웨어 클럭과 타이머
    • 타이머 인터럽트 핸들러
    • 현재시각
    • 타이머
    • 실행 지연
  • 11장 메모리 관리
    • 페이지
    • 영역
    • 페이지 얻기
    • kmalloc()
    • vmalloc()
    • 슬랩 레이어
    • 슬랩 할당자 인터페이스
    • 스택에 정적으로 할당하기
    • 상위 메모리 매핑
    • CPU별 할당
    • 새로운 percpu 인터페이스
    • CPU별 데이터를 사용하는 이유
    • 어떤 할당 방법을 사용해야 하는가
  • 12장 가상 파일시스템
    • 공통 파일시스템 인터페이스
    • 파일시스템 추상화 레이어
    • 유닉스 파일시스템
    • VFS 객체와 그 자료구조
    • 슈퍼블록 객체
    • inode 객체
    • 덴트리 객체
    • 파일 객체
    • 파일시스템과 관련된 자료구조
    • 프로세스와 연관된 자료구조
    • 리눅스의 파일시스템
  • 13장 블록 I/O 레이어
    • 블록 디바이스에 대한 이해
    • 버퍼와 버퍼헤드
    • bio 구조체
    • 요청 큐
    • I/O 스케쥴러
  • 14장 프로세스 주소영역
    • 메모리 서술자
    • 메모리 영역
    • 메모리 영역 다루기
    • mmap()과 do_mmap(): 주소공간 생성
    • munmap()과 do_munmap(): 주소 공간 제거
    • 페이지 테이블
  • 15장 페이지 캐시와 페이지 라이트백
    • 페이지 캐시
    • 래딕스 트리
    • 버퍼 캐시
    • pdflush 데몬
  • 16장 모듈
    • 모듈 빌드
    • 모듈 설치
    • 모듈 종속성 생성
    • 모듈 로드
    • 설정 옵션 관리
    • 모듈 매개변수
    • 익스포트된 심볼들
  • 17장 kobject와 sysfs
    • kobject
    • ktype
    • kset
    • 하위시스템
    • 혼동되는 구조체
    • kobject의 조작 및 관리
    • 참조 카운트
    • sysfs
    • 커널 이벤트 레이어
  • 18장 디버깅
    • 먼저 시작해야 하는 것
    • 커널에서의 버그
    • printk()
    • oops
    • 커널 디버깅 옵션
    • 버그 유발과 정보 덤프
    • Magic SysRq 키
    • 커널 디버거 이야기
    • 시스템을 여러 각도에서 조사
    • 범행을 저지른 변경을 찾기 위한 이진 탐색
    • 모든 시도가 실패한 경우 : 커뮤니티
  • 19장 이식성
    • 리눅스: 이식성의 역사
    • 워드 크기와 자료형
    • 데이터 정렬
    • 바이트 순서
    • 시간
    • 페이지 크기
    • 프로세서 오더링
    • SMP, 커널 선점, 상위 메모리
  • 20장 패치, 해킹, 그리고 공동체
    • 공동체
    • 리눅스 코딩 스타일
    • 명령 체계
    • 버그 리포트 제출
    • 패치 생성
    • 패치 제출
  • 부록A 연결 리스트
    • 환형 연결 리스트
    • 리눅스 커널에서의 구현
    • 연결 리스트 조작
    • 연결 리스트 순회하기
  • 부록 B 커널 랜덤 숫자 발생기
    • 디자인과 구현
    • 엔트로피 입력 인터페이스
    • 엔트로피 출력 인터페이스
  • 부록C 알고리즘 복잡도
    • 알고리즘
    • O 표기법
    • 빅 세타 표기법
    • 모든 것을 모아 보자
    • 시간 복잡도의 위험성

도서 오류 신고

도서 오류 신고

에이콘출판사에 관심을 가져 주셔서 고맙습니다. 도서의 오탈자 정보를 알려주시면 다음 개정판 인쇄 시 반영하겠습니다.

오탈자 정보는 다음과 같이 입력해 주시면 됩니다.

(예시) p.100 아래에서 3행 : '몇일'동안 -> 며칠동안

정오표

[ p44 '실행큐' 절 2~3행 ]
프로세스당 하나의 → 한 프로세서당 하나의