第12講-Linux內(nèi)核結(jié)構(gòu)及移植_第1頁
第12講-Linux內(nèi)核結(jié)構(gòu)及移植_第2頁
第12講-Linux內(nèi)核結(jié)構(gòu)及移植_第3頁
第12講-Linux內(nèi)核結(jié)構(gòu)及移植_第4頁
第12講-Linux內(nèi)核結(jié)構(gòu)及移植_第5頁
已閱讀5頁,還剩47頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

第十二講

Linux內(nèi)核結(jié)構(gòu)及移植河南大學計算機與信息工程學院Linux內(nèi)核結(jié)構(gòu)及移植Linux內(nèi)核結(jié)構(gòu)Linux源代碼結(jié)構(gòu)Linux的移植Linux內(nèi)核裁剪2Linux內(nèi)核結(jié)構(gòu)及移植Linux內(nèi)核結(jié)構(gòu)Linux源代碼結(jié)構(gòu)Linux的移植Linux內(nèi)核裁剪3*4Linux內(nèi)核結(jié)構(gòu)*5Linux內(nèi)核可以劃分成三層。系統(tǒng)調(diào)用接口(SCI):實現(xiàn)了一些基本的調(diào)用功能,例如read和write等。內(nèi)核代碼:獨立于體系結(jié)構(gòu)的內(nèi)核代碼。這些代碼是Linux所支持的所有處理器體系結(jié)構(gòu)所通用的。依賴于體系結(jié)構(gòu)的代碼,構(gòu)成了通常稱為BSP(BoardSupportPackage)的部分。這些代碼用作給定體系結(jié)構(gòu)的處理器和特定于平臺的代碼。Linux內(nèi)核結(jié)構(gòu)*6Linux內(nèi)核的主要子系統(tǒng)Linux內(nèi)核結(jié)構(gòu)*71)進程調(diào)度2)進程間通信3)內(nèi)存管理4)虛擬文件系統(tǒng)5)網(wǎng)絡(luò)堆棧6)設(shè)備驅(qū)動程序7)依賴體系結(jié)構(gòu)的代碼Linux內(nèi)核的主要子系統(tǒng)Linux內(nèi)核結(jié)構(gòu)*8內(nèi)核通過系統(tǒng)調(diào)用接口SCI層提供API來創(chuàng)建一個新進程,停止進程,并在進程間進行通信和同步;進程調(diào)度還包括處理活動進程間共享CPU的需求;內(nèi)核進程管理的源代碼在“./linux-2.6.x/kernel”中;依賴于體系結(jié)構(gòu)的源代碼在“./linux-2.6.x/arch”中。

1)進程調(diào)度Linux內(nèi)核結(jié)構(gòu)*9支持進程間各種通信機制,包括管道、FIFO、共享內(nèi)存、信號、消息隊列、套接字等。

2)進程間通信Linux內(nèi)核結(jié)構(gòu)*10為了提高效率,如果由硬件管理虛擬內(nèi)存,內(nèi)存是按照所謂的內(nèi)存頁方式進行管理的(對于大部分體系結(jié)構(gòu)來說都是4KB)。Linux包括了管理可用內(nèi)存的方式,以及物理和虛擬映射所使用的硬件機制。內(nèi)存管理模式使用4KB緩沖區(qū)為基數(shù),從中分配結(jié)構(gòu),并跟蹤內(nèi)存頁使用情況,根據(jù)系統(tǒng)需要動態(tài)調(diào)整內(nèi)存使用。內(nèi)存管理的源代碼在“./linux-2.6.x/mm”中。

3)內(nèi)存管理Linux內(nèi)核結(jié)構(gòu)*11虛擬文件系統(tǒng)(VFS)為文件系統(tǒng)提供了一個通用的接口抽象。VFS在SCI和內(nèi)核所支持的文件系統(tǒng)之間提供了一個交換層。文件系統(tǒng)的源代碼在“./linux-2.6.x/fs”中。文件系統(tǒng)層之下的緩沖區(qū)可優(yōu)化對物理設(shè)備的訪問;緩沖區(qū)之下設(shè)備驅(qū)動程序接口。

