linux內(nèi)核源代碼漫游

linux內(nèi)核源代碼漫游

ID:14213762

大?。?2.00 KB

頁數(shù):9頁

時(shí)間:2018-07-26

linux內(nèi)核源代碼漫游_第1頁
linux內(nèi)核源代碼漫游_第2頁
linux內(nèi)核源代碼漫游_第3頁
linux內(nèi)核源代碼漫游_第4頁
linux內(nèi)核源代碼漫游_第5頁
資源描述:

《linux內(nèi)核源代碼漫游》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。

1、Linux內(nèi)核源代碼漫游創(chuàng)建時(shí)間:2001-10-1121時(shí)13分Linux內(nèi)核源代碼漫游AlessandroRubini著,rubini@pop.systemy.it趙炯譯,gohigh@sh163net,(www.plinux.org)本章試圖以順序的方式來解釋Linux源代碼,以幫助讀者對源代碼的體系結(jié)構(gòu)以及很多相關(guān)的unix特性的實(shí)現(xiàn)有一個(gè)很好的理解。目標(biāo)是幫助對Linux不甚了解的有經(jīng)驗(yàn)的C程序員對整個(gè)Linux的設(shè)計(jì)有所了解。這也就是為什么內(nèi)核漫游的入點(diǎn)選擇為內(nèi)核本身的啟始點(diǎn):系統(tǒng)引導(dǎo)(啟動)。這份材料需要對C語言

2、以及對Unix的概念和PC機(jī)的結(jié)構(gòu)有很好的了解,然而本章中并沒有出現(xiàn)任何的C代碼,而是直接參考(指向)實(shí)際的代碼的。有關(guān)內(nèi)核設(shè)計(jì)的最佳篇幅是在本手冊的其它章節(jié)中,而本章仍趨向于是一個(gè)非正式的概述。本章中所參閱的任何文件的路徑名都是指主源代碼目錄樹,通常是/usr/src/linux。這里所給出的大多數(shù)信息都是取之于Linux發(fā)行版1.0的源代碼。雖然如此,有時(shí)也會提供對后期版本的參考。這篇漫游中開頭有圖標(biāo)的任何小節(jié)都是強(qiáng)調(diào)1.0版本后對內(nèi)核的新的改動。如果沒有這樣的小節(jié)存在,則表示直到版本1.0.9-1.1.76,沒有作過改動

3、。有時(shí)候本章中會有象這樣的小節(jié),這是指向正確的代碼以對剛討論過的主題取得更多信息的指示符。當(dāng)然,這里是指源代碼。引導(dǎo)(啟動)系統(tǒng)當(dāng)PC的電源打開后,80x86結(jié)構(gòu)的CPU將自動進(jìn)入實(shí)模式,并從地址0xFFFF0開始自動執(zhí)行程序代碼,這個(gè)地址通常是ROM-BIOS中的地址。PC機(jī)的BIOS將執(zhí)行某些系統(tǒng)的檢測,在物理地址0處開始初始化中斷向量。此后,它將可啟動設(shè)備的第一個(gè)扇區(qū)讀入內(nèi)存地址0x7C00處,并跳轉(zhuǎn)到這個(gè)地方。啟動設(shè)備通常是軟驅(qū)或是硬盤。這里的敘述是非常簡單的,但這已經(jīng)足夠理解內(nèi)核初始化的工作過程了。Linux的最最前

4、面部分是用8086匯編語言編寫的(boot/bootsect.S),它將由BIOS讀入到內(nèi)存0x7C00處,當(dāng)它被執(zhí)行時(shí)就會把自己移到絕對地址0x90000處,并將啟動設(shè)備(boot/setup.S)的下2kB字節(jié)的代碼讀入內(nèi)存0x90200處,而內(nèi)核的其它部分則被讀入到地址0x10000處。在系統(tǒng)加載期間將顯示信息"Loading..."。然后控制權(quán)將傳遞給boot/Setup.S中的代碼,這是另一個(gè)實(shí)模式匯編語言程序。啟動部分識別主機(jī)的某些特性以及vga卡的類型。如果需要,它會要求用戶為控制臺選擇顯示模式。然后將整個(gè)系統(tǒng)從

5、地址0x10000移至0x1000處,進(jìn)入保護(hù)模式并跳轉(zhuǎn)至系統(tǒng)的余下部分(在0x1000處)。下一步是內(nèi)核的解壓縮。0x1000處的代碼來自于zBoot/head.S,它初始化寄存器并調(diào)用decompress_kernel(),它們依次是由zBoot/inflate.c、zBoot/unzip.c和zBoot/misc.c組成。被解壓的數(shù)據(jù)存放到了地址0x10000處(1兆),這也是為什么Linux不能運(yùn)行于少于2兆內(nèi)存的主要原因。[在1兆內(nèi)存中解壓內(nèi)核的工作已經(jīng)完成,見MemorySavers--ED]將內(nèi)核封裝在一個(gè)gzi

6、p文件中的工作是由zBoot目錄中的Makefile以及工具完成的。它們是值得一看的有趣的文件。內(nèi)核發(fā)行版1.1.75將boot和zBoot目錄下移到了arch/i386/boot中了,這個(gè)改動意味著對不同的體系結(jié)構(gòu)允許真正的內(nèi)核建造,不過我將仍然只講解有關(guān)i386的信息。解壓過的代碼是從地址0x10100處開始執(zhí)行的第9頁共9頁Linux內(nèi)核源代碼漫游創(chuàng)建時(shí)間:2001-10-1121時(shí)13分[這里我可能忘記了具體的物理地址了,因?yàn)槲覍ο鄳?yīng)的代碼不是很熟],在那里,所有32比特的設(shè)置啟動被完成:IDT、GDT以及LDT被加載

7、,處理器和協(xié)處理器也已確認(rèn),分頁工作也設(shè)置好了;最終調(diào)用start_kernel子程序。上述操作的源代碼是在boot/head.S中的,這可能是整個(gè)內(nèi)核中最有訣竅的代碼了。注意如果在前述任何一步中出了錯,計(jì)算機(jī)就會死鎖。在操作系統(tǒng)還沒有完全運(yùn)轉(zhuǎn)之前是處理不了出錯的。start_kernel()是位于init/main.c中的,并且沒有任何返回結(jié)果。從現(xiàn)在起的任何代碼都是用C語言編制的,除了中斷管理和系統(tǒng)調(diào)用的入/出代碼(當(dāng)然,還有大多數(shù)的宏都嵌入了匯編代碼)。讓輪子轉(zhuǎn)動起來在處理了所有錯綜復(fù)雜的問題之后,start_kerne

8、l()初始化了內(nèi)核的所有部分,尤其是:·設(shè)置內(nèi)存邊界和調(diào)用paging_init();·初始化中斷、IRQ通道和調(diào)度;·分析(解析)命令行;·如果需要,就分配一個(gè)數(shù)據(jù)緩沖區(qū)(profilingbuffer)以及其它一些小部分;·校正延遲循環(huán)(計(jì)算“BogoMips”數(shù));·檢

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動畫的文件,查看預(yù)覽時(shí)可能會顯示錯亂或異常,文件下載后無此問題,請放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(fù)責(zé)整理代發(fā)布。如果您對本文檔版權(quán)有爭議請及時(shí)聯(lián)系客服。
3. 下載前請仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動等原因無法下載或下載錯誤,付費(fèi)完成后未能成功下載的用戶請聯(lián)系客服處理。