閱讀時間:2015年10月22日
閱讀技巧:用手機(jī)截圖的方式,把重要的內(nèi)容重點理解,時常復(fù)習(xí)

閱讀筆記:liunx的標(biāo)準(zhǔn):
POSIX.1 僅規(guī)定了系統(tǒng)服務(wù)應(yīng)用程序編程接口(API),僅概括了基本的系統(tǒng)服務(wù)標(biāo)準(zhǔn),因此期望對 系統(tǒng)的其它功能也制定出標(biāo)準(zhǔn)。這樣 IEEE POSIX 的工作就開始展開了。在 1990 年,剛開始有十個批準(zhǔn) 的計劃在進(jìn)行,有近 300 多人參加每季度為期一周的會議。著手的工作有命令與工具標(biāo)準(zhǔn)(POSIX.2)、測 試方法標(biāo)準(zhǔn)(POSIX.3)、實時 API(POSIX.4)等。到了 1990 年上半年已經(jīng)有 25 個計劃在進(jìn)行,并且有 16 個工作組參與了進(jìn)來。與此同時,還有一些組織也在制定類似的標(biāo)準(zhǔn),如 X/Open,AT&T,OSF 等。
本文將主要對 Linux 的早期內(nèi)核 0.11 版進(jìn)行詳細(xì)描述和注釋。Linux-0.11 版本是在 1991 年 12 月 8 日發(fā)布的。在發(fā)布時包括以下文件:
bootimage.Z - 具有美國鍵盤代碼的壓縮啟動映像文件;
rootimage.Z - 以 1200kB 壓縮的根文件系統(tǒng)映像文件;
linux-0.11.tar.Z- 內(nèi)核源代碼文件;
as86.tar.Z - linux bruce evans'二進(jìn)制執(zhí)行文件;
是 16 位的匯編程序和裝入程序;
INSTALL-0.11 - 更新過的安裝信息文件。

由于 Linux 內(nèi)核是一種單內(nèi)核模式的系統(tǒng),因此,內(nèi)核中所有的程序幾乎都有緊密的聯(lián)系,它們之 間的依賴和調(diào)用關(guān)系非常密切。所以在閱讀一個源代碼文件時往往需要參閱其它相關(guān)的文件。因此有必 要在開始閱讀內(nèi)核源代碼之前,先熟悉一下源代碼文件的目錄結(jié)構(gòu)和安排:

