리눅스는 자유롭게 복사 및 배포가 가능한 Unix계열의 운영체제이다. 값비싼 상용 Unix는 전산학과 재학중인 학생이 아니면 접하기가 어려운 까닭에 자신의 PC에서 Unix를 사용하기를 원하는 많은 가난한 학생들에게 리눅스는 지식의 욕구를 충족시켜줄수 있는 더없이 좋은 선물이 되었다. 게다가 리눅스는 모든 source가 공개되어 있어 운영체제를 제작하기를 원하거나 Unix의 내부를 들여다보길 원하는 이에게는 군침도는 hacking대상이 되는것이다.
리눅스는 현재 많은 연구소, 기관, 회사에 설치, 운용되고 있으며 그 성능이 입증되었다. 그리고 Internet에 물려있는 다수의 host들이 리눅스 시스템으로 이루어져 있다.
본서의 구성은 대부분의 Unix운영체제서적과 구성이 비슷하다. 큰 특징으로는 대부분의 Unix운영체제서적에서 나타나는 개념적인 설명보다는 리눅스 커널 code를 한줄한줄 분석해 가는 것으로 구성하였다. 따라서 실전이 부족한 타 서적의 내용을 이해하는데 도움을 주리라 믿는다.
본서의 목적은 많은 시스템 프로그래머들이 운영체제는 누구처럼 타고난 재능이 있는 사람들이나 만들수 있는 것이라는 막연한 두려움에서 벗어날수 있도록 자신감을 불어넣어줌으로써 미래에 나올 새로운 운영체제를 만드는데 보다 많은 이들이 동참할수 있도록 하는 것이다.
본서는 컴퓨터초보자가 보기에는 난해한 내용이다. 따라서 이 책을 보는 이들에게는 다음에 열거한 것들이 반드시 선행되어야 할것이다.
· 기본적인 컴퓨터용어에 대한 이해를 하고 있을것.
· C 언어의 기본문법을 이해하고 있을것.
· assembly 언어의 기본문법을 이해하고 있을것.
이 외에도 본인은 다음과 같은 것을 권한다.
· DOS상에서라도 system programing을 해본적이 있을것.
· Unix의 user수준에서의 이해와 Unix programing에 대한 기본적인 이해가 있을것.
본인은 이것을 갖추지 못한채 시작하여 많은 시행착오를 거쳤다.
· 32bit 보호모드 관련서적을 한번쯤 읽어보자.
아마도 본서를 읽는 과정에서 가장 큰 부담은 보호모드의 이해일것이다. 하지만
본서에서 보호모드의 실전을 충분히 경험할수 있을것이다.
여느 책들과는 다르게 참고서적(bibliagraphy)을 한 곳에 모아두지 않고, 관련된 내용이 나올때마다 주석으로 달아두었다. 운영체제를 분석하기 위해서는 hardware및 software에 대한 많은 지식과 자료가 요구된다. 당연한 소리지만, 그것을 이 한권에서 모두 설명할수
는 없다.
그리고 본서에서는 영어로 된 컴퓨터용어를 발음대로 우리글로 적거나, 무리하게 우리말로 바꾸려고 애쓰지 않고 영어를 그대로 사용한 경우가 많다. 이것은 본인이 컴퓨터관련서적을 보면서 자주 느꼈던 혼돈과 어색함때문에 어렵게 결정된 것이니만큼, 본인의 애국심을 의심하지는 말기 바란다.
커널 source중에 다음과 같이 컴파일이 되지않는 곳은 책내용의 간결성을 이유로 분석대상에서 제외시켰다.
#ifdef 0
........
#endif
13장에는 kernel전체에서 공통적으로 자주 사용되는 주요함수들을 C library reference형
태로 구성해 두었다. 주로 scheduling과 메모리, 그리고 file system에 관한 부분들이다.
본인의 짧은 지식으로 인해 부족한 점이 많을 것으로 안다. 책의 내용중에 문제가 발견되면 언제든지 지적해주기 바란다. 리눅스 커널의 분석은 궁극적으로 본인을 포함한 컴퓨터와 리눅스를 사랑하는 이들이 함께 이룩해 나가는 것이다.
본인이 처음 리눅스를 설치하면서 당혹스러워 할때, 안면이 전혀 없는 본인의 집을 찾아와 리눅스를 설치해 준 이인아씨에게 가장 먼저 감사드리고 싶다. 이인아씨는 본인에게PC통신의 막강한 힘과 정보화 사회가 무엇인가를 처음 느끼게 해 준 은인이기도 하다. 이 분외에도 PC통신을 통한 본인의 질문에 답해주신 많은 분들과 타인을 위해 자료실에 자료를 올리는데 지금도 자신의 소중한 시간과 경비를 들이고 있을 이들에게 감사드린다. 이들이 바로 우리나라 정보화사회를 이끌어가는 주역들이라고 믿는다.
1995. 9.
나우우리 ID : techead
1장
1.1 리눅스란..
1.2 DOS kernel
1.3 리눅스 kernel
1.4 kernel 설치
1.5 Makefile
1.6 Kernel Image
1.7 보호모드
2장
2.1 LILO
2.1.1 LILO란..
2.1.2 LILO 설치
2.2 리눅스 부팅과정
2.2.1 부팅시작
2.2.2 first.S 수행과정
2.2.3 second.S 수행과정
2.2.4 LILO 작업이 끝난 후의 메모리 상태.
2.3 DOS 부팅의 경우
2.4 커널 코드 시작
2.4.1 bootsect.S (floppy로 부팅시 사용) 수행과정
2.4.2 setup.S 코드 수행과정
2.4.3 head.S 코드 수행과정
2.5.1 iBCS emulator
2.5.2 device 정보를 위한 변수지정
2.5.3 memory 정보를 위한 변수지정
2.5.4 PAGE ALIGN
2.5.5 initialize page
2.5.6 bus방식 check
2.5.7 trap_init
2.5.8 init_IRQ
2.5.9 sched_init (kernel/sched.c)
2.5.10 parse_options
2.5.11 kmalloc_init
2.5.12 chr_dev_init
2.5.13 blk_dev_init
2.5.14 calibrate_delay
2.5.15 inode_init (fs/inode.c), file_table_init (fs/filetable.c)
2.5.16 mem_init
2.5.17 buffer_init
2.5.18 time_init
2.5.19 floppy_init
2.5.20 sock_init
2.6 Coprocessor 초기화
3장
3.1 fork system call
3.2 init process
4장
4.1 buffer_init
4.2 getblk
4.2.1 hash table
4.2.2. LRU 알고리즘
4.2.3 lock
4.2.4 sync
4.2.5 getblk code
4.3 brelse 함수
4.4 bread 함수
4.5 breada 함수
5장
5.1 리눅스 filesystem
5.2 filesystem 구조
5.3 super block
5.4 group descriptor
5.5 block bitmap과 inode bitmap
5.6 inode table
5.7 directory block
5.9 file 삭제
5.10 inode구조체(fs.h)와 ext2_inode구조체(ext2_fs.h)
5.11.1 symbolic link
5.11.2 hard link
5.12 open system call
5.13 mount
5.13.1 개요
5.13.2 mount system call
5.14 kernel의 inode 관리
5.15 /proc
6장
6.1 서 론
6.2 timer interrupt handler 함수
6.2.1 tms 구조체와 itimerval, timeval 구조체
6.2.2 do_timer 함수
6.4 TASK 전환
6.5 debug register
6.6 process 상태
6.7.1 sleep 함수
6.7.2 wakeup 함수
7장
7.1.1 secondary_page_list
7.1.2 kmalloc code 수행과정
7.2 paging
7.2.1 segmention
7.2.2 paging 개요
7.2.3 리눅스에서의 paging 사용
7.4 영역(vm_area)
7.4.1 mmap system call
7.4.2 do_mmap 함수코드중에서
7.5 exec system call
7.5.1 do_exec함수 코드중에서
7.5.2 load_aout_binary
7.5.3 stack set
7.6. page fault
7.6.1 do_no_page 함수
7.6.2 do_wp_page 함수
7.7. LDT(local descriptor table)
7.8 swap영역
7.8.1 swap영역 생성
7.8.2 swap-out 전략
8장
8.1 초기화
8.2 system call routine
8.3 STACK
8.3.1 kernel stack page
8.3.2 stack의 사용
9장
9.3 gendisk 구조체
10장
10.1 서 론
10.2 hard disk driver
10.2.1 ll_rw_blk 함수
10.2.2 make_request 함수
10.2.3 add_request 함수
10.2.4 hd_out 함수
10.2.5 hard disk interrupt handler
10.3 line printer driver
11장
11.1 Terminal Modes
11.1.1 Data type
11.1.2. Input mode
11.2 keyboard에서의 Key 입력과정
11.4 kbd_bh 함수 수행과정
12장
12.1 서 론
12.2 tty_init 함수
12.3 terminal입력 전달과정
12.4.1 tty_open 함수
12.4.2 con_open 함수 (console.c)
12.4.3 copy_to_cooked 함수 (tty_io.c)
12.4.4 tty_read 함수
12.4.5 read_chan 함수
12.4.6 tty_write 함수
12.4.7 write_chan 함수
12.5 console driver
12.5.1 con_init 함수
12.5.2 change_console 함수
12.5.3 con_write 함수
12.5.4 library에서의 getchar 함수
12.6 serial line 초기화
13장
13.1 signal 발생
13.2 core. file
부록 A DLL에 대한 소개