本書(shū)對(duì)早期的Linux操作系統(tǒng)內(nèi)核(v0.11)全部源代碼文件進(jìn)行了詳細(xì)的注釋和說(shuō)明,旨在讓讀者能夠在短時(shí)間內(nèi)對(duì)Linux的工作機(jī)理獲得全面而深刻的理解,為進(jìn)一步學(xué)習(xí)和研究Linux系統(tǒng)打下堅(jiān)實(shí)的基礎(chǔ)。書(shū)中首先介紹了Linux系統(tǒng)的發(fā)展歷史,著重說(shuō)明了各個(gè)內(nèi)核版本之間的重要區(qū)別,給出了選擇0.11版作為研究對(duì)象的原因;然后依據(jù)內(nèi)核源代碼的組織結(jié)構(gòu)對(duì)所有代碼進(jìn)行了詳細(xì)注釋。在注釋的同時(shí),還介紹了讀者應(yīng)該了解的相關(guān)知識(shí),并給出了相關(guān)的硬件信息。本書(shū)還介紹了內(nèi)核源代碼的組織結(jié)構(gòu)及相互關(guān)系。
趙炯博士的Linux內(nèi)核源碼書(shū)系列自從問(wèn)世以來(lái),在全國(guó)乃至世界范圍內(nèi)產(chǎn)生了很大影響。第一批讀者受惠良多,早已成為IT大廠的中堅(jiān)力量。20年過(guò)去了,Linux內(nèi)核的體量發(fā)生了巨大變化,這更加凸顯了“從小內(nèi)核學(xué)起”的理念的正確。閱讀本書(shū),會(huì)幫助讀者少走彎路,快速理解Linux的精髓,早日成長(zhǎng)為合格的開(kāi)發(fā)人員和系統(tǒng)架構(gòu)師。
本書(shū)是一本有關(guān)Linux操作系統(tǒng)內(nèi)核工作原理的入門(mén)讀物,主要目標(biāo)是使用盡量少的篇幅和有限的學(xué)習(xí)時(shí)間,對(duì)完整的Linux內(nèi)核源代碼進(jìn)行解剖,使讀者對(duì)操作系統(tǒng)的基本功能和實(shí)現(xiàn)方式有一個(gè)全面的理解。
目前已有的闡述Linux內(nèi)核的書(shū)籍,均盡量選用最新Linux內(nèi)核版本進(jìn)行描述,但由于這些版本的內(nèi)核源代碼龐大,只能對(duì)源代碼進(jìn)行選擇性的講解,許多實(shí)現(xiàn)細(xì)節(jié)被忽略。本書(shū)則對(duì)完整的Linux內(nèi)核源代碼進(jìn)行了全面解剖。表面看來(lái),本書(shū)對(duì)Linux早期內(nèi)核版本注釋的內(nèi)容似乎過(guò)時(shí),但通過(guò)學(xué)習(xí)你會(huì)發(fā)現(xiàn),利用本書(shū)學(xué)習(xí)Linux內(nèi)核,由于源代碼短小精干,因此會(huì)有極高的學(xué)習(xí)效率,能夠做到事半功倍,快速入門(mén),并為進(jìn)一步選擇新內(nèi)核學(xué)習(xí)打下堅(jiān)實(shí)的基礎(chǔ)。
正如Linux系統(tǒng)的創(chuàng)始人Linus所說(shuō),要理解一個(gè)系統(tǒng)的真正運(yùn)行機(jī)制,一定要閱讀其源代碼。系統(tǒng)本身是一個(gè)整體,具有很多看似不重要的細(xì)節(jié)。只有在詳細(xì)閱讀過(guò)完整的內(nèi)核源代碼之后,才會(huì)對(duì)整個(gè)系統(tǒng)的運(yùn)作過(guò)程有深刻的理解。以后再選擇較新內(nèi)核源代碼進(jìn)行學(xué)習(xí)時(shí),也不會(huì)碰到大問(wèn)題,基本上都能順利地理解新代碼的內(nèi)容。
為了幫助讀者提高學(xué)習(xí)效率,作者通過(guò)對(duì)多個(gè)Linux內(nèi)核版本進(jìn)行比較和選擇,最終選擇了與目前Linux內(nèi)核基本功能較為相近,又非常短小的0.11版作為入門(mén)學(xué)習(xí)的最佳版本。0.11版內(nèi)核源代碼只有一萬(wàn)四千行左右(325KB),其中包括的內(nèi)容基本上都是Linux系統(tǒng)的精髓。
在閱讀本書(shū)時(shí),讀者應(yīng)該具備基本的有關(guān)80x86處理器編程和相關(guān)外圍硬件的知識(shí),還應(yīng)具備使用Linux系統(tǒng)的初級(jí)技能。由于Linux最早是根據(jù)M.J.Bach的《UNIX操作系統(tǒng)設(shè)計(jì)》一書(shū)的基本原理開(kāi)發(fā)的,因此若能適當(dāng)參考該書(shū),則更有利于對(duì)源代碼的理解。
在對(duì)每個(gè)程序進(jìn)行描述時(shí),我們首先說(shuō)明程序的主要用途、輸入輸出參數(shù)以及與其他程序的關(guān)系,然后在程序中對(duì)代碼進(jìn)行詳細(xì)注釋。注釋時(shí)對(duì)源代碼和原注釋不作任何改動(dòng)。在代碼之后是對(duì)程序中出現(xiàn)的一些語(yǔ)句或硬件方面的相關(guān)知識(shí)進(jìn)行說(shuō)明。
本書(shū)所需的一些基本概念均分布在各章中,這樣編排主要是為了能夠使讀者方便地找到相關(guān)信息,而且在結(jié)合源代碼閱讀時(shí),對(duì)一些基本概念能有更深的理解。另外,由于篇幅所限,我們對(duì)內(nèi)核源代碼多數(shù)文件開(kāi)始處的版權(quán)信息作了省略,但程序中的行號(hào)仍然按原來(lái)的編號(hào)。
最后要說(shuō)明的是,當(dāng)你已經(jīng)完全理解了本文解說(shuō)的一切時(shí),并不代表你已經(jīng)成為一個(gè)Linux行家了,你只是剛剛踏上Linux的征途,具有了成為一個(gè)Linux高手的初步知識(shí)。這時(shí)你應(yīng)該去閱讀更多的源代碼。本書(shū)讀者群的定位是一些知曉Linux系統(tǒng)一般使用方法或具有一定編程經(jīng)驗(yàn),但比較缺乏閱讀目前最新內(nèi)核源代碼的基礎(chǔ),又急切希望能夠進(jìn)一步理解類(lèi)UNIX操作系統(tǒng)內(nèi)核工作原理和實(shí)際代碼實(shí)現(xiàn)的愛(ài)好者。在閱讀時(shí)可以參考為本書(shū)專(zhuān)門(mén)開(kāi)設(shè)的網(wǎng)站www.oldlinux.org。從中可以下載到很多學(xué)習(xí)資料和上機(jī)實(shí)習(xí)軟件,也可以進(jìn)行在線討論。
趙炯,工學(xué)博士,計(jì)算機(jī)專(zhuān)家,Intel公司訪問(wèn)學(xué)者,國(guó)際計(jì)算機(jī)仿真協(xié)會(huì)、上海市通信學(xué)會(huì)會(huì)員。研究方向?yàn)橛?jì)算機(jī)通信。曾經(jīng)為本科、碩士和博士研究生開(kāi)設(shè)《計(jì)算機(jī)網(wǎng)絡(luò)》、《計(jì)算機(jī)通信技術(shù)》、《計(jì)算機(jī)通信與工控網(wǎng)絡(luò)》、《微型計(jì)算機(jī)》和《計(jì)算機(jī)原理》等課程。參與國(guó)家自然科學(xué)基金項(xiàng)目“系統(tǒng)芯片在線測(cè)試與容錯(cuò)技術(shù)研究”和上海市自然科學(xué)基金“基于節(jié)點(diǎn)主動(dòng)控制的大規(guī)模復(fù)雜輸送系統(tǒng)控制模型研究”等工作。
前言
第1章概述1
1.1 Linux的誕生和發(fā)展1
1.1.1 UNIX、MINIX、GNU和POSIX1
1.1.2 Linux操作系統(tǒng)的誕生和版本的變遷1
1.2 內(nèi)容綜述3
1.3 本章小結(jié)5
1.4 習(xí)題6
第2章Linux內(nèi)核體系結(jié)構(gòu)7
2.1 Linux內(nèi)核模式和體系結(jié)構(gòu)7
2.2 Linux中斷機(jī)制9
2.3 Linux系統(tǒng)定時(shí)10
2.4 Linux內(nèi)核進(jìn)程控制11
2.4.1 任務(wù)數(shù)據(jù)結(jié)構(gòu)11
2.4.2 進(jìn)程運(yùn)行狀態(tài)11
2.4.3 進(jìn)程初始化12
2.4.4 創(chuàng)建新進(jìn)程14
2.4.5 進(jìn)程調(diào)度14
2.4.6 終止進(jìn)程15
2.5 Linux內(nèi)核對(duì)內(nèi)存的使用方法16
2.6 Linux系統(tǒng)中堆棧的使用方法19
2.6.1 初始化階段19
2.6.2 任務(wù)的堆棧20
2.6.3 內(nèi)核態(tài)與用戶(hù)態(tài)堆棧之間的切換21
2.7 Linux內(nèi)核源代碼的目錄結(jié)構(gòu)21
2.7.1 引導(dǎo)啟動(dòng)程序目錄boot22
2.7.2 文件系統(tǒng)目錄fs22
2.7.3 頭文件主目錄include23
2.7.4 內(nèi)核初始化程序目錄init23
2.7.5 內(nèi)核程序主目錄kernel24
2.7.6 內(nèi)核庫(kù)函數(shù)目錄lib25
2.7.7 內(nèi)存管理程序目錄mm26
2.7.8 編譯內(nèi)核工具程序目錄tools26
2.8 內(nèi)核系統(tǒng)與用戶(hù)程序的關(guān)系26
2.9 Linux內(nèi)核的編譯實(shí)驗(yàn)環(huán)境26
2.10 linux/Makefile文件28
2.11 本章小結(jié)34
2.12 習(xí)題35
第3章內(nèi)核引導(dǎo)啟動(dòng)程序36
3.1 總體功能描述36
3.2 程序分析37
3.2.1 bootsect.s程序37
3.2.2 setup.s程序44
3.2.3 head.s程序52
3.3 本章小結(jié)60
3.4 習(xí)題60
第4章內(nèi)核初始化過(guò)程61
4.1 main.c程序分析61
4.2 本章小結(jié)68
4.3 習(xí)題69
第5章進(jìn)程調(diào)度與系統(tǒng)調(diào)用70
5.1 總體功能描述70
5.1.1 中斷處理程序70
5.1.2 系統(tǒng)調(diào)用處理相關(guān)程序71
5.2 程序分析72
5.2.1 asm.s程序72
5.2.2 traps.c程序77
5.2.3 systemcall.s程序83
5.2.4 mktime.c程序91
5.2.5 sched.c程序92
5.2.6 signal.c程序103
5.2.7 exit.c程序108
5.2.8 fork.c程序112
5.2.9 sys.c程序117
5.2.10 vsprintf.c程序122
5.2.11 printk.c程序127
5.2.12 panic.c程序128
5.3 本章小結(jié)129
5.4 習(xí)題129
第6章輸入輸出系統(tǒng)——塊設(shè)備驅(qū)動(dòng)程序130
6.1 總體功能描述130
6.1.1 塊設(shè)備請(qǐng)求項(xiàng)和請(qǐng)求隊(duì)列130
6.1.2 塊設(shè)備操作方式132
6.2 程序分析133
6.2.1 blk.h文件133
6.2.2 hd.c程序136
6.2.3 llrwblk.c程序149
6.2.4 ramdisk.c程序154
6.2.5 floppy.c程序157
6.3 本章小結(jié)170
6.4 習(xí)題170
第7章輸入輸出系統(tǒng)——字符設(shè)備驅(qū)動(dòng)程序171
7.1 總體功能描述171
7.1.1 終端驅(qū)動(dòng)程序基本原理171
7.1.2 終端基本數(shù)據(jù)結(jié)構(gòu)172
7.1.3 規(guī)范模式和非規(guī)范模式174
7.1.4 控制臺(tái)驅(qū)動(dòng)程序175
7.1.5 串行終端驅(qū)動(dòng)程序176
7.1.6 終端驅(qū)動(dòng)程序接口177
7.2 程序分析177
7.2.1 keyboard.S程序177
7.2.2 console.c程序191
7.2.3 serial.c程序210
7.2.4 rsio.s程序213
7.2.5 tty_io.c程序216
7.2.6 tty_ioctl.c程序225
7.3 本章小結(jié)230
7.4 習(xí)題230
第8章數(shù)學(xué)協(xié)處理器231
8.1 mathemulation.c程序分析231
8.2 本章小結(jié)232
8.3 習(xí)題232
第9章文件系統(tǒng)233
9.1 總體功能描述233
9.1.1 MINIX文件系統(tǒng)233
9.1.2 高速緩沖區(qū)237
9.1.3 文件系統(tǒng)底層函數(shù)237
9.1.4 文件中數(shù)據(jù)的訪問(wèn)操作237
9.2 程序分析239
9.2.1 buffer.c程序239
9.2.2 bitmap.c程序251
9.2.3 inode.c程序255
9.2.4 super.c程序264
9.2.5 namei.c程序272
9.2.6 filetable.c程序292
9.2.7 blockdev.c程序292
9.2.8 filedev.c程序295
9.2.9 pipe.c程序297
9.2.10 chardev.c程序300
9.2.11 readwrite.c程序303
9.2.12 truncate.c程序306
9.2.13 open.c程序307
9.2.14 exec.c程序312
9.2.15 stat.c程序322
9.2.16 fcntl.c程序323
9.2.17 ioctl.c程序325
9.3 本章小結(jié)326
9.4 習(xí)題326
第10章內(nèi)存管理328
10.1 總體功能描述328
10.1.1 內(nèi)存分頁(yè)管理機(jī)制328
10.1.2 Linux中內(nèi)存的管理和分配331
10.1.3 寫(xiě)時(shí)復(fù)制機(jī)制332
10.2 程序分析332
10.2.1 memory.c程序332
10.2.2 page.s程序345
10.3 本章小結(jié)346
10.4 習(xí)題346
第11章包含文件347
11.1 程序分析347
11.1.1 include/目錄下的文件347
11.1.2 a.out.h文件347
11.1.3 const.h文件356
11.1.4 ctype.h文件356
11.1.5 errno.h文件357
11.1.6 fcntl.h文件359
11.1.7 signal.h文件360
11.1.8 stdarg.h文件362
11.1.9 stddef.h文件363
11.1.10 string.h文件363
11.1.11 termios.h文件372
11.1.12 time.h文件379
11.1.13 unistd.h文件380
11.1.14 utime.h文件385
11.1.15 incl