版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、2021/8/21第五章 Linux 的內(nèi)核的內(nèi)核5.1 Linux 內(nèi)核概述5.2 Linux 內(nèi)核模塊簡(jiǎn)介5.3 Linux 的編譯和定制5.4 Linux 系統(tǒng)調(diào)用舉例2021/8/225.1 Linux 內(nèi)核概述o 5.1.1 Linux 內(nèi)核和功能結(jié)構(gòu)o 5.1.2 Linux 內(nèi)核源代碼布局o 5.1.3 內(nèi)核的移植2021/8/235.1.1 Linux 內(nèi)核和功能結(jié)構(gòu)o 內(nèi)核(kernel)是操作系統(tǒng)的內(nèi)部核心程序,它向外部提供了對(duì)計(jì)算機(jī)系統(tǒng)資源進(jìn)行請(qǐng)求和管理的調(diào)用接口和服務(wù) 2021/8/24內(nèi)核o 可以將操作系統(tǒng)的代碼分成兩部分:n內(nèi)核所在的地址空間稱為內(nèi)核空間;n而在內(nèi)核
2、以外,剩下的程序統(tǒng)稱為外部管理程序,它們大部分是對(duì)外圍設(shè)備的管理和界面操作,外部管理程序與用戶進(jìn)程所占據(jù)的地址空間稱為外部空間。o 通常,一個(gè)程序會(huì)跨越兩個(gè)空間。n當(dāng)執(zhí)行到內(nèi)核空間的一段代碼時(shí),稱程序處于內(nèi)核態(tài)n當(dāng)程序執(zhí)行到外部空間代碼時(shí),稱程序處于用戶態(tài)。2021/8/255.1.1 Linux 內(nèi)核和功能結(jié)構(gòu)o 常見(jiàn)的OS內(nèi)核有兩個(gè)模式:n 微內(nèi)核(micro-kernel) n 單一內(nèi)核(Monolithic kernel) 2021/8/26微內(nèi)核o 在微內(nèi)核結(jié)構(gòu)中,操作系統(tǒng)的內(nèi)核只需要提供最基本,最核心的一部分操作(比如創(chuàng)建和刪除任務(wù),內(nèi)存管理,中斷管理等)o 其他的管理程序(如文件
3、系統(tǒng),網(wǎng)絡(luò)協(xié)議棧等)則盡可能地放在內(nèi)核以外。這些外部程序可以獨(dú)立運(yùn)行,并對(duì)應(yīng)用程序提供操作系統(tǒng)服務(wù),服務(wù)之間使用進(jìn)程間通信機(jī)制(IPC)進(jìn)行交互。只在需要內(nèi)核的協(xié)助時(shí),才通過(guò)一套接口對(duì)內(nèi)核發(fā)出調(diào)用請(qǐng)求。2021/8/27微內(nèi)核優(yōu)點(diǎn)o 使操作系統(tǒng)具有良好的靈活性。使得操作系統(tǒng)內(nèi)部結(jié)構(gòu)變得簡(jiǎn)單清晰。o 在內(nèi)核以外的外部程序分別獨(dú)立運(yùn)行,其間并不互相關(guān)聯(lián)。這樣,可以對(duì)這些程序分別進(jìn)行維護(hù)和拆裝,只要遵循已經(jīng)規(guī)定好的界面,就不會(huì)對(duì)其他程序有任何干擾。這使得程序代碼在維護(hù)上十分方便,體現(xiàn)了面向?qū)ο筌浖慕Y(jié)構(gòu)特征。2021/8/28微內(nèi)核的不足o 首先,程序代碼之間的相互隔離,使得整個(gè)系統(tǒng)喪失了許多優(yōu)化的
4、機(jī)會(huì);o 其次,部分資源浪費(fèi)在外部進(jìn)程之間的通信上(進(jìn)程間通信的開(kāi)銷要比直接的函數(shù)調(diào)用大),這樣,微內(nèi)核結(jié)構(gòu)在效率上必然低于傳統(tǒng)的單一內(nèi)核結(jié)構(gòu),這些效率損失將作為結(jié)構(gòu)精簡(jiǎn)的代價(jià)。o 總體上說(shuō),在當(dāng)前的硬件條件下,微內(nèi)核在效率上的損失小于其在結(jié)構(gòu)上獲得的效益,故而選取微內(nèi)核成為操作系統(tǒng)的一大潮流。2021/8/295.1.1 Linux 內(nèi)核和功能結(jié)構(gòu)o Linux內(nèi)核屬于單一內(nèi)核n 參與Linux系統(tǒng)開(kāi)發(fā)的程序員大多數(shù)為世界各地的黑客們。比起結(jié)構(gòu)的清晰,他們更加注重功能的強(qiáng)大和高效率的代碼。n 他們將大量的精力花在優(yōu)化代碼上,而這樣的全局性優(yōu)化必然以損失結(jié)構(gòu)精煉作為代價(jià),導(dǎo)致Linux中的每個(gè)
5、部件都不能被輕易拆出,否則必然破壞整體效率。 2021/8/210Linux內(nèi)核o 雖然Linux是一個(gè)單一內(nèi)核操作系統(tǒng),但它與傳統(tǒng)的單一內(nèi)核UNIX操作系統(tǒng)不同。n 在普通單一內(nèi)核系統(tǒng)中,所有內(nèi)核代碼都是被靜態(tài)編譯和鏈接的。n 而在Linux中,可以動(dòng)態(tài)裝入和卸載內(nèi)核中的部分代碼。Linux中將這樣的代碼段稱做模塊(module),并對(duì)模塊給予了強(qiáng)有力的支持。在Linux中,可以在需要時(shí)自動(dòng)裝入和卸載模塊。 2021/8/2115.1.1 Linux 內(nèi)核和功能結(jié)構(gòu)o Linux內(nèi)核的結(jié)構(gòu)2021/8/2125.1.1 Linux 內(nèi)核和功能結(jié)構(gòu)o Linux 內(nèi)核主要由5 個(gè)模塊構(gòu)成,它們
6、分別是:n 進(jìn)程調(diào)度模塊:控制進(jìn)程對(duì)CPU 資源的使用 n 內(nèi)存管理模塊:確保所有進(jìn)程能夠安全地共享機(jī)器主內(nèi)存區(qū);虛擬內(nèi)存管理 n 文件系統(tǒng)模塊:支持對(duì)外部設(shè)備的驅(qū)動(dòng)和存儲(chǔ) n 進(jìn)程間通信模塊:支持多種進(jìn)程間的信息交換方式 n 網(wǎng)絡(luò)接口模塊:提供對(duì)多種網(wǎng)絡(luò)通信標(biāo)準(zhǔn)的訪問(wèn)并支持許多網(wǎng)絡(luò)硬件 2021/8/213內(nèi)核模塊之間的依賴關(guān)系 2021/8/214內(nèi)核模塊之間的依賴關(guān)系 o 所有的模塊都與進(jìn)程調(diào)度模塊存在依賴關(guān)系。因?yàn)樗鼈兌夹枰揽窟M(jìn)程調(diào)度程序來(lái)掛起(暫停)或重新運(yùn)行它們的進(jìn)程。通常,一個(gè)模塊會(huì)在等待硬件操作期間被掛起,而在操作完成后才可繼續(xù)運(yùn)行。2021/8/215內(nèi)核模塊之間的依賴關(guān)系
7、o 進(jìn)程調(diào)度子系統(tǒng)需要使用內(nèi)存管理器來(lái)調(diào)整一特定進(jìn)程所使用的物理內(nèi)存空間。o 進(jìn)程間通信子系統(tǒng)則需要依靠?jī)?nèi)存管理器來(lái)支持共享內(nèi)存通信機(jī)制。o 虛擬文件系統(tǒng)也會(huì)使用網(wǎng)絡(luò)接口來(lái)支持網(wǎng)絡(luò)文件系統(tǒng)(NFS),同樣也能使用內(nèi)存管理子系統(tǒng)來(lái)提供內(nèi)存虛擬盤(ramdisk)設(shè)備。o 而內(nèi)存管理子系統(tǒng)也會(huì)使用文件系統(tǒng)來(lái)支持內(nèi)存數(shù)據(jù)塊的交換操作。2021/8/2165.1.2 Linux 內(nèi)核源代碼布局o 安裝的時(shí)候,如果選擇了Kernel Develop,則會(huì)在/usr/scr/linux下找到源代碼o 根據(jù)各個(gè)目錄的名字,可以容易猜出各個(gè)目錄里面的文件的功能2021/8/2175.1.2 Linux 內(nèi)核源
8、代碼布局o Documentation o arch o drivers o fs o include o init o ipc o lib o mm o net o 2021/8/2185.1.2 Linux 內(nèi)核源代碼布局2021/8/2195.1.2 Linux 內(nèi)核源代碼布局2021/8/2205.1.2 Linux 內(nèi)核源代碼布局2021/8/221補(bǔ)充:Linux操作系統(tǒng)的啟動(dòng)o Boot Loader 把操作系統(tǒng)的代碼調(diào)入內(nèi)存后,會(huì)把控制權(quán)交給操作系統(tǒng),由操作系統(tǒng)的啟動(dòng)程序來(lái)完成剩下的工作。2021/8/222Linux操作系統(tǒng)啟動(dòng)的步驟o (1)把控制權(quán)交給Setup.S這段程
9、序o (2)進(jìn)入保護(hù)模式,同時(shí)把控制權(quán)交給Head.So (3)Head.S調(diào)用/init/main.C中的start_kernel函數(shù),啟動(dòng)程序從start_kernel()函數(shù)繼續(xù)執(zhí)行o (4)建立init進(jìn)程2021/8/223進(jìn)入操作系統(tǒng)(1)Setup.So 首先,Setup.S對(duì)已經(jīng)調(diào)入內(nèi)存的操作系統(tǒng)代碼進(jìn)行檢查,如果沒(méi)錯(cuò),它會(huì)通過(guò)BIOS中斷獲取內(nèi)存容量,硬盤等信息(實(shí)模式)o 準(zhǔn)備讓CPU進(jìn)入保護(hù)模式 a.先屏蔽中斷信號(hào) b.調(diào)用指令lidt和lgdt,對(duì)中斷向量表寄存器IDTR進(jìn)行初始化 c.對(duì)8259中斷控制器進(jìn)行編程 d.協(xié)處理器重新定位 完成這幾件事后,Setup.S設(shè)
10、置保護(hù)模式的標(biāo)志,重取指令,再用一條跳轉(zhuǎn)指令jmpi 0 x100000,KERNEL_CS。進(jìn)入保護(hù)模式下的啟動(dòng)階段,控制權(quán)交給Head.S.2021/8/224進(jìn)入操作系統(tǒng)(2)Head.So 也要先做屏蔽中斷一類的工作o 然后對(duì)中斷向量表做一定的處理o Boot Loader讀入內(nèi)存的啟動(dòng)參數(shù)和命令行參數(shù),Head.S把它們保存在empty_zero_page頁(yè)中o 檢查CPU類型o 對(duì)協(xié)處理器進(jìn)行檢查 o 頁(yè)初始化,調(diào)用setup_paging這個(gè)子函數(shù) o 因?yàn)橐堰M(jìn)入保護(hù)模式,段機(jī)制的多任務(wù)屬性體現(xiàn) 2021/8/225進(jìn)入操作系統(tǒng)(3)main.c中的初始化o Head.S調(diào)用/i
11、nit/main.c中的start_kernel函數(shù),把控制權(quán)交給它,這個(gè)函數(shù)是整個(gè)操作系統(tǒng)初始化的最重要的函數(shù),一旦它執(zhí)行完,整個(gè)操作系統(tǒng)的初始化也就完成了。2021/8/226進(jìn)入操作系統(tǒng)(3)main.c中的初始化o 計(jì)算機(jī)在執(zhí)行start_kernel前以進(jìn)入了保護(hù)模式,使處理器完全進(jìn)入了全面執(zhí)行操作系統(tǒng)代碼的狀態(tài)。o 但直到目前為止,這都是針對(duì)處理器的。而一旦start_kernel開(kāi)始執(zhí)行,Linux內(nèi)核就一步步展現(xiàn)。o Start_kernel執(zhí)行后,就可以以一個(gè)用戶的身份登陸和使用Linux了2021/8/227進(jìn)入操作系統(tǒng)(3)main.c中的初始化main.c中其他較為重要
12、的函數(shù)如下:o Setup_arch() 最基本硬件的初始化o Paging_init() 線性地址空間映射o Trap_init()中斷向量表初始化o Int_IRQ與中斷有關(guān)的初始化o Sched_init()進(jìn)程調(diào)度初始化o Console_init()對(duì)中斷的初始化o 對(duì)文件系統(tǒng)的初始化o Inode_initI() i節(jié)點(diǎn)管理機(jī)制初始化o Name_cache_init() 目錄緩存機(jī)制初始化o Buffer_init() 塊緩存機(jī)制初始化2021/8/228進(jìn)入操作系統(tǒng)(3)main.c中的初始化o 啟動(dòng)到了目前這種狀態(tài),只剩下運(yùn)行/etc下的啟動(dòng)配置文件。o 這時(shí)初始化程序并沒(méi)有
13、完成操作系統(tǒng)各個(gè)部分的初始化,更關(guān)鍵的文件系統(tǒng)的安裝還沒(méi)有涉及,這是在init進(jìn)程建立后完成的。就是start_kernel()最后部分內(nèi)容。2021/8/229進(jìn)入操作系統(tǒng)(4)建立init進(jìn)程o Linux要建立的第一個(gè)進(jìn)程是init進(jìn)程o 啟動(dòng)所需的Shell腳本文件 a.Linux系統(tǒng)啟動(dòng)所必須的 b.用戶登陸后自己設(shè)定的系統(tǒng)啟動(dòng)所必須的腳本存放在系統(tǒng)默認(rèn)的配置文件目錄/etc下。首先調(diào)用的是/etc/inittab.2021/8/2305.1.3 內(nèi)核的移植o Linux移植:n就是把Linux操作系統(tǒng)針對(duì)具體的目標(biāo)平臺(tái)做必要改寫之后,安裝到該目標(biāo)平臺(tái),使其正確地運(yùn)行起來(lái),即把內(nèi)核從
14、一種硬件平臺(tái)轉(zhuǎn)移到另外一種硬件平臺(tái)上運(yùn)行。這個(gè)概念目前在嵌入式開(kāi)發(fā)領(lǐng)域講的比較多。 o 對(duì)于嵌入式Linux系統(tǒng)來(lái)說(shuō),有各種體系結(jié)構(gòu)的處理器和硬件平臺(tái),并且用戶需要根據(jù)需求自己定制硬件板。只要硬件平臺(tái)有些變化,即使非常小,可能也需要做一些移植工作。2021/8/2315.1.3 內(nèi)核的移植o 內(nèi)核移植工作主要是修改跟硬件平臺(tái)相關(guān)的代碼,一般不涉及Linux內(nèi)核通用的程序。移植的難度也取決于兩種硬件平臺(tái)的差異。n Linux針對(duì)于特定的硬件平臺(tái)的軟件包叫做BSP(Board Support Package)。o 目前Linux內(nèi)核的社區(qū)已經(jīng)對(duì)常見(jiàn)的硬件平臺(tái)做了很多工作,移植工作已經(jīng)簡(jiǎn)單了n 通常
15、都可以找到相同處理器的參考板,并且可以獲取到Linux內(nèi)核源代碼。2021/8/232移植的準(zhǔn)備工作o 選擇參考板,獲取到Linux內(nèi)核源代碼:四點(diǎn)原則o 分析內(nèi)核代碼,弄清楚哪些設(shè)備有驅(qū)動(dòng)程序,哪些還沒(méi)有。o 確信Linux對(duì)參考板的支持情況,配置編譯Linux內(nèi)核,在目標(biāo)板上運(yùn)行測(cè)試。n可能最新的Linux內(nèi)核版本支持的最好,但是也可能需要在老內(nèi)核版本上打補(bǔ)丁。o 分析平臺(tái)相關(guān)的部分代碼實(shí)現(xiàn);分析內(nèi)核編譯組織方式;分析內(nèi)核啟動(dòng)的初始化程序;分析驅(qū)動(dòng)程序的實(shí)現(xiàn)。 2021/8/233移植過(guò)程的基本內(nèi)容o獲取某一版本的Linux內(nèi)核源碼,根據(jù)具體目標(biāo)平臺(tái)對(duì)源碼進(jìn)行必要的改寫(主要是修改體系結(jié)構(gòu)
16、相關(guān)部分)o然后添加一些外設(shè)的驅(qū)動(dòng),打造一款適合需要的目標(biāo)平臺(tái)(可以是嵌入式便攜設(shè)備也可以是其它體系結(jié)構(gòu)的PC機(jī))的新操作系統(tǒng),對(duì)該系統(tǒng)進(jìn)行針對(duì)具體目標(biāo)平臺(tái)的交叉編譯,生成一個(gè)內(nèi)核映象文件o最后通過(guò)一些手段把該映象文件燒寫(安裝)到目標(biāo)平臺(tái)中。o通常,對(duì)Linux源碼的改寫工作難度較大,它要求不僅對(duì)Linux內(nèi)核結(jié)構(gòu)要非常熟悉,還要求對(duì)目標(biāo)平臺(tái)的硬件結(jié)構(gòu)要非常熟悉,同時(shí)還要求對(duì)相關(guān)版本的匯編語(yǔ)言較熟悉,因?yàn)榕c體系結(jié)構(gòu)相關(guān)的部分源碼往往是用匯編寫的。所以這部分工作一般由目標(biāo)平臺(tái)提供商來(lái)完成。開(kāi)發(fā)者所要做的就是從目標(biāo)平臺(tái)提供商的網(wǎng)站上下載相關(guān)版本Linux內(nèi)核的補(bǔ)?。≒atch)。把它打到Linu
17、x內(nèi)核上,再進(jìn)行交叉編譯就行。 2021/8/234第五章 Linux內(nèi)核5.1 Linux 內(nèi)核概述5.2 Linux 內(nèi)核模塊簡(jiǎn)介5.3 Linux 的編譯和定制5.4 Linux 系統(tǒng)調(diào)用舉例2021/8/2355.2 Linux 內(nèi)核模塊簡(jiǎn)介o 5.2.1 進(jìn)程管理模塊o 5.2.2 存儲(chǔ)管理模塊2021/8/2365.2.1 進(jìn)程管理模塊o 多進(jìn)程是一個(gè)簡(jiǎn)單的思想(如下圖):n 一個(gè)進(jìn)程一直運(yùn)行,直到它必須等待,通常是等待一些系統(tǒng)資源,等擁有了資源,它才可以繼續(xù)運(yùn)行。n 在一個(gè)單進(jìn)程的系統(tǒng),比如 DOS , CPU 被簡(jiǎn)單地設(shè)為空閑,這樣等待的時(shí)間就會(huì)被浪費(fèi)。n 在一個(gè)多進(jìn)程的系統(tǒng)中
18、,同一時(shí)刻許多進(jìn)程在內(nèi)存中。當(dāng)一個(gè)進(jìn)程必須等待時(shí),操作系統(tǒng)將剝奪這個(gè)進(jìn)程對(duì)CPU的使用權(quán),并將它交給另一個(gè)合適的進(jìn)程。 2021/8/2375.2.1 進(jìn)程管理模塊o 進(jìn)程的切換:n當(dāng)一個(gè)進(jìn)程被剝奪了CPU,而系統(tǒng)轉(zhuǎn)向去運(yùn)行另外一個(gè)進(jìn)程的時(shí)候,就發(fā)生了上下文切換,或者叫做進(jìn)程切換。負(fù)責(zé)完成新的進(jìn)程選擇和進(jìn)程切換的代碼就是調(diào)度程序 2021/8/2385.2.1 進(jìn)程管理模塊o 態(tài)的切換和上下文切換(書)n 2021/8/2395.2.1 進(jìn)程管理模塊o Linux的進(jìn)程狀態(tài)2021/8/240task_structo Linux中,每一個(gè)進(jìn)程用一個(gè)task_struct的數(shù)據(jù)結(jié)構(gòu)來(lái)表示,用來(lái)管
19、理系統(tǒng)中的進(jìn)程。o 當(dāng)一個(gè)新的進(jìn)程被創(chuàng)建后,從系統(tǒng)內(nèi)存中分配一個(gè)新的task_struct,并增加到task的鏈表中。o 為了更容易查找,用current指針指向當(dāng)前運(yùn)行的進(jìn)程。 2021/8/241task_structo task_struct結(jié)構(gòu)有個(gè)成員state表示進(jìn)程當(dāng)前的運(yùn)行狀態(tài),已定義的狀態(tài)如下:(include/linux/sched.h中)n#define TASK_RUNNING0n#define TASK_INTERRUPTIBLE1n#define TASK_UNINTERRUPTIBLE2n#define TASK_ZOMBIE4n#define TASK_STOPP
20、ED82021/8/242進(jìn)程的家庭關(guān)系o 在Linux系統(tǒng)中,沒(méi)有一個(gè)進(jìn)程是和其他進(jìn)程完全無(wú)關(guān)的。o 系統(tǒng)中的所有進(jìn)程,除了初始的進(jìn)程之外,都有一個(gè)父進(jìn)程。新進(jìn)程不是創(chuàng)建的,而是拷貝,或者說(shuō)從前一個(gè)進(jìn)程克隆的(cloned)。o 在每一個(gè)進(jìn)程的task_struct 中都有指向它的父進(jìn)程和兄弟進(jìn)程(擁有相同的父進(jìn)程的進(jìn)程)以及它的子進(jìn)程的的指針。o 在Linux系統(tǒng)中,用戶可以用pstree 命令看到正在運(yùn)行的進(jìn)程的家庭關(guān)系。 2021/8/2435.2.1 進(jìn)程管理模塊o Linux將進(jìn)程的創(chuàng)建與目標(biāo)程序的執(zhí)行分成兩步。n 第一步是從已經(jīng)存在的“父進(jìn)程”中復(fù)制出一個(gè)“子進(jìn)程”,該子進(jìn)程擁有
21、自己的task_struct結(jié)構(gòu)和系統(tǒng)空間堆棧,但與父進(jìn)程共享其它所有資源。o 兩個(gè)系統(tǒng)調(diào)用:fork和clone n 第二步是目標(biāo)程序的執(zhí)行。 Linux為此提供了一個(gè)系統(tǒng)調(diào)用execve,讓一個(gè)進(jìn)程執(zhí)行以文件形式存在的一個(gè)可執(zhí)行程序的映像。 2021/8/2445.2.1 進(jìn)程管理模塊o 創(chuàng)建了子進(jìn)程后,父進(jìn)程有兩種選擇。n 一是不受阻的(non-blocking)方式,也稱為“異步”方式,即父進(jìn)程繼續(xù)走自己的路,與子進(jìn)程分道揚(yáng)鑣。這種情況下如果子進(jìn)程先于父進(jìn)程結(jié)束,則內(nèi)核會(huì)向父進(jìn)程發(fā)一個(gè)信號(hào)告知子進(jìn)程已經(jīng)結(jié)束。n 二是受阻的(blocking)方式,也稱為“同步”方式,即父進(jìn)程停下來(lái)進(jìn)入
22、睡眠狀態(tài),等待子進(jìn)程結(jié)束,然后父進(jìn)程再繼續(xù)運(yùn)行。Linux為此提供了兩個(gè)系統(tǒng)調(diào)用,wait4和wait3。兩個(gè)系統(tǒng)調(diào)用基本相同,wait4等待某個(gè)特定的子進(jìn)程結(jié)束,而wait3則等待任何一個(gè)子進(jìn)程結(jié)束。 2021/8/2455.2.2 存儲(chǔ)管理模塊o Linux的虛擬地址空間o linux的存儲(chǔ)管理由兩個(gè)部分組成:n 第一個(gè)是物理內(nèi)存的管理n 第二個(gè)是虛擬存儲(chǔ)器的管理,主要是進(jìn)程虛擬地址空間的管理2021/8/2465.2.2 存儲(chǔ)管理模塊o 有了虛擬存儲(chǔ)器,程序員在編寫程序的時(shí)候,就可以不用考慮內(nèi)存的實(shí)際大小和程序的具體運(yùn)行位置了,這個(gè)時(shí)候,他所使用的地址被稱為了邏輯地址,或者虛擬地址,而所
23、對(duì)應(yīng)的物理地址,指的是程序真正運(yùn)行的時(shí)候所占用的地址。 o 從邏輯地址到物理地址的轉(zhuǎn)換是需要操作系統(tǒng)內(nèi)核和CPU的硬件部件MMU共同配合來(lái)完成的 ,如下MMU的功能說(shuō)明圖 存儲(chǔ)模塊的硬件基礎(chǔ)2021/8/247邏輯地址到物理地址的轉(zhuǎn)換 2021/8/2485.2.2 存儲(chǔ)管理模塊o 80386把線性地址空間劃分成4K字節(jié)的頁(yè)面,每個(gè)頁(yè)面可以被映射至物理存儲(chǔ)空間中任意一塊4K字節(jié)大小的區(qū)間。o 在段式存管中,連續(xù)的邏輯地址經(jīng)過(guò)映射后在線性地址空間還是連續(xù)的。o 但是在頁(yè)式存管中,連續(xù)的線性地址經(jīng)過(guò)映射后在物理空間卻不一定連續(xù)(其靈活性也在于此)。 2021/8/249分頁(yè)機(jī)制地址轉(zhuǎn)換2021/8
24、/2505.2.2 存儲(chǔ)管理模塊o Linux的存儲(chǔ)管理模塊 2021/8/251內(nèi)存映射 o 當(dāng)一個(gè)映像執(zhí)行時(shí),執(zhí)行映像的內(nèi)容必須放在進(jìn)程的虛擬地址空間中。對(duì)于執(zhí)行映像連接到的任意共享庫(kù),情況也是一樣。執(zhí)行文件實(shí)際并沒(méi)有放到物理內(nèi)存,而只是被連接到進(jìn)程的虛擬內(nèi)存。這樣,只要運(yùn)行程序引用了映像的部分,這部分映像就從執(zhí)行文件中加載到內(nèi)存中。這種映像和進(jìn)程虛擬地址空間的連接叫做內(nèi)存映射。 2021/8/252mm_structo 進(jìn)程的虛擬內(nèi)存用mm_struct 數(shù)據(jù)結(jié)構(gòu)表示。它包括當(dāng)前執(zhí)行的映像的信息(例如 bash )和指向一組 vm_area_struct 結(jié)構(gòu)的指針。o 每一個(gè) vm_a
25、rea_struct 的數(shù)據(jù)結(jié)構(gòu)都描述了內(nèi)存區(qū)域的起始、進(jìn)程對(duì)于內(nèi)存區(qū)域的訪問(wèn)權(quán)限和對(duì)于這段內(nèi)存的操作。o 這些操作是一組例程,用于管理這段虛擬內(nèi)存。例如其中一種虛擬內(nèi)存操作就是當(dāng)進(jìn)程試圖訪問(wèn)這段虛擬內(nèi)存時(shí),如果發(fā)現(xiàn)(通過(guò) page fault )內(nèi)存不在物理內(nèi)存中,所必須執(zhí)行的正確操作,這個(gè)操作叫做nopage 操作。 Linux 請(qǐng)求把執(zhí)行映像的頁(yè)加載到內(nèi)存中的時(shí)候用到 nopage 操作。 2021/8/253vm_area_structo 當(dāng)一個(gè)執(zhí)行映像映射到進(jìn)程的虛擬地址空間時(shí),產(chǎn)生一組 vm_area_struct 數(shù)據(jù)結(jié)構(gòu)。每一個(gè)vm_area_struct 結(jié)構(gòu)表示執(zhí)行映像的一
26、部分:執(zhí)行代碼、初始化數(shù)據(jù)(變量)、未初始化數(shù)據(jù)等等。 Linux 支持一系列標(biāo)準(zhǔn)的虛擬內(nèi)存操作,當(dāng) vm_area_struct 數(shù)據(jù)結(jié)構(gòu)創(chuàng)建時(shí),一組正確的虛擬內(nèi)存操作就和它們關(guān)聯(lián)在一起。o 只要執(zhí)行映像映射到進(jìn)程的虛擬內(nèi)存中,它就可以開(kāi)始運(yùn)行。因?yàn)橹挥杏诚竦淖铋_(kāi)始的部分是放在物理內(nèi)存中,很快就會(huì)訪問(wèn)到還沒(méi)有放在物理內(nèi)存的虛擬空間區(qū)。當(dāng)進(jìn)程訪問(wèn)沒(méi)有有效頁(yè)表?xiàng)l目的虛擬地址的時(shí)候,處理器向 Linux 報(bào)告 page fault 。 Page fault 描述了發(fā)生 page fault 的虛擬地址和內(nèi)存訪問(wèn)類型。 2021/8/254Linux的虛擬地址空間的映射o從頁(yè)的分配角度來(lái)說(shuō)。虛擬地址
27、中的頁(yè)的類型有下面三個(gè)類型:如圖所示:n未分配:n已分配了的、但是沒(méi)有緩存的n已分配的且被緩存的 2021/8/255第五章 Linux內(nèi)核5.1 Linux 內(nèi)核概述5.2 Linux 內(nèi)核模塊簡(jiǎn)介5.3 Linux 的編譯和定制5.4 Linux 系統(tǒng)調(diào)用舉例2021/8/2565.3 Linux 的編譯和定制o 8.3.1 Linux 內(nèi)核編譯概述o 8.3.2 編譯內(nèi)核前的準(zhǔn)備工作o 8.3.3 編譯內(nèi)核第一步:配置內(nèi)核o 8.3.4 編譯內(nèi)核第二步:編譯內(nèi)核o 8.3.5 編譯內(nèi)核后生成的文件2021/8/2575.3.1 Linux 內(nèi)核編譯概述o 如果用戶想要使用內(nèi)核的一些新特性
28、,或想根據(jù)自己的系統(tǒng)量身定制一個(gè)更高效或更穩(wěn)定的內(nèi)核,就需要重新編譯內(nèi)核。 o 編譯內(nèi)核包含兩大項(xiàng)內(nèi)容:n 第一步:配置內(nèi)核n 第二步:編譯內(nèi)核。 2021/8/2585.3.2 編譯內(nèi)核前的準(zhǔn)備工作o 編譯內(nèi)核前先要了解自己系統(tǒng)的硬件配置情況,比如CPU的類型、主板芯片、顯卡和聲卡的型號(hào)以及其他相關(guān)參數(shù)等。o 也要了解現(xiàn)有內(nèi)核的版本號(hào)n uname -a n Linux localhost localdomain 2.4.20-8 #1 Thu Mar 13 17:54:28 EST 2003 i686 i686 i386 GNU/Linux 2021/8/2595.3.2 編譯內(nèi)核前的準(zhǔn)備
29、工作o 把下載好的打包的內(nèi)核解開(kāi)。壓縮的內(nèi)核、補(bǔ)丁和解開(kāi)的源代碼總共要占70M 左右的硬盤空間;用root 登錄,解開(kāi)的源代碼應(yīng)該在/usr/src/Linux 2.4.20-8 下面: n #tar zxvf Linux 2.4.20-8.tar.gz 或者n #gzip t Linux 2.4.20-8.tar.gz n #tar x Linux 2.4.20-8.tar 2021/8/2605.3.3 編譯內(nèi)核第一步:配置內(nèi)核o 在開(kāi)始配置內(nèi)核之前,首先需要通過(guò)下面的命令清除所有的臨時(shí)文件、中間件和配置文件。對(duì)于一個(gè)剛從網(wǎng)上下載的內(nèi)核來(lái)說(shuō),它肯定是干凈的,這么做只會(huì)多此一舉。但是這是一個(gè)
30、良好習(xí)慣,而且不會(huì)有壞結(jié)果。 n #make mrproper 2021/8/2615.3.3 編譯內(nèi)核第一步:配置內(nèi)核o make menuconfig:一個(gè)文本模式、簡(jiǎn)單的菜單模式的配置界面2021/8/2625.3.3 編譯內(nèi)核第一步:配置內(nèi)核o make xconfig: 基于Tcl/Tk的X圖形配置界面 2021/8/2635.3.3 編譯內(nèi)核第一步:配置內(nèi)核o 根據(jù)自己的需要,進(jìn)行各個(gè)選擇和子選項(xiàng)的配置。對(duì)每一個(gè)內(nèi)核選項(xiàng),可以有三個(gè)選擇:不包括(N),build-in(Y),和模塊化支持(M)。 2021/8/2645.3.4 編譯內(nèi)核第二步:編譯內(nèi)核o 編譯內(nèi)核的軟件環(huán)境是kbu
31、ild系統(tǒng),它泛指構(gòu)建一個(gè)完整并能夠運(yùn)行的Linux內(nèi)核所需要的一切資源。這些資源包括構(gòu)建程序、腳本、中間件、配置文件和Makefile。o 編譯過(guò)程:在/usr/src/linux下依次輸入以下命令(功能請(qǐng)參考書上描述)nmake depnmake cleannmake bzImagenmake installnmake modulesnmake modules_install2021/8/2655.3.5 編譯內(nèi)核后生成的文件1. vmlinuz o vmlinuz是可引導(dǎo)的、壓縮的內(nèi)核?!皏m”代表“Virtual Memory”。 o vmlinuz的建立有兩種方式:n一是編譯內(nèi)核時(shí)通
32、過(guò)“make zImage”創(chuàng)建,然后通過(guò):“cp /usr/src/linux-2.4/arch/i386/linux/boot/zImage /boot/vmlinuz”產(chǎn)生。zImage適用于小內(nèi)核的情況,它的存在是為了向后的兼容性。n二是內(nèi)核編譯時(shí)通過(guò)命令make bzImage創(chuàng)建,然后通過(guò):“cp /usr/src/linux-2.4/arch/i386/linux/boot/bzImage /boot/vmlinuz”產(chǎn)生。bzImage是壓縮的內(nèi)核映像,需要注意,bzImage不是用bzip2壓縮的,bzImage中的bz容易引起誤解,bz表示“big zImage”。bzIm
33、age中的b是“big”意思。 2021/8/266vmlinuzo zImage(vmlinuz)和bzImage(vmlinuz)都是用gzip壓縮的。它們不僅是一個(gè)壓縮文件,而且在這兩個(gè)文件的開(kāi)頭部分內(nèi)嵌有g(shù)zip解壓縮代碼。所以不能用gunzip 或 gzip dc解包vmlinuz。o 內(nèi)核文件中包含一個(gè)微型的gzip用于解壓縮內(nèi)核并引導(dǎo)它。兩者的不同之處在于,老的zImage解壓縮內(nèi)核到低端內(nèi)存(第一個(gè)640K),bzImage解壓縮內(nèi)核到高端內(nèi)存(1M以上)。如果內(nèi)核比較小,那么可以采用zImage 或bzImage之一,兩種方式引導(dǎo)的系統(tǒng)運(yùn)行時(shí)是相同的。大的內(nèi)核采用bzImag
34、e,不能采用zImage。 o vmlinux是未壓縮的內(nèi)核,vmlinuz是vmlinux的壓縮文件。 2021/8/2675.3.5 編譯內(nèi)核后生成的文件o 2. initrd-x.x.x.img n initrd-x.x.x.img是用gzip壓縮的文件。 n initrd是“initial ramdisk”的簡(jiǎn)寫。initrd一般被用來(lái)臨時(shí)引導(dǎo)硬件驅(qū)動(dòng)到實(shí)際內(nèi)核vmlinuz,使其能夠接管并繼續(xù)引導(dǎo)的狀態(tài)。n initrd實(shí)現(xiàn)加載一些模塊和安裝文件系統(tǒng)等功能。 initrd映象文件是使用mkinitrd創(chuàng)建的。 2021/8/2685.3.5 編譯內(nèi)核后生成的文件o 3. System
35、.mapn是一個(gè)特定內(nèi)核的內(nèi)核符號(hào)表,是由“nm vmlinux”產(chǎn)生的n在進(jìn)行程序設(shè)計(jì)時(shí),會(huì)命名一些變量名或函數(shù)名之類的符號(hào)。Linux內(nèi)核是一個(gè)很復(fù)雜的代碼塊,有許多的全局符號(hào)。 nLinux內(nèi)核不使用符號(hào)名,而是通過(guò)變量或函數(shù)的地址來(lái)識(shí)別變量或函數(shù)名。比如不是使用size_t BytesRead這樣的符號(hào),而是像c0343f20這樣引用這個(gè)變量。 n對(duì)于使用計(jì)算機(jī)的人來(lái)說(shuō),更喜歡使用那些像size_t BytesRead這樣的名字,而不喜歡像c0343f20這樣的名字。內(nèi)核主要是用c寫的,所以編譯器/連接器允許我們編碼時(shí)使用符號(hào)名,當(dāng)內(nèi)核運(yùn)行時(shí)使用地址。 2021/8/269System
36、.mapo在有的情況下,我們需要知道符號(hào)的地址,或者需要知道地址對(duì)應(yīng)的符號(hào)。這由符號(hào)表來(lái)完成,符號(hào)表是所有符號(hào)連同它們的地址的列表。Linux 符號(hào)表使用到2個(gè)文件: n/proc/ksyms nSystem.map o/proc/ksyms是一個(gè)“proc file”,在內(nèi)核引導(dǎo)時(shí)創(chuàng)建。實(shí)際上,它并不真正的是一個(gè)文件,它只不過(guò)是內(nèi)核數(shù)據(jù)的表示,卻給人們是一個(gè)磁盤文件的假象,這從它的文件大小是0可以看出來(lái)。o而System.map是存在于你的文件系統(tǒng)上的實(shí)際文件。當(dāng)你編譯一個(gè)新內(nèi)核時(shí),各個(gè)符號(hào)名的地址要發(fā)生變化,老的System.map具有的是錯(cuò)誤的符號(hào)信息。每次內(nèi)核編譯時(shí)產(chǎn)生一個(gè)新的Syst
37、em.map,你應(yīng)當(dāng)用新的System.map來(lái)取代老的System.map。 o雖然內(nèi)核本身并不真正使用System.map,但其它程序比如klogd、lsof和ps等軟件需要一個(gè)正確的System.map。 2021/8/270第五章 Linux內(nèi)核5.1 Linux 內(nèi)核概述5.2 Linux 內(nèi)核模塊簡(jiǎn)介5.3 Linux 的編譯和定制5.4 Linux 系統(tǒng)調(diào)用舉例2021/8/2715.4 Linux 系統(tǒng)調(diào)用舉例o 5.4.1 Linux系統(tǒng)調(diào)用介紹o 5.4.2 給內(nèi)核增加新的系統(tǒng)調(diào)用的實(shí)例2021/8/2725.4.1 Linux系統(tǒng)調(diào)用介紹o API函數(shù)與系統(tǒng)調(diào)用既有區(qū)別又
38、有聯(lián)系。n API是用于某種特定目的的函數(shù),供應(yīng)用程序調(diào)用,而系統(tǒng)調(diào)用供應(yīng)用程序直接進(jìn)入系統(tǒng)空間。 n 系統(tǒng)包含了一些供應(yīng)用程序調(diào)用的API函數(shù)庫(kù),其中的一些僅用于提供系統(tǒng)調(diào)用,因此每個(gè)系統(tǒng)調(diào)用都與一個(gè)API函數(shù)相對(duì)應(yīng),反之則不成立 n 大多數(shù)系統(tǒng)調(diào)用的返回值是一個(gè)整數(shù),通常返回1表示系統(tǒng)調(diào)用失敗,返回非負(fù)數(shù)表示函數(shù)執(zhí)行成功。n 系統(tǒng)調(diào)用雖然是為應(yīng)用程序主動(dòng)進(jìn)入系統(tǒng)空間而設(shè)置,但在內(nèi)核的開(kāi)發(fā)中也可以使用某些系統(tǒng)調(diào)用(如open,read,write等函數(shù)) 2021/8/2735.4.1 Linux系統(tǒng)調(diào)用介紹o 系統(tǒng)調(diào)用的功能圖n應(yīng)用程序和系統(tǒng)調(diào)用及其內(nèi)核實(shí)現(xiàn)之間的層次關(guān)系 2021/8/2
39、745.4.2 給內(nèi)核增加新的系統(tǒng)調(diào)用的實(shí)例o 需要實(shí)際操作完成o 需要理解每一個(gè)修改點(diǎn)的含義和作用2021/8/275系統(tǒng)調(diào)用o與系統(tǒng)調(diào)用相關(guān)的源程序文件包括以下這些:narch/i386/boot/bootsect.Snarch/i386/Kernel/setup.Snarch/i386/boot/compressed/head.Snarch/i386/kernel/head.S ninit/arch/i386/kernel/arch/i386/kernel/entry.Snarch/i386/kernel/irq.hninclude/asm-386/unistd.h o當(dāng)然,這只是涉及到的幾個(gè)主要文件。而事實(shí)上,增加系統(tǒng)調(diào)用真正要修改文件只有include/asm-386/unistd.h 和arch/i386/kernel/entry.S兩個(gè) 2021/8/2761 修改kernel/sys.c文件 o 在Red Hat 9.0的/usr/src/linux-2.4.20-8/kernel/sys.c文件中增加一個(gè)新的自定義系統(tǒng)調(diào)用函數(shù):asmlinkage long sys_testsyscall(
溫馨提示
- 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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 通信架空鋼管施工方案
- 裝飾木板安裝施工方案
- 2025年中國(guó)工業(yè)控制軟件行業(yè)發(fā)展監(jiān)測(cè)及投資方向研究報(bào)告
- 2025年通風(fēng)過(guò)濾網(wǎng)組行業(yè)深度研究分析報(bào)告
- 2025-2030年重慶市數(shù)字政府市場(chǎng)全景調(diào)查及發(fā)展前景研判報(bào)告
- 2019-2025年中國(guó)卡那霉素市場(chǎng)供需格局及未來(lái)發(fā)展趨勢(shì)報(bào)告
- 2025年中國(guó)肌苷片行業(yè)市場(chǎng)全景評(píng)估及投資前景展望報(bào)告
- 乳化防銹油復(fù)合劑行業(yè)市場(chǎng)發(fā)展及發(fā)展趨勢(shì)與投資戰(zhàn)略研究報(bào)告
- 2025年度高校校長(zhǎng)任期國(guó)際交流合作聘用合同3篇
- 2025年度新型肥料研發(fā)與應(yīng)用推廣合同范本3篇
- 經(jīng)方治療腦梗塞的體會(huì)
- 新版DFMEA基礎(chǔ)知識(shí)解析與運(yùn)用-培訓(xùn)教材
- 制氮機(jī)操作安全規(guī)程
- 衡水市出租車駕駛員從業(yè)資格區(qū)域科目考試題庫(kù)(全真題庫(kù))
- 護(hù)理安全用氧培訓(xùn)課件
- 《三國(guó)演義》中人物性格探析研究性課題報(bào)告
- 注冊(cè)電氣工程師公共基礎(chǔ)高數(shù)輔導(dǎo)課件
- 土方勞務(wù)分包合同中鐵十一局
- 乳腺導(dǎo)管原位癌
- 冷庫(kù)管道應(yīng)急預(yù)案
- 司法考試必背大全(涵蓋所有法律考點(diǎn))
評(píng)論
0/150
提交評(píng)論