4)虛擬文件系統(tǒng)Linux內(nèi)核結(jié)構(gòu)*12網(wǎng)絡(luò)堆棧在設(shè)計上遵循模擬協(xié)議本身的分層體系結(jié)構(gòu)。InternetProtocol(IP)是傳輸協(xié)議(通常稱為傳輸控制協(xié)議TCP)下面的核心網(wǎng)絡(luò)層協(xié)議。TCP上面是socket層,它是通過SCI進行調(diào)用的。Socket層是網(wǎng)絡(luò)子系統(tǒng)的標準API,為各種網(wǎng)絡(luò)協(xié)議提供用戶接口。從原始幀訪問到IP協(xié)議數(shù)據(jù)單元(PDU),再到TCP和用戶數(shù)據(jù)報協(xié)議UDP,socket層提供了一種標準化的方法來管理連接,并在各個終點之間移動數(shù)據(jù)。內(nèi)核中網(wǎng)絡(luò)源代碼在“./linux-2.6.x/net”中。

5)網(wǎng)絡(luò)堆棧Linux內(nèi)核結(jié)構(gòu)*13Linux內(nèi)核中有大量代碼都在設(shè)備驅(qū)動程序中,它們能夠支持特定硬件設(shè)備的運轉(zhuǎn)。Linux源碼樹提供了一個驅(qū)動程序子目錄,這個目錄又進一步劃分為各種支持設(shè)備,例如DMA、I2C、USB

等。設(shè)備驅(qū)動程序的代碼可以在“./linux-2.6.x/drivers”中。

6)設(shè)備驅(qū)動程序Linux內(nèi)核結(jié)構(gòu)*14盡管Linux很大程度上獨立于所運行的體系結(jié)構(gòu),但是有些元素則必須考慮體系結(jié)構(gòu)才能正常操作并實現(xiàn)更高效率。./linux-2.6.x/arch

子目錄中定義了內(nèi)核源代碼中依賴于體系結(jié)構(gòu)的部分,其中包含了各種特定于體系結(jié)構(gòu)的子目錄(共同組成了BSP)。

7)依賴體系結(jié)構(gòu)的代碼Linux內(nèi)核結(jié)構(gòu)*15Linux內(nèi)核的技術(shù)特點注重實用和效率:Linux內(nèi)核被設(shè)計成分層的微內(nèi)核,所以效率高,緊湊性強。內(nèi)核可定制:選擇適合的,剔除不需要的部分,適合嵌入式產(chǎn)品。LKM機制:LoadableKernelModule機制,用戶在需要時現(xiàn)場動態(tài)加載,使用完畢可動態(tài)卸載。將模塊從內(nèi)核中獨立出來。網(wǎng)絡(luò)支持:支持大量網(wǎng)絡(luò)協(xié)議。被動調(diào)用服務(wù)對象:Linux內(nèi)核為用戶進程服務(wù)的唯一方式是用戶進程通過系統(tǒng)調(diào)用來請求在內(nèi)核空間運行某個函數(shù)。虛擬內(nèi)存技術(shù):每個進程的虛擬內(nèi)存空間為4GB。其中0-3GB屬于用戶空間,稱為用戶段;3-4GB屬于內(nèi)核空間,稱為內(nèi)核段。Linux內(nèi)核結(jié)構(gòu)Linux內(nèi)核結(jié)構(gòu)及移植Linux內(nèi)核結(jié)構(gòu)Linux源代碼結(jié)構(gòu)Linux的移植Linux內(nèi)核裁剪1617/pub/linux/kernel/v2.6內(nèi)核下載Linux內(nèi)核目錄結(jié)構(gòu)linuxDocumentationarchdriversfsincludeinitmmlibnetscript幫助文檔體系結(jié)構(gòu)相關(guān)源代碼驅(qū)動程序文件系統(tǒng)頭文件kernel初始化Linux內(nèi)存管理常用函數(shù)網(wǎng)絡(luò)協(xié)議源代碼腳本文件armbootkernellibmach-s3c2440vmlinux.lds壓縮內(nèi)核啟動引導代碼內(nèi)核起始代碼常用函數(shù)s3c2440平臺相關(guān)代碼核心的連接腳本文件與架構(gòu)和平臺相關(guān)的源代碼都放在arch目錄下,對于ARM的Linux,包含于arch目錄下的arm子目錄中。Linux內(nèi)核arch目錄*20Linux源代碼結(jié)構(gòu)結(jié)合源碼包,仔細分析Linux-2.6.39內(nèi)核源代碼結(jié)構(gòu)。*21linux-2.6.39:該主目錄中包括所有的子目錄,還含有唯一的一個Makefile文件。主要用途是通過識別哪些文件已被修改過,從而自動地決定在一個含有多個源程序文件的程序系統(tǒng)中哪些文件需要被重新編譯。linux-2.6.39目錄下的這個Makefile文件還嵌套地調(diào)用了所有子目錄中包含的Makefile文件。這樣,當linux目錄(包括子目錄)下的任何文件被修改過時,make都會對其進行重新編譯。因此為了編譯整個內(nèi)核所有的源代碼文件,只要在linux目錄下運行一次make軟件即可。Linux源代碼結(jié)構(gòu)1)linux主目錄*22arch目錄:包含和硬件體系結(jié)構(gòu)相關(guān)的代碼,每種平臺占一個相應(yīng)的目錄。在這個目錄下,針對不同體系結(jié)構(gòu)所移植的版本都有三個子目錄:kernel、lib和mm。kernel子目錄包含依賴于體系結(jié)構(gòu)實現(xiàn)的一般內(nèi)核功能,如信號處理、時鐘處理等;lib子目錄包含庫函數(shù)的本地實現(xiàn),如果從依賴于體系結(jié)構(gòu)的源碼編譯,則運行更快;mm子目錄包含存儲管理實現(xiàn)的代碼。

