




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、linux內(nèi)核今斬方該linux的最人的好處之一就是它的源碼公開(kāi)。同時(shí),公開(kāi)的核心源碼也吸引著無(wú)數(shù)的電 腦愛(ài)好者和程序員;他們把解讀利分析linux的核心源碼作為口己的最大興趣,把修改 linux源碼和改造linux系統(tǒng)作為h己對(duì)計(jì)算機(jī)技術(shù)追求的最大目標(biāo)。linux內(nèi)核源碼是很具吸引力的,特別是當(dāng)你弄懂了一個(gè)分析了好久都沒(méi)搞懂的問(wèn)題; 或者是被你修改過(guò)了的內(nèi)核,順利通過(guò)編譯,一切運(yùn)行正常的時(shí)候。那種成就感真是油然而 生!而且,對(duì)內(nèi)核的分析,除了出白對(duì)技術(shù)的狂熱追求之外,這種令人生畏的勞動(dòng)所帶來(lái)的 回報(bào)也是非常令人看迷的,這也正是它擁有眾多追隨者的主耍原因: 首先,你可以從中學(xué)到很多的計(jì)算機(jī)的底
2、層知識(shí),如后面將講到的系統(tǒng)的引導(dǎo)和硬 件捉供的中斷機(jī)制等;其它,象虛擬存儲(chǔ)的實(shí)現(xiàn)機(jī)制,多任務(wù)機(jī)制,系統(tǒng)保護(hù)機(jī)制 等等,這些都是非都源碼不能體會(huì)的。 同時(shí),你還將從操作系統(tǒng)的整體結(jié)構(gòu)中,體會(huì)整體設(shè)計(jì)在軟件設(shè)計(jì)中的份量和作用, 以及一些宏觀設(shè)計(jì)的方法和技巧:linux的內(nèi)核為上層應(yīng)用捉供一個(gè)與具體硬件不 相關(guān)的平臺(tái);同時(shí)在內(nèi)核內(nèi)部,它乂把代碼分為與體系結(jié)構(gòu)和硬件相關(guān)的部分,和 可移植的部分;再例如,linux雖然不是微內(nèi)核的,但他把大部分的設(shè)備驅(qū)動(dòng)處理 成相對(duì)獨(dú)立的內(nèi)核模塊,這樣減小了內(nèi)核運(yùn)行的開(kāi)銷,增強(qiáng)了內(nèi)核代碼的模塊獨(dú)立 性。 而且你還能從対內(nèi)核源碼的分析中,體會(huì)到它在解決某個(gè)貝-體細(xì)節(jié)問(wèn)題時(shí)
3、,方法的 巧妙:如后而將分析到了的linux通過(guò)botoom_half機(jī)制來(lái)加快系統(tǒng)對(duì)中斷的處 理。 最重要的是:在源碼的分析過(guò)程中,你將會(huì)被一點(diǎn)一點(diǎn)地、潛移默化地專業(yè)化。一 個(gè)專業(yè)的程序員,總是把代碼的清晰性,兼容性,可移植性放在很重要的位置。他 們總是通過(guò)定義大量的宏,來(lái)增強(qiáng)代碼的清晰度和可讀性,而乂不增加編譯后的代 碼長(zhǎng)度和代碼的運(yùn)行效率;他們總是在編碼的同時(shí),就考慮到了以后的代碼維護(hù)和 升級(jí)。英至,只要分析百分之一的代碼示,你就會(huì)深刻地體會(huì)到,什么樣的代碼才 是一個(gè)專業(yè)的程序員寫的,什么樣的代碼是一個(gè)業(yè)余愛(ài)好者寫的。而這一點(diǎn)是任何 沒(méi)有真正分析過(guò)標(biāo)準(zhǔn)代碼的人都無(wú)法體會(huì)到的。然而,山于內(nèi)
4、核代碼的冗長(zhǎng),和內(nèi)核體系結(jié)構(gòu)的龐雜,所以分析內(nèi)核也是一個(gè)很艱難, 很需耍毅力的事;在缺乏指導(dǎo)和交流的情況下,尤其如此。只有方法正確,才能事半功倍。 正是基于這種考慮,作者希望通過(guò)此文能給大家一些借鑒和啟迪。山于本人所進(jìn)行的分析都是基于2.2.5版木的內(nèi)核;所以,如果沒(méi)有特別說(shuō)明,以下 分析都是基于i386單處理器的2.2.5版木的linux內(nèi)核。所侑源文件均是相對(duì)于目錄 /usr/src/linux 的。方法之一:從何入手要分析linux內(nèi)核源碼,首先必須找到各個(gè)模塊的位置,也即要弄懂源碼的文件組織 形式。雖然對(duì)于有經(jīng)驗(yàn)的高手而言,這個(gè)不是很難;但對(duì)于很多初級(jí)的linux愛(ài)好者,和 那些對(duì)源碼
5、分析很有興趣但接觸不多的人來(lái)說(shuō),這還是很有必要的。1、linux核心源程序通常都安裝在/usr/src/linux下,而且它有一個(gè)非常簡(jiǎn)單的編號(hào) 約定:任何偶數(shù)的核心(的二個(gè)數(shù)為偶數(shù),例如2.0.30)都是一個(gè)穩(wěn)定地發(fā)行的核心,而 任何奇數(shù)的核心(例如2.1.42)都是一個(gè)開(kāi)發(fā)小的核心。2、核心源程序的文件按樹(shù)形結(jié)構(gòu)進(jìn)行組織,在源程序樹(shù)的最上層,即目錄 /usr/src/linux下有這樣一些目錄和文件: copying: gpl版權(quán)申明。對(duì)具有g(shù)pl版權(quán)的源代碼改動(dòng)而形成的程序,或使用gpl 工具產(chǎn)生的程序,具有使用gpl發(fā)表的義務(wù),如公開(kāi)源代碼; credits:光榮榜。對(duì)linux做出過(guò)
6、很人貢獻(xiàn)的一些人的信息; maintainers:維護(hù)人員列表,對(duì)當(dāng)前版本的內(nèi)核各部分都有誰(shuí)負(fù)責(zé); makefile:第一個(gè)makefile文件。用來(lái)組織內(nèi)核的各模塊,記錄了個(gè)模塊間的相互這 間的聯(lián)系和依托關(guān)系,編譯時(shí)使用;仔細(xì)閱讀各子日錄下的makefile文件對(duì)弄清各個(gè)文件 這間的聯(lián)系和依托關(guān)系很有幫助; readme:核心及其編譯配置方法簡(jiǎn)單介紹; rules.make:各種makefilemake所使用的一些共同規(guī)則; reportingbugs:有關(guān)扌艮告bug的一些內(nèi)容; arch/ : arch子冃錄包括了所有和體系結(jié)構(gòu)相關(guān)的核心代碼。它的每一個(gè)子冃錄都代表 -種支持的體系結(jié)構(gòu),
7、例如386就是關(guān)于intel cpu及與z相兼容體系結(jié)構(gòu)的子目錄。pc 機(jī)一般都基于此冃錄; include/: include子1=1錄包括編譯核心所需要的人部分頭文件。與平臺(tái)無(wú)關(guān)的頭文件在 include/linux子h錄下,與intel cpu相關(guān)的頭文件在include/asm-i386子冃錄卜:而 include/scsi目錄則是有關(guān)scsi設(shè)備的頭文件目錄; init/:這個(gè)目錄包含核心的初始化代碼(注:不是系統(tǒng)的引導(dǎo)代碼),包含兩個(gè)文件main.c 和version.c,這是研究核心如何工作的好的起點(diǎn)2。 mm/:這個(gè)目錄包括所有獨(dú)立于cpu體系結(jié)構(gòu)的內(nèi)存管理代碼,如頁(yè)式存儲(chǔ)管理
8、內(nèi)存的 分配和釋放等;而和體系結(jié)構(gòu)相關(guān)的內(nèi)存管理代碼則位于arch/*/mm/,例如 arch/i386/mm/fault.c; kernel/:主要的核心代碼,此冃錄下的文件實(shí)現(xiàn)了大多數(shù)linux系統(tǒng)的內(nèi)核函數(shù),其中 最重要的文件當(dāng)屬sched.c;同樣,和體系結(jié)構(gòu)相關(guān)的代碼在arch/*/kernel中; drivers/:放置系統(tǒng)所有的設(shè)備驅(qū)動(dòng)程序;每種驅(qū)動(dòng)程序又各占用一個(gè)了目錄:如,/block 下為塊設(shè)備驅(qū)動(dòng)程序,比如ide (ide.c)o如果你希望查看所有可能包含文件系統(tǒng)的設(shè)備是 如何初始化的,你可以看drivers/block/genhd.c中的device_setup()o它
9、不僅初始化 硬盤,也初始化網(wǎng)絡(luò),因?yàn)榘惭bnfs文件系統(tǒng)的時(shí)候盂要網(wǎng)絡(luò); documentation/:文檔目錄,沒(méi)有內(nèi)核代碼,只是一套有用的文檔,可惜都是english 的,看看應(yīng)該有用的哦; fs/:所有的文件系統(tǒng)代碼和各種類型的文件操作代碼,它的每一個(gè)子目錄支持一個(gè)文件 系統(tǒng),例如fat和ext2; ipc/:這個(gè)目錄包含核心的進(jìn)程間通訊的代碼; lib/:放置核心的庫(kù)代碼; net/:核心與網(wǎng)絡(luò)相關(guān)的代碼; modules/:模塊文件目錄,是個(gè)空目錄,用于存放編譯時(shí)產(chǎn)生的模塊目標(biāo)文件; scripts/:描述文件,腳本,用于對(duì)核心的配置;-般,在每個(gè)子目錄下,都有一個(gè)makefile和一
10、個(gè)readme文件,仔細(xì)閱讀這兩個(gè) 文件,對(duì)內(nèi)核源碼的理解很有用。對(duì)linux內(nèi)核源碼的分析,有兒個(gè)很好的入口點(diǎn):一個(gè)就是系統(tǒng)的引導(dǎo)和初始化,即 從機(jī)器加電到系統(tǒng)核心的運(yùn)行;另外一個(gè)就是系統(tǒng)調(diào)川,系統(tǒng)調(diào)川是川戶程序或操作調(diào)川核 心所提供的功能的接口。對(duì)于那些對(duì)硬件比較熟悉的愛(ài)好者,從系統(tǒng)的引導(dǎo)入手進(jìn)行分析, 可能來(lái)的容易一些;而從系統(tǒng)調(diào)用下口,則可能更合適于那些在dos或uinx、linux下有 過(guò)c編程經(jīng)驗(yàn)的高手。這兩點(diǎn),在后面還將介紹到。方法之二:以程序流程為線索,一線串珠從表而上看,linux的源碼就彖一團(tuán)扎亂無(wú)章的亂麻,其實(shí)它是一個(gè)組織得有條有理的 蛛網(wǎng)。要把整個(gè)結(jié)構(gòu)分析清楚,除了找出
11、線頭,還得理順各個(gè)部分z間的關(guān)系,有條不紊的 一點(diǎn)一點(diǎn)的分析。所謂以程序流程為線索、一線串珠,就是指根據(jù)程序的執(zhí)行流程,把程序執(zhí)行過(guò)程所涉 及到的代碼分析清楚。這種方法最典型的應(yīng)用有兩個(gè):一是系統(tǒng)的初始化過(guò)程;二是應(yīng)用程 序的執(zhí)行流程:從程序的裝載,到運(yùn)行,一直到程序的退出。為了簡(jiǎn)便起見(jiàn),遵從循序漸進(jìn)的原理,現(xiàn)就系統(tǒng)的初始化過(guò)程來(lái)具體的介紹這種方法。 系統(tǒng)的初始化流程包括:系統(tǒng)引導(dǎo),實(shí)模式下的初始化,保護(hù)模式下的初始化共三個(gè)部分。 下而將一一介紹。inux系統(tǒng)的常見(jiàn)引導(dǎo)方式冇兩種:lilo引導(dǎo)和loadin引導(dǎo);同時(shí)linux內(nèi)核也自帶 了一個(gè)bootsect-loaden ill于它只能實(shí)現(xiàn)
12、linux的引導(dǎo),不像前兩個(gè)那樣具有很大的靈活 性(lilo可實(shí)現(xiàn)多重引導(dǎo)、loadin可在dos下引導(dǎo)linux),所以在普通應(yīng)用場(chǎng)合實(shí)際上很 少使用bootsectloader。當(dāng)然,bootsectloader也具有它口己的優(yōu)點(diǎn):短小沒(méi)有多余 的代碼、附帶在內(nèi)核源碼中、是內(nèi)核源碼的有機(jī)組成部分,等等。bootsect-loader在內(nèi)和源碼中對(duì)應(yīng)的程序是/arch/i386/boot/bootsect.s。下面 將主耍是針對(duì)此文件進(jìn)行的分析。1. 幾個(gè)相關(guān)文件:<1> /arch/i386/boot/bootsect.s<2> /include/linux/con
13、figh<3> /include/asm/boot.h<4> /include/linux/autoconf.h2. 引導(dǎo)過(guò)程分析:對(duì)于intel x86 pc z開(kāi)啟電源后,機(jī)器就會(huì)開(kāi)始執(zhí)行rom bios的一系列系統(tǒng)測(cè) 試動(dòng)作,包括檢查ram, keyboard,顯示器,軟硬磁盤等等。執(zhí)行完bios的系統(tǒng) 測(cè)試乙后,緊接著控制權(quán)會(huì)轉(zhuǎn)移給rom中的啟動(dòng)程序(rom bootstrap routine); 這個(gè)程序會(huì)將磁盤上的第0軌第0扇區(qū)(iih boot sector或mbr ,系統(tǒng)的引導(dǎo)程 序就放在此處)讀入內(nèi)存中,并放到自0x07c0:0x0000開(kāi)始的512個(gè)
14、字節(jié)處; 然后處理機(jī)將跳到此處開(kāi)始執(zhí)行這一引導(dǎo)程序;也即裝入mbr中的引導(dǎo)程序后, cs:ip = 0x07c0:0x0000。加電示處理機(jī)運(yùn)行在與8086相兼容的實(shí)模式下。如果要用bootsect-loader進(jìn)行系統(tǒng)引導(dǎo),則必須把bootsect.s編譯連接后對(duì)應(yīng) 的二進(jìn)制代碼置于mbr;當(dāng)rom bios把bootsect.s編譯連接后對(duì)應(yīng)的二進(jìn) 制代碼裝入內(nèi)存后,機(jī)器的控制權(quán)就完全轉(zhuǎn)交給bootsect;也就是說(shuō),bootsect 將是第一個(gè)被讀入內(nèi)存中并執(zhí)行的程序。bootsect接管機(jī)器控制權(quán)后,將依次進(jìn)行以下一些動(dòng)作:1. 首先,bootsect將它”白己”(自位置0x07c0:
15、0x0000開(kāi)始的512個(gè)字節(jié))從 被rom bios載入的地址0x07c0:0x0000處搬至i0x9000:0000處;這一任務(wù) 由bootsect.s的前十條指令完成;第十一條指令''jmpi go,initseg則把機(jī)器跳 轉(zhuǎn)到''新"的 bootsect 的''jmpi go,initseg"后的那條指令''go: mov di,#0x4000-12z/;之后,繼續(xù)執(zhí)行bootsect的剩下的代碼;在bootsect.s中定 義了幾個(gè)常量:boots eg = 0x07c0 bios載入mbr的約定位
16、置的段址;in its eg = 0x9000 bootsect.s的前十條指令將自己搬到此處(段址)setupseg =0x9020 裝入 setup.s 的段址sysseg =0x1000系統(tǒng)區(qū)段址對(duì)于這些常量可參winclude/asm/boot.h中的定義;這些常量在下面的分析中將 會(huì)經(jīng)常用到;2. 以0x9000:0x4000-12為棧底,建立自己的棧區(qū);其中0x9000:0x4000-12 到0x9000:0x4000的一十二個(gè)字節(jié)預(yù)留作磁盤參數(shù)表區(qū);3. 在0x9000:0x4000-12到0x9000:0x4000的-二個(gè)預(yù)留字節(jié)屮建立新的 磁盤參數(shù)表,之所以叫'
17、9;新的磁盤參數(shù)表,是相對(duì)于bios建立的磁盤參數(shù)表而言的。 由于設(shè)計(jì)者考慮到有些老的bios不能準(zhǔn)確地識(shí)別磁盤''每個(gè)磁道的扇區(qū)數(shù),從而導(dǎo) 致bios建立的磁盤參數(shù)表妨礙磁盤的最高性能發(fā)揮,所以,設(shè)計(jì)者就在bios建立 的磁盤參數(shù)表的革礎(chǔ)上通過(guò)枚舉法測(cè)試,試圖建立準(zhǔn)確的''新的磁盤參數(shù)表(這是在 后繼步驟屮完成的):并把參數(shù)表的位直由原來(lái)的0x0000:0x0078搬到 0x9000:0x4000-1厶且修改老的磁盤參數(shù)表區(qū)使之指向新的磁盤參數(shù)表;4. 接下來(lái)就到t load_setup子過(guò)程;它調(diào)用0x13中斷的第2號(hào)服務(wù);把第0 道第2扇區(qū)開(kāi)始的連續(xù)的se
18、tup_sects (為常量4)個(gè)扇區(qū)讀到緊鄰bootsect的內(nèi) 存區(qū);,即0x9000:0x0200開(kāi)始的2048個(gè)字節(jié);而這四個(gè)扇區(qū)的內(nèi)容即是/arch/i386/boot/setup.s編譯連接后對(duì)應(yīng)的二進(jìn)制代碼;也就是說(shuō),如果要用 bootsect-loader進(jìn)行系統(tǒng)引導(dǎo),不僅必須把bootsect.s編譯連接后對(duì)應(yīng)的二進(jìn) 制代碼置于mbr,而述得把setup.s編譯連接后對(duì)應(yīng)的二進(jìn)制代碼置于緊跟mbr 示的連續(xù)的四個(gè)扇區(qū)屮;當(dāng)然,由于setup.s對(duì)應(yīng)的可執(zhí)行碼是由bootsect裝載 的,所以,在我們的這個(gè)項(xiàng)目屮可以通過(guò)修改bootsect來(lái)根據(jù)需要隨意地放宜 setup.s對(duì)
19、應(yīng)的可執(zhí)行碼;5. ioad_setup子過(guò)程的唯-磁盤''每個(gè)磁道的扇區(qū)數(shù);出口是probejoop子過(guò)程;該過(guò)程通過(guò)枚舉法測(cè)試6接下來(lái)幾個(gè)子過(guò)程比較清晰易懂:打印我們熟悉的''loading";讀入系統(tǒng)到 0x1000:0x0000;關(guān)掉軟驅(qū)馬達(dá);根據(jù)的5步測(cè)出的''每個(gè)磁道的扇區(qū)數(shù)確定磁 盤類型;最后跳轉(zhuǎn)到0x9000:0x0200,即setup.s對(duì)應(yīng)的町執(zhí)行碼的入口,將機(jī) 器控制權(quán)轉(zhuǎn)交setup.s;整個(gè)bootsect代碼運(yùn)行完畢;3. 引導(dǎo)過(guò)程執(zhí)行完后的內(nèi)存印象圖:9000:4000-00系統(tǒng)區(qū)pootsect.ssetu
20、p.s棧區(qū)希的磁盤參數(shù)區(qū)1000:00008f00:0000陰血4叩0川 oq:4qqq-oc出于簡(jiǎn)便考慮,在此分析中,我忽略了對(duì)大內(nèi)核的處理的分析,因?yàn)閷?duì)大內(nèi)核的處理, 只是此引導(dǎo)過(guò)程中的一個(gè)很小的部分,并不影響對(duì)整體的把握。完成了系統(tǒng)的引導(dǎo)后,系統(tǒng) 將進(jìn)入到初始化處理階段。系統(tǒng)的初始化分為實(shí)模式和保護(hù)模式兩部分。i i、實(shí)模式下的初始化實(shí)模式下的初始化,主要是指從內(nèi)核引導(dǎo)成功后,到進(jìn)入保護(hù)模式z前系統(tǒng)所做的一些 處理。在內(nèi)核源碼屮對(duì)應(yīng)的程序是/arch/i386/boot/setup.s;以卞部分主要是針對(duì)此文 件進(jìn)行的分析。這部分的分析主要是要弄懂它的處理流程和initseg(9000:
21、0000)段參數(shù) 表的建立,此參數(shù)表包含了很多破件參數(shù),這些都是以后進(jìn)行保護(hù)模式下初始化,以及核心 建立的基礎(chǔ)。1. 幾個(gè)其它相關(guān)文件:vl> /arch/i386/boot/bootsect.s<2> /include/linux/config.h<3> /include/asm/booth<4> /include/ asm/segment.h<5> /include/linux/version.h<6> /include/linux/compileh2. 實(shí)模式下的初始化過(guò)程分析:linuz實(shí)模式下的初始化擁圈一j開(kāi)始正確不
22、王確調(diào)整系統(tǒng)內(nèi)核段地址到正確位直障來(lái)的靈統(tǒng)內(nèi)褸段地址 為mqx乏礙的段址還 必須加上setup余部占 用的空何.復(fù)位硬盤系統(tǒng)a55” 和"5a5a'冶5和t詩(shī)計(jì)伐于setup. s 軻*毘.1e確i則setup區(qū)金卻 裝在 9q9q; 02005000; qqqn 何;直則,余鄒和柔統(tǒng)內(nèi)孩一起 裝在 io1q:qqqqn直.箭出 *no setup signature found "4進(jìn)入死循環(huán)f-0輸出"囚rong loader:giving up.m進(jìn)入死循環(huán)內(nèi)核是老引導(dǎo)程耗椅setup余部搬至前部setup之民 即9o0o:aooo不正確止呷駛 ex
23、ten血d memory 大4、并存入 9000:0002a55” 和 “5a5v再次檢查簽茗入的大為核?設(shè)苴 keyboard repfat rate 為 max周用隕血o程序,設(shè)直視頻參數(shù)舟 hdo 和 hdal 的參數(shù),從 x0000:4*0x41 的32個(gè)字節(jié)殿到0x0x9000:0x0080i nitseg( 900 0:00 00)段參數(shù)表:(參見(jiàn) in elude/ li nu x/ tty.h)參數(shù)名偏移量(段址均為0x9000)長(zhǎng)度byte參考文件param_cursor_pos0x00002arch/i386/boot/video.sextended mem size0x0
24、0022arch/i386/boot/setup.sparam_video_page0x00042arch/i386/boot/video.sparam_video_mode0x00061arch/i386/boot/video.sparam_video_cols0x00071arch/i386/boot/video.s沒(méi)用0x00082include/linux/tty.hparam_video_ega_bx0x000a2arch/i386/boot/video.s沒(méi)用0x000c2include/linux/tty.hparam_video_linesoxoooe1arch/i386/bo
25、ot/video.sparam_have_vgaoxooof1arch/i386/boot/video.sparam_font_points0x00102arch/i386/boot/video.sparam_lfb_width0x00122arch/i386/boot/video.sparam_lfb_height0x00142arch/i386/boot/video.sparam_lfb_depth0x00162arch/i386/boot/video.sparam_lfb_base0x00184arch/i386/boot/video.sparam_lfb_size0x001c4arch
26、/i386/boot/video.s暫未用0x00204in clude/li nux/tty.hparam_lfb_linelength0x00242arch/i386/boot/video.sparam_lfb_colors0x00266arch/i386/boot/video.s暫未用0x002c2arch/i386/boot/video.sparam_vesapm_seg0x002e2arch/i386/boot/video.sparam_vesapm_off0x00302arch/i386/boot/video.sparam_lfb_pages0x00322arch/i386/boo
27、t/video.s保留0x0034-0x003finclude/linux/tty.hapm bios version0x00402arch/i386/boot/setup.sbios code segment0x00422arch/i386/boot/setup.sbios entry offset0x00444arch/i386/boot/setup.sbios 16 bit code seg0x00482arch/i386/boot/setup.sbios data segment0x004a2arch/i386/boot/setup.s支持32位標(biāo)志0x004c2arch/i386/b
28、oot/setup.sbios code seg length0x004e4arch/i386/boot/setup.sbios data seg length0x00522arch/i386/boot/setup.shdo參數(shù)0x008016arch/i386/boot/setup.shdo參數(shù)0x009016arch/i386/boot/setup.sps/2 device 標(biāo)志oxolff1arch/i386/boot/setup.s* 注: include/linux/tty.h : cl_magic and cl_offset here1. include/linux/tty.h :
29、unsigned char rsvd_size; /* 0x2c */ unsigned char rsvd_pos; /* 0x2d */ 0表示沒(méi)有apm bios 0x0002直位表示支持32位模式 0表示沒(méi)有,oxoaa表示有鼠標(biāo)器i i丨、保護(hù)模式下的初始化保護(hù)模式下的初始化,是指處理機(jī)進(jìn)入保護(hù)模式后到運(yùn)行系統(tǒng)第一個(gè)內(nèi)核程序過(guò)程小系 統(tǒng)所做的一些處理。保護(hù)模式下的初始化在內(nèi)核源碼中對(duì)應(yīng)的程序是 /arch/i386/boot/compressed/head.s 和 /arch/i386/kernel/head.s ;以下部分 主要是針對(duì)這兩個(gè)文件進(jìn)行的分析。1. 幾個(gè)相關(guān)文件:<
30、;2.> /arch/i386/kernel/head.s<3.> /arch/i386/boot/compressed/misc.c<4.> /arch/i386/boot/setup.sv5> /include/ asm/segment.h<6.> /arch/i386/kernel/traps.c<7.> /include/i386/desc.h<8.> /include/asm-i386/processor.h2. 保護(hù)模式下的初始化過(guò)程分析:一、/ arch/ i386/ kernel/ head.s 流程:注意
31、從此均 為保護(hù)虛擬 方式尋址initseg段的參數(shù)參見(jiàn) “實(shí)模式下的初始化j emp ty_z er o_p age 后 2k 將作為命令緩沖區(qū)更制 initseg 段的參數(shù)到 empty_zeroj3age 前2k,后2k清零emp ty_z er o_p age 位 于0x105000 大小 4k將 cl_base_addr:cl_offset 開(kāi)始的 2k 個(gè)字節(jié)拷貝到empty zercij)qge的后'2k/arch/i386/kernel/hea<l s 流程圖一開(kāi)始用 kernel ds 初始化 ds3 es3 fs3 gs此時(shí)頁(yè)目錄只定義了 2個(gè)頁(yè)表項(xiàng): 第q項(xiàng)和
32、第76s項(xiàng) > 此兩頂祁對(duì) 應(yīng)同一個(gè)頁(yè)表0x00102 *同時(shí) head.s 也在 0x00102000 處定義 了 一個(gè)頁(yè)表毘0,該頁(yè)表對(duì)應(yīng)物理地 址的0一41皿即在0m,物理 地址與邏輯地址是一致的:當(dāng)然, 通過(guò)頁(yè)目錄的第g頂,也可訪 問(wèn)此段空間損卩3g3gb44ivi段 也段應(yīng)此段有關(guān)cpu的信息被放在一個(gè) 命名boot_cpn_data的結(jié)構(gòu) cpui n£o_x86 中參見(jiàn)i ncl ude/ asm- i 386 /pr ocessor. h檢查cpu類型,保存cpu信息;并根據(jù)不同類型的cpu來(lái)重新初始化cr0此時(shí)idt已經(jīng)初始化了, 只需裝載到idtr即可檢查協(xié)
33、處理器是否有效,無(wú)效則將已抽首位、否則復(fù)位,同時(shí)對(duì)保存cpu信息的相應(yīng)單元進(jìn)行標(biāo)示,在進(jìn)入保護(hù)模式前,已初始化 了一個(gè)只含兩個(gè)有效系統(tǒng)段 的gdt :此處重新建立gdt, 新的gdt位于0x106000 >共 12+2*nr_tasks 個(gè)項(xiàng)每頂 8byg設(shè)置了兩個(gè)系統(tǒng)啟和 兩個(gè)用戶段,都是從0開(kāi)始的 4g大小,還設(shè)了 4個(gè)apm段正常情況下 > 不會(huì)遞 回,若返回則不正 常,所以死循環(huán)二、/arch/i386/boot/compressed/head.s 流程:/arch/i386/boc3t/c(wte£g 巳 d/he8<t s 流程圖 |1. 從流程圖中可以看到,保護(hù)模式下的初始化主要t了這樣兒件事:a解壓內(nèi)核到0x100000處、b
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度金融行業(yè)員工勞動(dòng)集體合同(風(fēng)險(xiǎn)管理)
- 二零二五年度房屋抵押擔(dān)保企業(yè)節(jié)能減排貸款協(xié)議
- 二零二五停薪留職員工離職權(quán)益保障與就業(yè)創(chuàng)業(yè)輔導(dǎo)合同
- 二零二五年度國(guó)際學(xué)術(shù)研討會(huì)贊助協(xié)議
- 二零二五年度柴油價(jià)格風(fēng)險(xiǎn)管理合同
- 美術(shù)課后特色課題申報(bào)書
- 安裝路燈施工合同
- 2024-2025學(xué)年陜西省西安市高一上學(xué)期期末考試地理試卷(解析版)
- 旅游管理學(xué)專業(yè)知識(shí)應(yīng)用能力測(cè)試卷
- 自我探索與成長(zhǎng)(山東女子學(xué)院)知到課后答案智慧樹(shù)章節(jié)測(cè)試答案2025年春山東女子學(xué)院
- 城市軌道交通行車組織 課件 項(xiàng)目二任務(wù)六 車站行車組織作業(yè)
- 2025年國(guó)家自然科學(xué)基金委員會(huì)招聘流動(dòng)編制人員59人歷年高頻重點(diǎn)模擬試卷提升(共500題附帶答案詳解)
- 歷史地理學(xué)研究-深度研究
- 2025江蘇太倉(cāng)市城市建設(shè)投資集團(tuán)限公司招聘易考易錯(cuò)模擬試題(共500題)試卷后附參考答案
- 2.2 學(xué)會(huì)管理情緒(同步課件)2024-2025學(xué)年七年級(jí)道德與法治下冊(cè)(統(tǒng)編版2024)
- 14磁極與方向(教學(xué)設(shè)計(jì))-二年級(jí)科學(xué)下冊(cè)(教科版)
- 2025年山西經(jīng)貿(mào)職業(yè)學(xué)院高職單招職業(yè)技能測(cè)試近5年常考版參考題庫(kù)含答案解析
- 2024年09月江蘇2024年蘇州金融租賃校園招考筆試歷年參考題庫(kù)附帶答案詳解
- 2025年北方聯(lián)合電力有限責(zé)任公司招聘筆試參考題庫(kù)含答案解析
- 高教社馬工程倫理學(xué)(第二版)教學(xué)課件02
- 《榜樣9》觀后感心得體會(huì)二
評(píng)論
0/150
提交評(píng)論