版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、1,第五章 Linux 的內核,5.1 Linux 內核概述 5.2 Linux 內核模塊簡介 5.3 Linux 的編譯和定制 5.4 Linux 系統(tǒng)調用舉例,2,5.1 Linux 內核概述,5.1.1 Linux 內核和功能結構 5.1.2 Linux 內核源代碼布局 5.1.3 內核的移植,3,5.1.1 Linux 內核和功能結構,內核(kernel)是操作系統(tǒng)的內部核心程序,它向外部提供了對計算機系統(tǒng)資源進行請求和管理的調用接口和服務,4,內核,可以將操作系統(tǒng)的代碼分成兩部分: 內核所在的地址空間稱為內核空間; 而在內核以外,剩下的程序統(tǒng)稱為外部管理程序,它們大部分是對外圍設備的
2、管理和界面操作,外部管理程序與用戶進程所占據的地址空間稱為外部空間。 通常,一個程序會跨越兩個空間。 當執(zhí)行到內核空間的一段代碼時,稱程序處于內核態(tài) 當程序執(zhí)行到外部空間代碼時,稱程序處于用戶態(tài)。,5,5.1.1 Linux 內核和功能結構,常見的OS內核有兩個模式: 微內核(micro-kernel) 單一內核(Monolithic kernel),6,微內核,在微內核結構中,操作系統(tǒng)的內核只需要提供最基本,最核心的一部分操作(比如創(chuàng)建和刪除任務,內存管理,中斷管理等) 其他的管理程序(如文件系統(tǒng),網絡協(xié)議棧等)則盡可能地放在內核以外。這些外部程序可以獨立運行,并對應用程序提供操作系統(tǒng)服務,
3、服務之間使用進程間通信機制(IPC)進行交互。只在需要內核的協(xié)助時,才通過一套接口對內核發(fā)出調用請求。,7,微內核優(yōu)點,使操作系統(tǒng)具有良好的靈活性。使得操作系統(tǒng)內部結構變得簡單清晰。 在內核以外的外部程序分別獨立運行,其間并不互相關聯(lián)。這樣,可以對這些程序分別進行維護和拆裝,只要遵循已經規(guī)定好的界面,就不會對其他程序有任何干擾。這使得程序代碼在維護上十分方便,體現(xiàn)了面向對象軟件的結構特征。,8,微內核的不足,首先,程序代碼之間的相互隔離,使得整個系統(tǒng)喪失了許多優(yōu)化的機會; 其次,部分資源浪費在外部進程之間的通信上(進程間通信的開銷要比直接的函數調用大),這樣,微內核結構在效率上必然低于傳統(tǒng)的單
4、一內核結構,這些效率損失將作為結構精簡的代價。 總體上說,在當前的硬件條件下,微內核在效率上的損失小于其在結構上獲得的效益,故而選取微內核成為操作系統(tǒng)的一大潮流。,9,5.1.1 Linux 內核和功能結構,Linux內核屬于單一內核 參與Linux系統(tǒng)開發(fā)的程序員大多數為世界各地的黑客們。比起結構的清晰,他們更加注重功能的強大和高效率的代碼。 他們將大量的精力花在優(yōu)化代碼上,而這樣的全局性優(yōu)化必然以損失結構精煉作為代價,導致Linux中的每個部件都不能被輕易拆出,否則必然破壞整體效率。,10,Linux內核,雖然Linux是一個單一內核操作系統(tǒng),但它與傳統(tǒng)的單一內核UNIX操作系統(tǒng)不同。 在
5、普通單一內核系統(tǒng)中,所有內核代碼都是被靜態(tài)編譯和鏈接的。 而在Linux中,可以動態(tài)裝入和卸載內核中的部分代碼。Linux中將這樣的代碼段稱做模塊(module),并對模塊給予了強有力的支持。在Linux中,可以在需要時自動裝入和卸載模塊。,11,5.1.1 Linux 內核和功能結構,Linux內核的結構,12,5.1.1 Linux 內核和功能結構,Linux 內核主要由5 個模塊構成,它們分別是: 進程調度模塊:控制進程對CPU 資源的使用 內存管理模塊:確保所有進程能夠安全地共享機器主內存區(qū);虛擬內存管理 文件系統(tǒng)模塊:支持對外部設備的驅動和存儲 進程間通信模塊:支持多種進程間的信息交
6、換方式 網絡接口模塊:提供對多種網絡通信標準的訪問并支持許多網絡硬件,13,內核模塊之間的依賴關系,14,內核模塊之間的依賴關系,所有的模塊都與進程調度模塊存在依賴關系。因為它們都需要依靠進程調度程序來掛起(暫停)或重新運行它們的進程。通常,一個模塊會在等待硬件操作期間被掛起,而在操作完成后才可繼續(xù)運行。,15,內核模塊之間的依賴關系,進程調度子系統(tǒng)需要使用內存管理器來調整一特定進程所使用的物理內存空間。 進程間通信子系統(tǒng)則需要依靠內存管理器來支持共享內存通信機制。 虛擬文件系統(tǒng)也會使用網絡接口來支持網絡文件系統(tǒng)(NFS),同樣也能使用內存管理子系統(tǒng)來提供內存虛擬盤(ramdisk)設備。 而
7、內存管理子系統(tǒng)也會使用文件系統(tǒng)來支持內存數據塊的交換操作。,16,5.1.2 Linux 內核源代碼布局,安裝的時候,如果選擇了Kernel Develop,則會在/usr/scr/linux下找到源代碼 根據各個目錄的名字,可以容易猜出各個目錄里面的文件的功能,17,5.1.2 Linux 內核源代碼布局,Documentation arch drivers fs include init ipc lib mm net ,18,5.1.2 Linux 內核源代碼布局,19,5.1.2 Linux 內核源代碼布局,20,5.1.2 Linux 內核源代碼布局,21,補充:Linux操作系統(tǒng)的啟
8、動,Boot Loader 把操作系統(tǒng)的代碼調入內存后,會把控制權交給操作系統(tǒng),由操作系統(tǒng)的啟動程序來完成剩下的工作。,22,Linux操作系統(tǒng)啟動的步驟,(1)把控制權交給Setup.S這段程序 (2)進入保護模式,同時把控制權交給Head.S (3)Head.S調用/init/main.C中的start_kernel函數,啟動程序從start_kernel()函數繼續(xù)執(zhí)行 (4)建立init進程,23,進入操作系統(tǒng)(1)Setup.S,首先,Setup.S對已經調入內存的操作系統(tǒng)代碼進行檢查,如果沒錯,它會通過BIOS中斷獲取內存容量,硬盤等信息(實模式) 準備讓CPU進入保護模式 a.先
9、屏蔽中斷信號 b.調用指令lidt和lgdt,對中斷向量表寄存器IDTR進行初始化 c.對8259中斷控制器進行編程 d.協(xié)處理器重新定位 完成這幾件事后,Setup.S設置保護模式的標志,重取指令,再用一條跳轉指令jmpi 0 x100000,KERNEL_CS。進入保護模式下的啟動階段,控制權交給Head.S.,24,進入操作系統(tǒng)(2)Head.S,也要先做屏蔽中斷一類的工作 然后對中斷向量表做一定的處理 Boot Loader讀入內存的啟動參數和命令行參數,Head.S把它們保存在empty_zero_page頁中 檢查CPU類型 對協(xié)處理器進行檢查 頁初始化,調用setup_pagin
10、g這個子函數 因為已進入保護模式,段機制的多任務屬性體現(xiàn),25,進入操作系統(tǒng)(3)main.c中的初始化,Head.S調用/init/main.c中的start_kernel函數,把控制權交給它,這個函數是整個操作系統(tǒng)初始化的最重要的函數,一旦它執(zhí)行完,整個操作系統(tǒng)的初始化也就完成了。,26,進入操作系統(tǒng)(3)main.c中的初始化,計算機在執(zhí)行start_kernel前以進入了保護模式,使處理器完全進入了全面執(zhí)行操作系統(tǒng)代碼的狀態(tài)。 但直到目前為止,這都是針對處理器的。而一旦start_kernel開始執(zhí)行,Linux內核就一步步展現(xiàn)。 Start_kernel執(zhí)行后,就可以以一個用戶的身份
11、登陸和使用Linux了,27,進入操作系統(tǒng)(3)main.c中的初始化,main.c中其他較為重要的函數如下: Setup_arch() 最基本硬件的初始化 Paging_init() 線性地址空間映射 Trap_init()中斷向量表初始化 Int_IRQ與中斷有關的初始化 Sched_init()進程調度初始化 Console_init()對中斷的初始化 對文件系統(tǒng)的初始化 Inode_initI() i節(jié)點管理機制初始化 Name_cache_init() 目錄緩存機制初始化 Buffer_init() 塊緩存機制初始化,28,進入操作系統(tǒng)(3)main.c中的初始化,啟動到了目前這種狀
12、態(tài),只剩下運行/etc下的啟動配置文件。 這時初始化程序并沒有完成操作系統(tǒng)各個部分的初始化,更關鍵的文件系統(tǒng)的安裝還沒有涉及,這是在init進程建立后完成的。就是start_kernel()最后部分內容。,29,進入操作系統(tǒng)(4)建立init進程,Linux要建立的第一個進程是init進程 啟動所需的Shell腳本文件 a.Linux系統(tǒng)啟動所必須的 b.用戶登陸后自己設定的 系統(tǒng)啟動所必須的腳本存放在系統(tǒng)默認的配置文件目錄/etc下。首先調用的是/etc/inittab.,30,5.1.3 內核的移植,Linux移植: 就是把Linux操作系統(tǒng)針對具體的目標平臺做必要改寫之后,安裝到該目標平
13、臺,使其正確地運行起來,即把內核從一種硬件平臺轉移到另外一種硬件平臺上運行。這個概念目前在嵌入式開發(fā)領域講的比較多。 對于嵌入式Linux系統(tǒng)來說,有各種體系結構的處理器和硬件平臺,并且用戶需要根據需求自己定制硬件板。只要硬件平臺有些變化,即使非常小,可能也需要做一些移植工作。,31,5.1.3 內核的移植,內核移植工作主要是修改跟硬件平臺相關的代碼,一般不涉及Linux內核通用的程序。移植的難度也取決于兩種硬件平臺的差異。 Linux針對于特定的硬件平臺的軟件包叫做BSP(Board Support Package)。 目前Linux內核的社區(qū)已經對常見的硬件平臺做了很多工作,移植工作已經簡
14、單了 通常都可以找到相同處理器的參考板,并且可以獲取到Linux內核源代碼。,32,移植的準備工作,選擇參考板,獲取到Linux內核源代碼:四點原則 分析內核代碼,弄清楚哪些設備有驅動程序,哪些還沒有。 確信Linux對參考板的支持情況,配置編譯Linux內核,在目標板上運行測試。 可能最新的Linux內核版本支持的最好,但是也可能需要在老內核版本上打補丁。 分析平臺相關的部分代碼實現(xiàn);分析內核編譯組織方式;分析內核啟動的初始化程序;分析驅動程序的實現(xiàn)。,33,移植過程的基本內容,獲取某一版本的Linux內核源碼,根據具體目標平臺對源碼進行必要的改寫(主要是修改體系結構相關部分) 然后添加一些
15、外設的驅動,打造一款適合需要的目標平臺(可以是嵌入式便攜設備也可以是其它體系結構的PC機)的新操作系統(tǒng),對該系統(tǒng)進行針對具體目標平臺的交叉編譯,生成一個內核映象文件 最后通過一些手段把該映象文件燒寫(安裝)到目標平臺中。 通常,對Linux源碼的改寫工作難度較大,它要求不僅對Linux內核結構要非常熟悉,還要求對目標平臺的硬件結構要非常熟悉,同時還要求對相關版本的匯編語言較熟悉,因為與體系結構相關的部分源碼往往是用匯編寫的。所以這部分工作一般由目標平臺提供商來完成。開發(fā)者所要做的就是從目標平臺提供商的網站上下載相關版本Linux內核的補?。≒atch)。把它打到Linux內核上,再進行交叉編譯
16、就行。,34,第五章 Linux內核,5.1 Linux 內核概述 5.2 Linux 內核模塊簡介 5.3 Linux 的編譯和定制 5.4 Linux 系統(tǒng)調用舉例,35,5.2 Linux 內核模塊簡介,5.2.1 進程管理模塊 5.2.2 存儲管理模塊,36,5.2.1 進程管理模塊,多進程是一個簡單的思想(如下圖): 一個進程一直運行,直到它必須等待,通常是等待一些系統(tǒng)資源,等擁有了資源,它才可以繼續(xù)運行。 在一個單進程的系統(tǒng),比如 DOS , CPU 被簡單地設為空閑,這樣等待的時間就會被浪費。 在一個多進程的系統(tǒng)中,同一時刻許多進程在內存中。當一個進程必須等待時,操作系統(tǒng)將剝奪這
17、個進程對CPU的使用權,并將它交給另一個合適的進程。,37,5.2.1 進程管理模塊,進程的切換: 當一個進程被剝奪了CPU,而系統(tǒng)轉向去運行另外一個進程的時候,就發(fā)生了上下文切換,或者叫做進程切換。負責完成新的進程選擇和進程切換的代碼就是調度程序,38,5.2.1 進程管理模塊,態(tài)的切換和上下文切換(書),39,5.2.1 進程管理模塊,Linux的進程狀態(tài),40,task_struct,Linux中,每一個進程用一個task_struct的數據結構來表示,用來管理系統(tǒng)中的進程。 當一個新的進程被創(chuàng)建后,從系統(tǒng)內存中分配一個新的task_struct,并增加到task的鏈表中。 為了更容易查
18、找,用current指針指向當前運行的進程。,41,task_struct,task_struct結構有個成員state表示進程當前的運行狀態(tài),已定義的狀態(tài)如下:(include/linux/sched.h中) #define TASK_RUNNING0 #define TASK_INTERRUPTIBLE1 #define TASK_UNINTERRUPTIBLE2 #define TASK_ZOMBIE4 #define TASK_STOPPED8,42,進程的家庭關系,在Linux系統(tǒng)中,沒有一個進程是和其他進程完全無關的。 系統(tǒng)中的所有進程,除了初始的進程之外,都有一個父進程。新進程不
19、是創(chuàng)建的,而是拷貝,或者說從前一個進程克隆的(cloned)。 在每一個進程的task_struct 中都有指向它的父進程和兄弟進程(擁有相同的父進程的進程)以及它的子進程的的指針。 在Linux系統(tǒng)中,用戶可以用pstree 命令看到正在運行的進程的家庭關系。,43,5.2.1 進程管理模塊,Linux將進程的創(chuàng)建與目標程序的執(zhí)行分成兩步。 第一步是從已經存在的“父進程”中復制出一個“子進程”,該子進程擁有自己的task_struct結構和系統(tǒng)空間堆棧,但與父進程共享其它所有資源。 兩個系統(tǒng)調用:fork和clone 第二步是目標程序的執(zhí)行。 Linux為此提供了一個系統(tǒng)調用execve,讓
20、一個進程執(zhí)行以文件形式存在的一個可執(zhí)行程序的映像。,44,5.2.1 進程管理模塊,創(chuàng)建了子進程后,父進程有兩種選擇。 一是不受阻的(non-blocking)方式,也稱為“異步”方式,即父進程繼續(xù)走自己的路,與子進程分道揚鑣。這種情況下如果子進程先于父進程結束,則內核會向父進程發(fā)一個信號告知子進程已經結束。 二是受阻的(blocking)方式,也稱為“同步”方式,即父進程停下來進入睡眠狀態(tài),等待子進程結束,然后父進程再繼續(xù)運行。Linux為此提供了兩個系統(tǒng)調用,wait4和wait3。兩個系統(tǒng)調用基本相同,wait4等待某個特定的子進程結束,而wait3則等待任何一個子進程結束。,45,5.
21、2.2 存儲管理模塊,Linux的虛擬地址空間 linux的存儲管理由兩個部分組成: 第一個是物理內存的管理 第二個是虛擬存儲器的管理,主要是進程虛擬地址空間的管理,46,5.2.2 存儲管理模塊,有了虛擬存儲器,程序員在編寫程序的時候,就可以不用考慮內存的實際大小和程序的具體運行位置了,這個時候,他所使用的地址被稱為了邏輯地址,或者虛擬地址,而所對應的物理地址,指的是程序真正運行的時候所占用的地址。 從邏輯地址到物理地址的轉換是需要操作系統(tǒng)內核和CPU的硬件部件MMU共同配合來完成的 ,如下MMU的功能說明圖 存儲模塊的硬件基礎,47,邏輯地址到物理地址的轉換,48,5.2.2 存儲管理模塊
22、,80386把線性地址空間劃分成4K字節(jié)的頁面,每個頁面可以被映射至物理存儲空間中任意一塊4K字節(jié)大小的區(qū)間。 在段式存管中,連續(xù)的邏輯地址經過映射后在線性地址空間還是連續(xù)的。 但是在頁式存管中,連續(xù)的線性地址經過映射后在物理空間卻不一定連續(xù)(其靈活性也在于此)。,49,分頁機制地址轉換,50,5.2.2 存儲管理模塊,Linux的存儲管理模塊,51,內存映射,當一個映像執(zhí)行時,執(zhí)行映像的內容必須放在進程的虛擬地址空間中。對于執(zhí)行映像連接到的任意共享庫,情況也是一樣。執(zhí)行文件實際并沒有放到物理內存,而只是被連接到進程的虛擬內存。這樣,只要運行程序引用了映像的部分,這部分映像就從執(zhí)行文件中加載到
23、內存中。這種映像和進程虛擬地址空間的連接叫做內存映射。,52,mm_struct,進程的虛擬內存用mm_struct 數據結構表示。它包括當前執(zhí)行的映像的信息(例如 bash )和指向一組 vm_area_struct 結構的指針。 每一個 vm_area_struct 的數據結構都描述了內存區(qū)域的起始、進程對于內存區(qū)域的訪問權限和對于這段內存的操作。 這些操作是一組例程,用于管理這段虛擬內存。例如其中一種虛擬內存操作就是當進程試圖訪問這段虛擬內存時,如果發(fā)現(xiàn)(通過 page fault )內存不在物理內存中,所必須執(zhí)行的正確操作,這個操作叫做nopage 操作。 Linux 請求把執(zhí)行映像的
24、頁加載到內存中的時候用到 nopage 操作。,53,vm_area_struct,當一個執(zhí)行映像映射到進程的虛擬地址空間時,產生一組 vm_area_struct 數據結構。每一個vm_area_struct 結構表示執(zhí)行映像的一部分:執(zhí)行代碼、初始化數據(變量)、未初始化數據等等。 Linux 支持一系列標準的虛擬內存操作,當 vm_area_struct 數據結構創(chuàng)建時,一組正確的虛擬內存操作就和它們關聯(lián)在一起。 只要執(zhí)行映像映射到進程的虛擬內存中,它就可以開始運行。因為只有映像的最開始的部分是放在物理內存中,很快就會訪問到還沒有放在物理內存的虛擬空間區(qū)。當進程訪問沒有有效頁表條目的虛擬
25、地址的時候,處理器向 Linux 報告 page fault 。 Page fault 描述了發(fā)生 page fault 的虛擬地址和內存訪問類型。,54,Linux的虛擬地址空間的映射,從頁的分配角度來說。虛擬地址中的頁的類型有下面三個類型:如圖所示: 未分配: 已分配了的、但是沒有緩存的 已分配的且被緩存的,55,第五章 Linux內核,5.1 Linux 內核概述 5.2 Linux 內核模塊簡介 5.3 Linux 的編譯和定制 5.4 Linux 系統(tǒng)調用舉例,56,5.3 Linux 的編譯和定制,8.3.1 Linux 內核編譯概述 8.3.2 編譯內核前的準備工作 8.3.3
26、編譯內核第一步:配置內核 8.3.4 編譯內核第二步:編譯內核 8.3.5 編譯內核后生成的文件,57,5.3.1 Linux 內核編譯概述,如果用戶想要使用內核的一些新特性,或想根據自己的系統(tǒng)量身定制一個更高效或更穩(wěn)定的內核,就需要重新編譯內核。 編譯內核包含兩大項內容: 第一步:配置內核 第二步:編譯內核。,58,5.3.2 編譯內核前的準備工作,編譯內核前先要了解自己系統(tǒng)的硬件配置情況,比如CPU的類型、主板芯片、顯卡和聲卡的型號以及其他相關參數等。 也要了解現(xiàn)有內核的版本號 uname -a Linux localhost localdomain 2.4.20-8 #1 Thu Mar
27、 13 17:54:28 EST 2003 i686 i686 i386 GNU/Linux,59,5.3.2 編譯內核前的準備工作,把下載好的打包的內核解開。壓縮的內核、補丁和解開的源代碼總共要占70M 左右的硬盤空間;用root 登錄,解開的源代碼應該在/usr/src/Linux 2.4.20-8 下面: #tar zxvf Linux 2.4.20-8.tar.gz 或者 #gzip t Linux 2.4.20-8.tar.gz #tar x Linux 2.4.20-8.tar,60,5.3.3 編譯內核第一步:配置內核,在開始配置內核之前,首先需要通過下面的命令清除所有的臨時文件
28、、中間件和配置文件。對于一個剛從網上下載的內核來說,它肯定是干凈的,這么做只會多此一舉。但是這是一個良好習慣,而且不會有壞結果。 #make mrproper,61,5.3.3 編譯內核第一步:配置內核,make menuconfig:一個文本模式、簡單的菜單模式的配置界面,62,5.3.3 編譯內核第一步:配置內核,make xconfig: 基于Tcl/Tk的X圖形配置界面,63,5.3.3 編譯內核第一步:配置內核,根據自己的需要,進行各個選擇和子選項的配置。對每一個內核選項,可以有三個選擇:不包括(N),build-in(Y),和模塊化支持(M)。,64,5.3.4 編譯內核第二步:編
29、譯內核,編譯內核的軟件環(huán)境是kbuild系統(tǒng),它泛指構建一個完整并能夠運行的Linux內核所需要的一切資源。這些資源包括構建程序、腳本、中間件、配置文件和Makefile。 編譯過程:在/usr/src/linux下依次輸入以下命令(功能請參考書上描述) make dep make clean make bzImage make install make modules make modules_install,65,5.3.5 編譯內核后生成的文件,1. vmlinuz vmlinuz是可引導的、壓縮的內核。“vm”代表“Virtual Memory”。 vmlinuz的建立有兩種方式: 一
30、是編譯內核時通過“make zImage”創(chuàng)建,然后通過:“cp /usr/src/linux-2.4/arch/i386/linux/boot/zImage /boot/vmlinuz”產生。zImage適用于小內核的情況,它的存在是為了向后的兼容性。 二是內核編譯時通過命令make bzImage創(chuàng)建,然后通過:“cp /usr/src/linux-2.4/arch/i386/linux/boot/bzImage /boot/vmlinuz”產生。bzImage是壓縮的內核映像,需要注意,bzImage不是用bzip2壓縮的,bzImage中的bz容易引起誤解,bz表示“big zImag
31、e”。bzImage中的b是“big”意思。,66,vmlinuz,zImage(vmlinuz)和bzImage(vmlinuz)都是用gzip壓縮的。它們不僅是一個壓縮文件,而且在這兩個文件的開頭部分內嵌有gzip解壓縮代碼。所以不能用gunzip 或 gzip dc解包vmlinuz。 內核文件中包含一個微型的gzip用于解壓縮內核并引導它。兩者的不同之處在于,老的zImage解壓縮內核到低端內存(第一個640K),bzImage解壓縮內核到高端內存(1M以上)。如果內核比較小,那么可以采用zImage 或bzImage之一,兩種方式引導的系統(tǒng)運行時是相同的。大的內核采用bzImage,
32、不能采用zImage。 vmlinux是未壓縮的內核,vmlinuz是vmlinux的壓縮文件。,67,5.3.5 編譯內核后生成的文件,2. initrd-x.x.x.img initrd-x.x.x.img是用gzip壓縮的文件。 initrd是“initial ramdisk”的簡寫。initrd一般被用來臨時引導硬件驅動到實際內核vmlinuz,使其能夠接管并繼續(xù)引導的狀態(tài)。 initrd實現(xiàn)加載一些模塊和安裝文件系統(tǒng)等功能。 initrd映象文件是使用mkinitrd創(chuàng)建的。,68,5.3.5 編譯內核后生成的文件,3. System.map 是一個特定內核的內核符號表,是由“nm
33、vmlinux”產生的 在進行程序設計時,會命名一些變量名或函數名之類的符號。Linux內核是一個很復雜的代碼塊,有許多的全局符號。 Linux內核不使用符號名,而是通過變量或函數的地址來識別變量或函數名。比如不是使用size_t BytesRead這樣的符號,而是像c0343f20這樣引用這個變量。 對于使用計算機的人來說,更喜歡使用那些像size_t BytesRead這樣的名字,而不喜歡像c0343f20這樣的名字。內核主要是用c寫的,所以編譯器/連接器允許我們編碼時使用符號名,當內核運行時使用地址。,69,System.map,在有的情況下,我們需要知道符號的地址,或者需要知道地址對應
34、的符號。這由符號表來完成,符號表是所有符號連同它們的地址的列表。Linux 符號表使用到2個文件: /proc/ksyms System.map /proc/ksyms是一個“proc file”,在內核引導時創(chuàng)建。實際上,它并不真正的是一個文件,它只不過是內核數據的表示,卻給人們是一個磁盤文件的假象,這從它的文件大小是0可以看出來。 而System.map是存在于你的文件系統(tǒng)上的實際文件。當你編譯一個新內核時,各個符號名的地址要發(fā)生變化,老的System.map具有的是錯誤的符號信息。每次內核編譯時產生一個新的System.map,你應當用新的System.map來取代老的System.ma
35、p。 雖然內核本身并不真正使用System.map,但其它程序比如klogd、lsof和ps等軟件需要一個正確的System.map。,70,第五章 Linux內核,5.1 Linux 內核概述 5.2 Linux 內核模塊簡介 5.3 Linux 的編譯和定制 5.4 Linux 系統(tǒng)調用舉例,71,5.4 Linux 系統(tǒng)調用舉例,5.4.1 Linux系統(tǒng)調用介紹 5.4.2 給內核增加新的系統(tǒng)調用的實例,72,5.4.1 Linux系統(tǒng)調用介紹,API函數與系統(tǒng)調用既有區(qū)別又有聯(lián)系。 API是用于某種特定目的的函數,供應用程序調用,而系統(tǒng)調用供應用程序直接進入系統(tǒng)空間。 系統(tǒng)包含了一些
36、供應用程序調用的API函數庫,其中的一些僅用于提供系統(tǒng)調用,因此每個系統(tǒng)調用都與一個API函數相對應,反之則不成立 大多數系統(tǒng)調用的返回值是一個整數,通常返回1表示系統(tǒng)調用失敗,返回非負數表示函數執(zhí)行成功。 系統(tǒng)調用雖然是為應用程序主動進入系統(tǒng)空間而設置,但在內核的開發(fā)中也可以使用某些系統(tǒng)調用(如open,read,write等函數),73,5.4.1 Linux系統(tǒng)調用介紹,系統(tǒng)調用的功能圖 應用程序和系統(tǒng)調用及其內核實現(xiàn)之間的層次關系,74,5.4.2 給內核增加新的系統(tǒng)調用的實例,需要實際操作完成 需要理解每一個修改點的含義和作用,75,系統(tǒng)調用,與系統(tǒng)調用相關的源程序文件包括以下這些:
37、 arch/i386/boot/bootsect.S arch/i386/Kernel/setup.S arch/i386/boot/compressed/head.S arch/i386/kernel/head.S init/main.c arch/i386/kernel/traps.c arch/i386/kernel/entry.S arch/i386/kernel/irq.h include/asm-386/unistd.h 當然,這只是涉及到的幾個主要文件。而事實上,增加系統(tǒng)調用真正要修改文件只有include/asm-386/unistd.h 和arch/i386/kernel/entry.S兩個,76,1 修改kernel/sys.c文件,在Red Hat 9.0的/usr/src/linux-2.4.20-8/kernel/sys.c文件中增加一個新的自定義系統(tǒng)調用函數: as
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 維穩(wěn)值班備勤制度規(guī)范
- 服裝超市制度規(guī)范標準
- 蔬菜噴灌施肥制度規(guī)范
- 燃氣電話客服制度規(guī)范
- 教師規(guī)范用字工作制度
- 規(guī)范性二文件管理制度
- 規(guī)范安全環(huán)保管理制度
- 統(tǒng)一規(guī)范運營管理制度
- 浴池保潔工作規(guī)范制度
- 美容院建群群規(guī)范制度
- 四川省南充市2024-2025學年部編版七年級上學期期末歷史試題
- 2025年高二數學建模試題及答案
- 2025年黨的二十屆四中全會精神宣講稿及公報解讀輔導報告
- 壓力管道安裝單位壓力管道質量安全風險管控清單
- 停車場道閘施工方案范本
- 2025年實驗室安全事故案例
- 貝林妥單抗護理要點
- 衛(wèi)生院關于成立消除艾滋病、梅毒、乙肝母嬰傳播領導小組及職責分工的通知
- 鐵路更換夾板課件
- 小學語文教學能力提升策略
- 卡西歐手表WVA-M600(5161)中文使用說明書
評論
0/150
提交評論