




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
Linux內核及編程第2章Linux內核及內核編程計算機科學技術系李偉民2012年7月Linux內核及編程提綱Linux內核介紹
-Linux內核演變及新版特點
-Linux內核的組成Linux內核編程
-Linux內核編譯及加載-Linux下的C編程特點
Linux內核及編程Linux內核的發展與演變Linux生存發展的支柱UNIX操作系統:Linux可以看做UNIX的一個克隆版本Minix操作系統:開放源代碼,Linux參照Minix于1991年開發GNU計劃:GNU計劃和FSF由Stallman于84年創辦,開發出了許多高質量的免費軟件,為Linux開發創造了合適的環境。Posix標準:可移植的操作系統接口,保證應用程序在源代碼一級上在多種操作系統上移植,是Linux前進的燈塔Internet:從0.95版開始,對內核的改進和擴充以網友為主Linux內核及編程Linux內核的發展與演變Linux版本的發展
從1991年10月最初原型0.1版到2003年12月2.6版,Linux朝著支持更多的CPU、硬件體系結構和外部設備,支持更廣泛領域的應用,提供更好的性能3個方向發展。編號問題:奇偶數編號含義。
針對嵌入式系統的應用的改進內核,如HardHatLinux和RTLinux,
uClinux,ThinLinux,MontaVista。Linux內核及編程Linux2.6內核特點新的調度器:高負載下執行出色,多處理器也能很好的擴展。內核搶占:提高實時性,增強系統的用戶交互性。改進的線程模型:可以處理任意數目的線程,最大達20億。虛擬內存的變化:融合反向映射技術。文件系統:支持日志文件系統功能,對擴展屬性及Posix標準訪問控制支持,給指定的文件在文件系統中嵌入元數據。音頻:ALSA支持USB和MIDI設備。電源管理:調節CPU,降低功耗。聯網和IPSec:加入對IPSec和NFSv4的支持,改進對IPv6的支持。用戶界面層:加入了對近乎所有接口設備的支持。Linux內核及編程Linux內核的組成Linux內核源代碼目錄結構arch:和硬件體系結構相關的代碼,每種平臺占一個相應目錄。drivers:設備驅動程序,每個不同驅動占用一個子目錄。fs:支持的各種文件系統,如EXT、FAT、NTFS、JFFS2。block:塊設備驅動程序I/O調度。include:與系統相關的頭文件放在include/linux下。init:內核初始化代碼。kernel:內核最核心部分,和平臺相關的一部分放在arch/*/kernelmm:內存管理代碼,和平臺相關的一部分放在arch/*/mmscripts:用于配置內核的腳本文件。usr:實現了用于打包和壓縮的cpio等。Linux內核及編程Linux內核的組成Linux內核組成Linux內核及編程Linux內核的組成進程調度Linux內核及編程Linux內核的組成內存管理
內存管理的主要作用是控制多個進程安全地共享主內存區域。Linux內存管理完成為每個進程進行虛擬內存到物理內存的轉換。Linux的每個進程享有4GB的內存空間,0~3GB屬于用戶空間,3~4GB屬于內核空間,內核空間對常規內存、I/O設備內存以及高端內存存在不同的處理方式。虛擬文件系統
隱藏了各種硬件細節,為所有設備統一了接口。Linux內核及編程Linux內核的組成網絡接口提供對各種網絡標準的存取和各種網絡硬件的支持,分為網絡協議和網絡驅動程序。網絡協議實現可能的網絡傳輸協議,網絡設備驅動程序負責與硬件設備通信,每一種設備都有相應的驅動程序。進程通信支持進程間的多種通信機制,包含信號量、共享內存、管道等,可協助多個進程、多資源的互斥訪問、進程間的同步和消息傳遞。Linux內核及編程Linux內核的組成Linux內核組成部分之間的依賴關系進程創建依賴內存管理的數據裝入。進程間通信依賴內存管理支持共享內存通信機制。虛擬文件系統利用網絡接口支持網絡文件系統。內存管理利用虛擬文件系統支持交換,交換進程定期由調度程序調度,這說明內存管理也依賴與進程調度。Linux內核及編程Linux內核的組成Linux內核空間與用戶空間CPU內部實現了不同操作模式。不同模式有不同功能。Linux系統充分利用了CPU這一特性,但它只使用了兩級:內核空間和用戶空間。內核可以進行任何操作,用戶程序被禁止對硬件的直接訪問和對內存的未授權訪問,它們的地址空間不同。Linux只能通過系統調用和硬件中斷完成從用戶空間到內核空間的控制轉移。Linux內核及編程Linux內核編譯為什么重新編譯內核?Linux是一個自由軟件,內核版本不斷更新,并增加了許多特性。根據自身系統,定制更高效,更穩定內核的需要。更新的版本支持更多的硬件,具備更好的進程管理能力,運行速度更快,更穩定,并一般會修復老版本中的bug。
經常性地選擇升級更新的系統內核是Linux使用者的必要操作內容。編譯適合自己的內核,將不需要的功能不要編譯進內核,以免增加被系統攻擊者利用的漏洞。Linux內核及編程Linux內核編譯Linux內核的獲取和更新linux內核版本發布的官方網站http://。發布形式:一種是full/Source版本,另外一種是patch文件,即補丁。完整內核版本較大,一般是tar.gz或者是.bz2文件,二者分別是使用gzip或者bzip2進行壓縮的文件,使用時需要解壓縮。patch文件則比較小,一般只有幾十K到幾百K,但是patch文件是針對于特定的版本的,你需要找到自己對應的版本才能使用。Linux內核及編程Linux內核編譯Linux內核編譯準備知識編譯內核需要root權限。一般把內核拷貝到/usr/src下,刪除該目前下存在的linux目錄鏈接。解壓縮源代碼,如果所下載的是.tar.gz(.tgz)文件,tar-zxvfFORLINX_linux-.tar.gz。文件解壓到/usr/src/linux目錄,然后稍作修改。
mv
linuxlinux-2.6.5;ln-slinux-2.6.5linux。(可選)Linux內核及編程Linux內核編譯步驟通常要運行的第一個命令是:
cd/usr/src/linux
。makemrproper
:該命令確保源代碼目錄下沒有不正確的.ko文件以及文件的互相依賴。如果我們使用剛下載的完整的源程序包進行編譯,本步可以省略。而如果你多次使用了這些源程序編譯內核,那么最好要先運行一下這個命令。Linux內核及編程Linux內核編譯步驟Linux內核配置配置內核可以根據需要與愛好使用下面命令中的一個:
#makeconfig(基于文本的最為傳統的配置界面,不推薦使用)#makemenuconfig(基于文本選單的配置界面,字符終端下推薦使用)#makexconfig(基于圖形窗口模式的配置界面,Xwindow下推薦使用,要求QT被安裝)#makegconfig(要求GTK+被安裝)。Linux內核及編程Linux內核編譯步驟Linux內核配置界面Linux內核及編程Linux內核編譯步驟Linux內核編譯#makeclean:完成刪除前面步驟留下的文件,以避免出現一些錯誤。這在多次編譯過內核的話是有必要的。makebzImage或makezImage:實現完全編譯內核,二者生成的內核都是使用gzip壓縮的,只要使用一個就夠了,它們的區別在于使用makebzImage可以生成大一點的內核。建議大家使用makezImage命令。Linux內核及編程Linux內核配置主要項目簡介Loadablemodulesupport這個選項是你的內核對內核模塊的支持選項,包括是否支持和支持的一些配置等,選擇此項會使一些不常用到的驅動或特性可以編譯為模塊以減少內核的體積。SystemType
選擇對系統的支持,如什么樣的ARM內核,什么樣的配置平臺等,如果使用不同的處理器其系統或是不同的內核時此處的選項可能不同。Linux內核及編程Linux內核配置主要項目簡介GeneralSetup這里是內核本身的一些屬性的配置,包括壓縮方式,網絡支持等很多屬性。Parallelportsupport這個選項顧名思義就是選擇內核對并口的支持情況,當選中對并口支持后會出現新的選項來配置支持不同類型不同模式的并口。Linux內核及編程Linux內核配置主要項目簡介MemoryTechnologyDevices(MTD)對MTD設備的支持選項,這個選項對嵌入式系統比較重要,內核對各種Flash的支持都在這里配置,包括種類,分區等。Blockdevices內核對塊設備的支持選項,各種磁盤系統的支持。Networkingsupport對網絡設備的支持選項,例如系統配置不同的網卡時就要在這里選中不同的選項。Linux內核及編程Linux內核配置主要項目簡介Characterdevices字符型設備的支持,這個選項是嵌入式系統經常使用的選項,嵌入式系統中大量的設備都屬于Char型的設備。Multimediadevices多媒體設備的支持。Filesystems內核對不同文件系統的支持選項,在這里選擇需要支持的文件系統。Linux內核及編程Linux內核配置主要項目簡介USBsupport各種USB設備的支持。Bluetoothsupport藍牙設備的支持。Kernelhacking內核DeBug
用的一些選項,用于報告各種信息。Linux內核及編程內核配置小結Linux內核的配置系統由以下3個部分組成Makefile:定義Linux內核的編譯規則。配置文件(Kconfig):給用戶提供配置選擇的功能。配置工具:配置命令解釋器和配置用戶界面。使用makemenuconfig等命令后,會生成一個.config配置文件,記錄哪些被編譯入內核,哪些被編譯為內核模塊。Linux內核及編程Kconfig和MakeFile在Linux內核中增加程序需要完成以下3項工作將編寫的源代碼拷入Linux內核源代碼的相應目錄。在目錄的Kconfig文件中增加關于新源代碼對應項目的配置選項在目錄的Makefile文件中增加對新源代碼的編譯條目。Makefile定義Linux內核的編譯規則,make工具可以實現自動編譯和增量編譯,但必須告訴make源程序之間的依賴關系,描述這種關系的就是Makefile文件。Linux內核及編程MakeFile文件分類Linux內核及編程MakeFile的作用決定編譯哪些文件頂層Makefile決定內核根目錄下哪些子目錄將被編進內核(采用遞歸的方式)。arch/$(ARCH)/Makefile決定arch/$(ARCH)目錄下哪些文件、哪些目錄將被編進內核。各級子目錄下的Makefile決定所在目錄下哪些文件將被編進內核,哪些文件將被編成模塊(即驅動程序),進入哪些子目錄繼續調用它們的Makefile
。Linux內核及編程Makefile的作用怎樣編譯這些文件?即編譯選項、連接選項是什么。選項分3類:全局的,適用于整個內核代碼樹;局部的,僅適用于某個Makefile中的所有文件;個體的,僅適用于某個文件。Linux內核及編程MakeFile的作用怎樣連接這些文件,它們的順序如何?arch/arm/Makefile:頂層Makefile:Linux內核及編程Makefile的作用頂層Makefile按照一定的順序組織文件,根據連接腳本arc/$(ARCH)/kernel/vmlinux.lds生成內核映象文件vmlinux。obj–y用來定義哪些文件被編進(built-in)內核。obj-m用來定義哪些文件被編譯成可加載模塊(Loadablemodule)。lib-y用來定義哪些文件被編成庫文件。obj-y、obj-m還可以用來指定要進入的下一層子目錄。Linux內核及編程Makefile的主要語法目標定義定義哪些內容作為模塊編譯,哪些要編譯并連接進內核。更常見的做法:根據.config文件中的CONFIG變量來決定文件編譯方式,如:obj-y+=foo.c:表示要由foo.c或者foo.s文件編譯得到foo.o并連接進內核。obj-$(CONFIG_ISDN)+=isdn.oobj-$(CONFIG_ISDN_PPP_BSDCOMP)+=isdn_bsdc.oLinux內核及編程Makefile的主要語法多文件模塊的定義采用模塊名加-y或-bojs后綴來定義模塊的組成文件。目錄層次迭代當CONFIG_EXT2_FS的值為y或m時,kbuild將會把ext2目錄列入向下迭代的目標中。obj-$(CONFIG_EXT2_FS)+=ext2.oext2-y:=balloc.odir.ofile.oobj-$(CONFIG_EXT2_FS)+=ext2/Linux內核及編程Kconfig分析一個文本形式的文件,其中主要作用是在內核配置時候,作為配置選項,是各種配置界面的源文件。內核的配置工具讀取各個Kconfig文件,生成配置界面供開發人員配置內核,最后生成配置文件.config。內核的配置界面以樹狀的菜單形式組織,主菜單下有若干個子菜單,子菜單下又有子菜單或配置選項。每個子菜單或選項可以有依賴關系,這些依賴關系用來確定它們是否顯示。只有被依賴項的父項已經被選中,子項才會顯示。內核源碼每個子目錄中,都有一個Makefile文件和Kconfig文件。Linux內核及編程Kconfig基本要素config條目config條目用來配置一個選項,它用于生成一個變量,這個變量會連同它的值一起被寫入配置文件.config中。config出現的三種配置結果:config關鍵字,表示一個配置選項的開始。CONFIG_LEDS_S3C24XX=y#對應的文件被編進內核CONFIG_LEDS_S3C24XX=m#對應的文件被編成模塊#CONFIG_LEDS_S3C24XX#對應的文件沒有被使用Linux內核及編程Kconfig基本要素config變量類型:bool布爾類型、
tristate三態(內建、模塊、移除)、string字符串、hex十六進制、integer整型。條件判斷:依賴關系:缺省值定義:
注意:省略了前綴“CONFIG_”“if〈expr〉”“prompt”<prompt>[“if”<expr>]注意:prompt關鍵字可以省略“dependson”/“requires”<expr>“default”<expr>[“if”<expr>]Linux內核及編程Kconfig基本要素選擇選項:幫助信息:
“select”<symbol>[“if”<expr>]“help”or“---help---”Linux內核及編程Kconfig基本要素menu條目所有處在“menu”和“endmenu”之間的菜單入口都會成為“Floatingpointemulation”子菜單。而且,所有子菜單選項都會繼承父菜單的依賴關系。menu“Floatingpointemulation”configFPE_NWFPE……configFPE_NWFPE_XP…………endmenuLinux內核及編程Kconfig基本要素choice條目:將多個類似的配置選項組合在一起,供用戶單選或多選,格式如下:“choice”<choiceoptions><choiceblock>“endchoice”choiceprompt“ARMsystemtype”defaultARCH_VERSATILEconfigARCH_AAEC2000…configARCH_INTEGRATOR…endchoiceLinux內核及編程Kconfig基本要素comment條目:用于定義一些幫助信息,它在配置過程中出現在界面的第一行.并且這些幫助信息會出現在配置文件中(作為注釋),格式如下:“comment”<prompt><commentoptions>menu“Floatingpointemulation”comment“Atleastoneemulationmustbeselected”Linux內核及編程Kconfig基本要素source條目:用于讀入另一個Kconfig文件,
格式如下:“source”<prompt>source“net/Kconfig”Linux內核及編程.config文件分析是在進行內核配置的時候,經過配置后生成的內核編譯參考文件。是由配置工具自動生成。記錄哪些部分被編譯入內核、哪些部分被編譯為內核模塊。位于源代碼的根目錄下。.config文件節選:1#
2#Automaticallygeneratedmakeconfig:don’tedit
3#
4CONFIG_X86=y
5CONFIG_MMU=y
6CONFIG_UID16=yLinux內核及編程Kconfig、MakeFile、.config三者之間的聯系我們在內核源碼下面執行make命令,實際上是根據makefile來進行編譯的。
obj-$(CONFIG_ISDN)+=isdn.o中CONFIG_ISDN是一個變量,這個變量的賦值則是通過.config文件來集中賦值的。CONFIG_ISDN=y..config文件是通過Kconfig配置生成的。當更改Kconfig文件或者通過配置工具進行內核配置的時候會自動更新.config中相應的值。這三者是怎樣配合工作的呢?Linux內核及編程添加驅動程序到內核1、拷貝test到drivers路徑下cp–frtestlinux_kernel_path/drivers2、為新增目錄創建Kconfig和MakefileLinux內核及編程添加驅動程序到內核3、修改新增目錄的父目錄的Kconfig和Makefile在drivers/Kconig中加入:source"drivers/test/Kconfig“在drivers/Makefile中加入:obj-$(CONFIG_TEST)+=test/在arch/arm/Kconfig里加入:source“drivers/test/Kconfig”4、增加了Kconfig和Makefile文件之后的新的test樹型目錄如下所示:
Linux內核及編程Linux內核的幾個概念(補充)驅動層程序包括:硬件抽象層HAL;板間升級包BSP;設備驅動程序。硬件抽象層:(HardwareAbstractionLayer)是位于操作系統內核與硬件電路之間的接口層,操作系統中通過接口控制所有硬件電路如CPU、I/O、Memory等的操作。抽象層一般應包括相關硬件的初始化配置操作、數據的輸入/輸出操作、硬件設備操作等功能。Linux內核及編程Linux內核的幾個概念(補充)抽象層的特點硬件抽象層具有與硬件的密切相關性;硬件抽象層具有與操作系統的無關性;接口定義的功能應包含硬件或系統所需硬件支持的所有功能;接口定義簡單明了,太多接口函數會增加軟件模擬的復雜性;具有可測性的接口設計有利于系統的軟硬件測試和集成。Linux內核及編程Linux內核的幾個概念(補充)板間升級包板級支持包BSP(BoardSupportPackage)是介于主板硬件和操作系統中驅動程序層之間的一層,一般認為它屬于操作系統的一部分,主要是實現對操作系統的支持,為上層的驅動程序提供訪問硬件設備寄存器的函數包,使之能夠更好的運行于硬件主板。另有說法:在WindowsCE中,BSP是驅動程序、OEM適應層、硬件抽象層以及啟動設備和使外設正常工作所需BIOS文件的集合。另外,每個公司的定義和標準可能不一樣。Linux內核及編程Linux內核的引導初始化代碼(啟動代碼)使處理器從復位狀態進入到操作系統能夠運行的狀態。可劃分為三個階段:初始化硬件配置、診斷、引導。系統的啟動通常用的兩種方式:直接從flash啟動;將壓縮的內存映像文件從Flash(為節省Flash資源,提高速度)中復制、解壓到RAM,再從RAM啟動Linux內核及編程Linux內核的引導X86PC上的Linux引導流程系統啟動運行init進程Bootloader的第一階段Bootloader的第二階段啟動內核BIOSMBRLILO、GRUB內核用戶空間上電/復位Linux內核及編程Linux內核的引導當上電或復位時,CPU會將PC指針賦值為一個特定的地址并執行該地址處的指令,位于BIOS中,保存在ROM或Flash中。BIOS運行時按照CMOS的設置的啟動設備順序來搜索處于活動狀態并且可以引導的設備。主引導加載程序查找并加載次引導加載次引導程序。次引導加載程序加載Linux內核和可選的初始RAM磁盤,將控制權交給Linux內核源代碼。運行被加載的內核,并啟動用戶空間應用程序。Linux內核及編程Linux內核的引導Bootloader著名的LinuxBootloader包括應用于PC的LILO和GRUB,應用于嵌入式系統的U-Boot、RedBoot。怎樣完成啟動內核并運行用戶空間的init進程?當內核映像被加載到RAM之后,Bootloader的控制權被釋放,內核映像并不是完全可直接執行的目標代碼,而是通過一個壓縮過的zImage或bzImage。Linux內核及編程X86PC上的Linux引導流程/arch/i386/boot/head.SStart()Startup_32()Decompress_kernel()Startup_32()Startup_kernel()cpu_idle()/arch/i386/boot/compress/head.S/arch/i386/boot/compress/misc.c/arch/i386/kernel/head.S/init/main.c/init/main.cLinux內核及編程Linux下C編程特點Linux編碼風格Linux命名習慣不同于Windows程序命名習慣和匈牙利法。下劃線大量使用,不采用首字母大寫以區分單詞的方式。代碼縮進使用“TAB”(8個字符)。對于結構體、if/for/while/switch語句,{不另起一行。如果if、for循環后只有1行,不要加{}。if和else混用的情況下,else語句不另起一行。對于函數,{另起一行。switch和case對齊。注意空格的應用,如for(i=0;i<10;i++){。Linux內核及編程Linux下C編程特點GNUC與ANSICLinux上可用的C編譯器是GNUC編譯器,對標準C進行一系列擴展。可以定義零長度和變量長度數組,chardata[0],doublex[n]。把包含在括號中的復合語句看做是一個表達式,稱為語句表達式。typeof(x)語句可以獲得x的類型,借助這個可以重新定義宏。宏也可以接受可變數目的參數,#definepr_debug(fmt,arg…)printk(fmt,##arg)。通過指定索引或結構體成員名,允許初始化值可以順序出現。預定義了兩個標識符保存當前函數的名字。Linux內核及編程Linux下C編程特點GNUC與ANSIC允許聲明函數、變量和類型的特殊屬性,以便進行手工的代碼優化和定制代碼檢查的方法,在聲明后添加__attribute__((ATTRIBUTE)),ATTRIBUTE為屬性說明。Noreturn、format、unused、aligned、packed屬性的意義。提供了大量內建函數,大部分是標準C庫函數,不屬于庫函數的其他內建函數以__builtin開始。在使用gcc編譯C程序的時候,使用gcc–ansi–penantic–ctest.c,則會告訴編譯器不使用GNU擴展語法。Linux內核及編程Linux下C編程特點struct
operators
{
void
(*read1)(char
*);
void
(*read2)(char
*);
void
(*read3)(char
*);
int
n;
};
void
read1(char
*data)
{
printf("read1:
%s/n",data);
}
void
read2(char
*data)
{}
void
read3(char
*data)
{}
int
main()
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- T/CSPSTC 36-2019城市軌道交通BIM協同管理指南
- T/CSIQ 8013.3-2018一體化光伏箱變系列設備技術規范第3部分:1.6 MVA
- T/CRIA 11010-2024綠色輪胎評價規范
- T/CNFMA B004-2018林火防撲機械以汽油機為動力的便攜式火場割灌開帶機
- T/CIQA 26-2021易流態化固體散裝貨物控制水分含量操作規范
- T/CI 311-2024風力發電機組高強鋼塔架焊接附屬件結構疲勞性能評價方法
- T/CHC 1001-2019植物源高有機硒食品原料
- T/CGCC 95-2024書畫藝術品溯源鑒證方法和要求
- T/CGCC 42-2020團體膳食經營管理規范
- T/CFPA 026-2023雷達生命探測儀測試用假人系統
- 酒店籌開期操作手冊(業主代表小組適用)
- 城市生活垃圾衛生填埋場運行管理培訓
- 2023年《早》舒淇早期古裝掰全照原創
- 部編版六年級語文下冊根據語境寫詞語(小升初歸類練習)
- 人工智能之知識庫
- 張哲華鑫仔小品《警察和我》臺詞劇本手稿
- 中等職業學校英語課程標準(2020年版)(word精排版)
- 畢業生就業推薦表word模板
- 南京市特種設備安全監督檢驗研究院公開招考5名編外工作人員模擬檢測試卷【共1000題含答案解析】
- 2023年八年級生物學業水平考試復習試卷
- YY/T 1685-2020氣動脈沖振蕩排痰設備
評論
0/150
提交評論