Makefile 簡介
makefile 文件是 make 工具程序的配置文件。Make 工具程序的主要用途是能自動地決定一個含有很 多源程序文件的大型程序中哪個文件需要被重新編譯。makefile 的使用比較復(fù)雜,這里只是根據(jù)上面的 makefile 文件作些簡單的介紹。詳細(xì)說明請參考 GNU make 使用手冊。
為了使用 make 程序,你就需要 makefile 文件來告訴 make 要做些什么工作。通常,makefile 文件 會告訴 make 如何編譯和連接一個文件。當(dāng)明確指出時,makefile 還可以告訴 make 運行各種命令(例如, 作為清理操作而刪除某些文件)。
make 的執(zhí)行過程分為兩個不同的階段。在第一個階段,它讀取所有的 makefile 文件以及包含的 makefile 文件等,記錄所有的變量及其值、隱式的或顯式的規(guī)則,并構(gòu)造出所有目標(biāo)對象及其先決條件 的一幅全景圖。在第二階段期間,make 就使用這些內(nèi)部結(jié)構(gòu)來確定哪個目標(biāo)對象需要被重建,并且使用 相應(yīng)的規(guī)則來操作。
當(dāng) make 重新編譯程序時,每個修改過的 C 代碼文件必須被重新編譯。如果一個頭文件被修改過了, 那么為了確保正確,每一個包含該頭文件的 C 代碼程序都將被重新編譯。每次編譯操作都產(chǎn)生一個與源 程序?qū)?yīng)的目標(biāo)文件(object file)。最終,如果任何源代碼文件被編譯過了,那么所有的目標(biāo)文件不管 是剛編譯完的還是以前就編譯好的必須連接在一起以生成新的可執(zhí)行文件。
簡單的 makefile 文件含有一些規(guī)則,這些規(guī)則具有如下的形式:
目標(biāo)(target)... : 先決條件(prerequisites)...
命令(command) ...
...
其中'目標(biāo)'對象通常是程序生成的一個文件的名稱;例如是一個可執(zhí)行文件或目標(biāo)文件。目標(biāo)也可 以是所要采取活動的名字,比如'清除'('clean')。'先決條件'是一個或多個文件名,是用作產(chǎn)生目標(biāo)的 輸入條件。通常一個目標(biāo)依賴幾個文件。而'命令'是 make 需要執(zhí)行的操作。一個規(guī)則可以有多個命令, 每一個命令自成一行。請注意,你需要在每個命令行之前鍵入一個制表符!這是粗心者常常忽略的地方。
如果一個先決條件通過目錄搜尋而在另外一個目錄中被找到,這并不會改變規(guī)則的命令;它們將被 如期執(zhí)行。因此,你必須小心地設(shè)置命令,使得命令能夠在 make 發(fā)現(xiàn)先決條件的目錄中找到需要的先決 條件。這就需要通過使用自動變量來做到。自動變量是一種在命令行上根據(jù)具體情況能被自動替換的變 量。自動變量的值是基于目標(biāo)對象及其先決條件而在命令執(zhí)行前設(shè)置的。例如,’$^’的值表示規(guī)則的 所有先決條件,包括它們所處目錄的名稱;’$<’的值表示規(guī)則中的第一個先決條件;’$@’表示目標(biāo) 對象;另外還有一些自動變量這里就不提了。
有時,先決條件還常包含頭文件,而這些頭文件并不愿在命令中說明。此時自動變量’$<’正是第 一個先決條件。例如: foo.o : foo.c defs.h hack.h cc -c $(CFLAGS) $< -o $@
其中的’$<’就會被自動地替換成 foo.c,而$@則會被替換為 foo.o 為了讓 make 能使用習(xí)慣用法來更新一個目標(biāo)對象,你可以不指定命令,寫一個不帶命令的規(guī)則或者 不寫規(guī)則。此時 make 程序?qū)鶕?jù)源程序文件的類型(程序的后綴)來判斷要使用哪個隱式規(guī)則。
后綴規(guī)則是為 make 程序定義隱式規(guī)則的老式方法。(現(xiàn)在這種規(guī)則已經(jīng)不用了,取而代之的是使用 更通用更清晰的模式匹配規(guī)則)。下面例子就是一種雙后綴規(guī)則。雙后綴規(guī)則是用一對后綴定義的:源后 綴和目標(biāo)后綴。相應(yīng)的隱式先決條件是通過使用文件名中的源后綴替換目標(biāo)后綴后得到。因此,此時下 面的’$<’值是*.c 文件名。而正條 make 規(guī)則的含義是將*.c 程序編譯成*.s 代碼。
.c.s:
$(CC) $(CFLAGS) ?-nostdinc -Iinclude -S -o $*.s $<
通常命令是屬于一個具有先決條件的規(guī)則,并在任何先決條件改變時用于生成一個目標(biāo)(target)文 件。然而,為目標(biāo)而指定命令的規(guī)則也并不一定要有先決條件。例如,與目標(biāo)'clean'相關(guān)的含有刪除 (delete)命令的規(guī)則并不需要有先決條件。此時,一個規(guī)則說明了如何以及何時來重新制作某些文件, 而這些文件是特定規(guī)則的目標(biāo)。make 根據(jù)先決條件來執(zhí)行命令以創(chuàng)建或更新目標(biāo)。一個規(guī)則也可以說明 如何及何時執(zhí)行一個操作。
一個 makefile 文件也可以含有除規(guī)則以外的其它文字,但一個簡單的 makefile 文件只需要含有適 當(dāng)?shù)囊?guī)則。規(guī)則可能看上去要比上面示出的模板復(fù)雜得多,但基本上都是符合的。
makefile 文件最后生成的依賴關(guān)系是用于讓 make 來確定是否需要重建一個目標(biāo)對象。比如當(dāng)某個 頭文件被改動過后,make 就通過這些依賴關(guān)系,重新編譯與該頭文件有關(guān)的所有*.c 文件。這是打開這個文件的注釋:





閱讀后記:這是技術(shù)類的文章,需要對概念采取碎片話的時間加以理解。同時對整體需要有個大概得理解,就像是產(chǎn)品說明介紹一樣對每個模塊知識充分的認(rèn)識。