Linux源代碼結(jié)構(gòu)2)arch目錄*233)block目錄:存放部分塊設(shè)備驅(qū)動程序。4)crypto目錄:存放常用加密和散列算法(如AES、SHA等),還有一些壓縮和CRC校驗算法。5)Documentation目錄:存放關(guān)于內(nèi)核各部分的通用解釋和注釋。6)drivers目錄:存放設(shè)備驅(qū)動程序,每個不同的驅(qū)動占用一個子目錄,如聲卡的驅(qū)動對應(yīng)于drivers/sound。這個目錄擁有50%以上的內(nèi)核源碼,系統(tǒng)中所有的設(shè)備驅(qū)動程序都位于該目錄中。7)fs目錄:Linux支持的文件系統(tǒng)代碼。不同的文件系統(tǒng)有不同的子目錄與之對應(yīng)。如ext、fat、ntfs等。8)include目錄:存放頭文件,包括了內(nèi)核的大多數(shù)頭文件,另外對每種支持的體系結(jié)構(gòu)分別有一個子目錄。其中,和系統(tǒng)相關(guān)的頭文件被放置在linux子目錄下。Linux源代碼結(jié)構(gòu)*249)init目錄:存放內(nèi)核初始化代碼(不是系統(tǒng)引導代碼)。包含了所有系統(tǒng)的初始化源碼,許多主要的文件,如main.c就位于該目錄下。該文件還包含了許多核心代碼,如實現(xiàn)fork()的代碼和最常執(zhí)行的代碼cpuidle()循環(huán)。10)ipc目錄:處理進程間通信的全部所需的代碼都放在該目錄下。11)kernel目錄:內(nèi)核的最核心部分,許多最常調(diào)用的內(nèi)核函數(shù)放在該目錄下。包括調(diào)度器fork()和timer.c等,和平臺相關(guān)的一部分代碼放在arch/*/kernel目錄下。12)lib目錄:存放庫文件代碼。該目錄放置內(nèi)核其他部分經(jīng)常所需要的代碼,如inflate.c就放在這里,它能夠在引導時解壓內(nèi)核并裝入內(nèi)存。與處理器結(jié)構(gòu)相關(guān)的庫代碼放在arch/*/lib目錄下。Linux源代碼結(jié)構(gòu)*2513)mm目錄:包含了所有Linux實現(xiàn)虛擬內(nèi)存管理的源碼。與具體硬件體協(xié)結(jié)構(gòu)相關(guān)的內(nèi)存管理代碼位于arch/*/mm目錄下,如對應(yīng)X86的就是arch/i386/mm/fault.c14)modules目錄:存放已編譯好的可動態(tài)加載的模塊。15)net目錄:存放所有提供網(wǎng)絡(luò)支持的代碼代碼,實現(xiàn)了各種常見的網(wǎng)絡(luò)協(xié)議,每個子目錄對應(yīng)網(wǎng)絡(luò)的一個方面。16)scripts目錄:存放用于配置內(nèi)核的腳本文件及用戶開發(fā)和維護手冊。17)security目錄:SELinux(Security-EnhancedLinux)的模塊。18)sound目錄:常用音頻設(shè)備的驅(qū)動程序等。19)usr目錄:/usr這是最龐大的目錄,我們要用到的應(yīng)用程序和文件幾乎都存放在這個目錄下Linux源代碼結(jié)構(gòu)Linux內(nèi)核結(jié)構(gòu)及移植Linux內(nèi)核結(jié)構(gòu)Linux源代碼結(jié)構(gòu)Linux的移植Linux內(nèi)核裁剪26*27Linux移植:把Linux操作系統(tǒng)針對具體的目標平臺做必要改寫之后,安裝到該目標平臺使其正確的運行起來。Linux的移植Linux的移植Linux內(nèi)核的移植可以分為板級移植和片級移植。板級移植:對于Linux發(fā)行版本中已經(jīng)支持的CPU通常只需要針對板級硬件進行適當?shù)男薷募纯伞F壱浦玻簩τ贚inux發(fā)行版本中沒有支持的CPU則需要添加相應(yīng)CPU的內(nèi)核移植。片級移植相對板級移植來說要復雜許多,目前采用的Linux發(fā)行版本中已經(jīng)包含S3C2440X

ARM920T處理器的移植包,因此,只需要在其上進行Linux板級移植的基本過程和方法。*291)交叉編譯環(huán)境的搭建。2)修改相關(guān)的配置文件,如修改內(nèi)核目錄下的makefile文件中關(guān)于交叉編譯工具相關(guān)的內(nèi)容,此后就可以使用這個makefile進行編譯了。3)修改linux內(nèi)核源碼,主要是修改和CPU相關(guān)的部分。4)內(nèi)核的裁剪,根據(jù)項目的需要裁剪內(nèi)核模塊。5)內(nèi)核的編譯,將裁剪好的內(nèi)核進行編譯,生成二進制映像文件。6)內(nèi)核的下載,將生成的二進制映像文件,燒寫到目標平臺。Linux的移植*30linux的移植主要包含啟動代碼的修改,內(nèi)核的鏈接及裝入,參數(shù)傳遞,內(nèi)核引導幾個部分。linux內(nèi)核分為體系結(jié)構(gòu)相關(guān)部分和體系結(jié)構(gòu)無關(guān)部分。在Linux啟動的第一階段,內(nèi)核與體系結(jié)構(gòu)相關(guān)部分(arch目錄下)首先執(zhí)行,它會完成硬件寄存器設(shè)置,內(nèi)存映像等初始化工作。然后把控制權(quán)轉(zhuǎn)給內(nèi)核中與系統(tǒng)結(jié)構(gòu)無關(guān)部分。在移植工作中要改動的代碼主要集中在與體系結(jié)構(gòu)相關(guān)部分。Linux的移植Linux內(nèi)核結(jié)構(gòu)及移植Linux內(nèi)核結(jié)構(gòu)Linux源代碼結(jié)構(gòu)Linux的移植Linux內(nèi)核裁剪31*32Linux內(nèi)核的裁剪與編譯看上去是個簡單的過程。只是對配置菜單的簡單選擇。但是內(nèi)核配置菜單本身結(jié)構(gòu)龐大,內(nèi)容復雜。熟悉與了解該菜單的各項具體含義就顯得比較重要。Linux內(nèi)核裁剪*33常用有如下幾種方式:makeconfig

進入命令行,逐行配置makemenuconfig

menuconfig菜單makexconfig

xconfig菜單Linux內(nèi)核裁剪makeconfig*35makemenuconfigLinux內(nèi)核裁剪*36makexconfigLinux內(nèi)核裁剪內(nèi)核配置原則:大部分選項使用默認值,小部分根據(jù)用戶不同進行選擇。與內(nèi)核關(guān)系緊密且經(jīng)常使用的部分功能代碼直接編譯到內(nèi)核中。與內(nèi)核其他部分關(guān)系較遠且不經(jīng)常使用的部分功能代碼編譯成可加載模塊。有利于縮短內(nèi)核長度,減小內(nèi)核消耗的內(nèi)存。不需要的功能不選,或使用默認值。37Linux內(nèi)核裁剪Linux常用配置選項系統(tǒng)及其存儲器配置網(wǎng)絡(luò)支持顯示器支持觸摸屏支持系統(tǒng)及其存儲器配置在‘SystemType’菜單中中進行配置選擇系統(tǒng)類型處理器型號選擇處理器其它特性(USB支持等)網(wǎng)絡(luò)支持在Networkingoptions以及Networkdevicesupport中進行配置選擇支持TCP/IP協(xié)議在Networkdevicesupport配置中,添加選項Networkdevicesupport,并在Ethernet(10or100Mbit)中選擇OtherISAcards,如下圖所示選擇NE2000/NE1000support采用RTL8019網(wǎng)卡芯片,為NE2000兼容網(wǎng)卡芯片網(wǎng)絡(luò)支持顯示器支持在Characterdevices以及Consoledrivers中進行配置。在Characterdevices配置中,添加選項Virtualterminal配置,如下圖所示。Virtualterminal支持顯示器支持在Consoledrivers中添加SupportFramebufferdevices配置如采用256色STN顯示器,選擇8bpp支持觸摸屏支持在Characterdevices的SupportS3C2440TouchScreen子菜單中進行配置選擇s3c2440觸摸屏支持*45內(nèi)核的編譯在完成內(nèi)核的裁減之后,內(nèi)核的編譯只要執(zhí)行以下幾條命令:(1)makeclean這條命令是在正式編譯你的內(nèi)核之前先把環(huán)境給清理干凈。有時你也可以用makerealclean或makemrproper來徹底清除相關(guān)依賴,保證沒有不正確的.o文件存在。(2)makedep這條命令是編譯相關(guān)依賴文件。(3)makezImage這條命令就是最終的編譯命令。有時可以直接用make(2.6.X版本上用)或makebzImage(給PC機編譯大內(nèi)核時用)。(4)makeinstall這條命令可以把相關(guān)文件拷貝到默認的目錄。當然在給嵌入式設(shè)備編譯時這步可以不要。因為具體的內(nèi)核安裝還需要你手工進行。編譯Linux內(nèi)核建立依賴關(guān)系

makedep編譯內(nèi)核

make編譯內(nèi)核

makezImage編譯壓縮核心(zImage)編譯生成的Linux映像文件zImage通常保存在arch/arm/boot/目錄下下載、運行和調(diào)試內(nèi)核通過調(diào)試器下載內(nèi)核并運行通過BOOTLOADER下載內(nèi)核到SDRAM中運行通過BOOTLOADER將內(nèi)核燒寫到FLASH中,然后運行LinuxLinux內(nèi)核移植主要過程1對于板級移植,內(nèi)核移植主要包括如下幾個部分:內(nèi)核配置,包括板級包配置體系結(jié)構(gòu)相關(guān)代碼修改,根據(jù)板級包的配置,修改相應(yīng)的體系結(jié)構(gòu)相關(guān)代碼,包括:壓縮核心啟動代碼:linux/arch/arm/boot/內(nèi)核啟動代碼:linux/arch/arm/kernel/板級相關(guān)代碼:linux/arch/arm/mach-s3c2440/連接腳本核心連接腳本:linux/arch/arm/vmlinux.lds壓縮核心連接腳本:linux/arch/arm/boot/compressed/linux.ldsLinux內(nèi)核移植主

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論