第二章Linux內(nèi)核及內(nèi)核編程_第1頁(yè)
第二章Linux內(nèi)核及內(nèi)核編程_第2頁(yè)
第二章Linux內(nèi)核及內(nèi)核編程_第3頁(yè)
第二章Linux內(nèi)核及內(nèi)核編程_第4頁(yè)
第二章Linux內(nèi)核及內(nèi)核編程_第5頁(yè)
已閱讀5頁(yè),還剩57頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

Linux內(nèi)核及編程第2章Linux內(nèi)核及內(nèi)核編程計(jì)算機(jī)科學(xué)技術(shù)系李偉民2012年7月Linux內(nèi)核及編程提綱Linux內(nèi)核介紹

-Linux內(nèi)核演變及新版特點(diǎn)

-Linux內(nèi)核的組成Linux內(nèi)核編程

-Linux內(nèi)核編譯及加載-Linux下的C編程特點(diǎn)

Linux內(nèi)核及編程Linux內(nèi)核的發(fā)展與演變Linux生存發(fā)展的支柱UNIX操作系統(tǒng):Linux可以看做UNIX的一個(gè)克隆版本Minix操作系統(tǒng):開(kāi)放源代碼,Linux參照Minix于1991年開(kāi)發(fā)GNU計(jì)劃:GNU計(jì)劃和FSF由Stallman于84年創(chuàng)辦,開(kāi)發(fā)出了許多高質(zhì)量的免費(fèi)軟件,為L(zhǎng)inux開(kāi)發(fā)創(chuàng)造了合適的環(huán)境。Posix標(biāo)準(zhǔn):可移植的操作系統(tǒng)接口,保證應(yīng)用程序在源代碼一級(jí)上在多種操作系統(tǒng)上移植,是Linux前進(jìn)的燈塔Internet:從0.95版開(kāi)始,對(duì)內(nèi)核的改進(jìn)和擴(kuò)充以網(wǎng)友為主Linux內(nèi)核及編程Linux內(nèi)核的發(fā)展與演變Linux版本的發(fā)展

從1991年10月最初原型0.1版到2003年12月2.6版,Linux朝著支持更多的CPU、硬件體系結(jié)構(gòu)和外部設(shè)備,支持更廣泛領(lǐng)域的應(yīng)用,提供更好的性能3個(gè)方向發(fā)展。編號(hào)問(wèn)題:奇偶數(shù)編號(hào)含義。

針對(duì)嵌入式系統(tǒng)的應(yīng)用的改進(jìn)內(nèi)核,如HardHatLinux和RTLinux,

uClinux,ThinLinux,MontaVista。Linux內(nèi)核及編程Linux2.6內(nèi)核特點(diǎn)新的調(diào)度器:高負(fù)載下執(zhí)行出色,多處理器也能很好的擴(kuò)展。內(nèi)核搶占:提高實(shí)時(shí)性,增強(qiáng)系統(tǒng)的用戶(hù)交互性。改進(jìn)的線(xiàn)程模型:可以處理任意數(shù)目的線(xiàn)程,最大達(dá)20億。虛擬內(nèi)存的變化:融合反向映射技術(shù)。文件系統(tǒng):支持日志文件系統(tǒng)功能,對(duì)擴(kuò)展屬性及Posix標(biāo)準(zhǔn)訪(fǎng)問(wèn)控制支持,給指定的文件在文件系統(tǒng)中嵌入元數(shù)據(jù)。音頻:ALSA支持USB和MIDI設(shè)備。電源管理:調(diào)節(jié)CPU,降低功耗。聯(lián)網(wǎng)和IPSec:加入對(duì)IPSec和NFSv4的支持,改進(jìn)對(duì)IPv6的支持。用戶(hù)界面層:加入了對(duì)近乎所有接口設(shè)備的支持。Linux內(nèi)核及編程Linux內(nèi)核的組成Linux內(nèi)核源代碼目錄結(jié)構(gòu)arch:和硬件體系結(jié)構(gòu)相關(guān)的代碼,每種平臺(tái)占一個(gè)相應(yīng)目錄。drivers:設(shè)備驅(qū)動(dòng)程序,每個(gè)不同驅(qū)動(dòng)占用一個(gè)子目錄。fs:支持的各種文件系統(tǒng),如EXT、FAT、NTFS、JFFS2。block:塊設(shè)備驅(qū)動(dòng)程序I/O調(diào)度。include:與系統(tǒng)相關(guān)的頭文件放在include/linux下。init:內(nèi)核初始化代碼。kernel:內(nèi)核最核心部分,和平臺(tái)相關(guān)的一部分放在arch/*/kernelmm:內(nèi)存管理代碼,和平臺(tái)相關(guān)的一部分放在arch/*/mmscripts:用于配置內(nèi)核的腳本文件。usr:實(shí)現(xiàn)了用于打包和壓縮的cpio等。Linux內(nèi)核及編程Linux內(nèi)核的組成Linux內(nèi)核組成Linux內(nèi)核及編程Linux內(nèi)核的組成進(jìn)程調(diào)度Linux內(nèi)核及編程Linux內(nèi)核的組成內(nèi)存管理

內(nèi)存管理的主要作用是控制多個(gè)進(jìn)程安全地共享主內(nèi)存區(qū)域。Linux內(nèi)存管理完成為每個(gè)進(jìn)程進(jìn)行虛擬內(nèi)存到物理內(nèi)存的轉(zhuǎn)換。Linux的每個(gè)進(jìn)程享有4GB的內(nèi)存空間,0~3GB屬于用戶(hù)空間,3~4GB屬于內(nèi)核空間,內(nèi)核空間對(duì)常規(guī)內(nèi)存、I/O設(shè)備內(nèi)存以及高端內(nèi)存存在不同的處理方式。虛擬文件系統(tǒng)

隱藏了各種硬件細(xì)節(jié),為所有設(shè)備統(tǒng)一了接口。Linux內(nèi)核及編程Linux內(nèi)核的組成網(wǎng)絡(luò)接口提供對(duì)各種網(wǎng)絡(luò)標(biāo)準(zhǔn)的存取和各種網(wǎng)絡(luò)硬件的支持,分為網(wǎng)絡(luò)協(xié)議和網(wǎng)絡(luò)驅(qū)動(dòng)程序。網(wǎng)絡(luò)協(xié)議實(shí)現(xiàn)可能的網(wǎng)絡(luò)傳輸協(xié)議,網(wǎng)絡(luò)設(shè)備驅(qū)動(dòng)程序負(fù)責(zé)與硬件設(shè)備通信,每一種設(shè)備都有相應(yīng)的驅(qū)動(dòng)程序。進(jìn)程通信支持進(jìn)程間的多種通信機(jī)制,包含信號(hào)量、共享內(nèi)存、管道等,可協(xié)助多個(gè)進(jìn)程、多資源的互斥訪(fǎng)問(wèn)、進(jìn)程間的同步和消息傳遞。Linux內(nèi)核及編程Linux內(nèi)核的組成Linux內(nèi)核組成部分之間的依賴(lài)關(guān)系進(jìn)程創(chuàng)建依賴(lài)內(nèi)存管理的數(shù)據(jù)裝入。進(jìn)程間通信依賴(lài)內(nèi)存管理支持共享內(nèi)存通信機(jī)制。虛擬文件系統(tǒng)利用網(wǎng)絡(luò)接口支持網(wǎng)絡(luò)文件系統(tǒng)。內(nèi)存管理利用虛擬文件系統(tǒng)支持交換,交換進(jìn)程定期由調(diào)度程序調(diào)度,這說(shuō)明內(nèi)存管理也依賴(lài)與進(jìn)程調(diào)度。Linux內(nèi)核及編程Linux內(nèi)核的組成Linux內(nèi)核空間與用戶(hù)空間CPU內(nèi)部實(shí)現(xiàn)了不同操作模式。不同模式有不同功能。Linux系統(tǒng)充分利用了CPU這一特性,但它只使用了兩級(jí):內(nèi)核空間和用戶(hù)空間。內(nèi)核可以進(jìn)行任何操作,用戶(hù)程序被禁止對(duì)硬件的直接訪(fǎng)問(wèn)和對(duì)內(nèi)存的未授權(quán)訪(fǎng)問(wèn),它們的地址空間不同。Linux只能通過(guò)系統(tǒng)調(diào)用和硬件中斷完成從用戶(hù)空間到內(nèi)核空間的控制轉(zhuǎn)移。Linux內(nèi)核及編程Linux內(nèi)核編譯為什么重新編譯內(nèi)核?Linux是一個(gè)自由軟件,內(nèi)核版本不斷更新,并增加了許多特性。根據(jù)自身系統(tǒng),定制更高效,更穩(wěn)定內(nèi)核的需要。更新的版本支持更多的硬件,具備更好的進(jìn)程管理能力,運(yùn)行速度更快,更穩(wěn)定,并一般會(huì)修復(fù)老版本中的bug。

經(jīng)常性地選擇升級(jí)更新的系統(tǒng)內(nèi)核是Linux使用者的必要操作內(nèi)容。編譯適合自己的內(nèi)核,將不需要的功能不要編譯進(jìn)內(nèi)核,以免增加被系統(tǒng)攻擊者利用的漏洞。Linux內(nèi)核及編程Linux內(nèi)核編譯Linux內(nèi)核的獲取和更新linux內(nèi)核版本發(fā)布的官方網(wǎng)站http://。發(fā)布形式:一種是full/Source版本,另外一種是patch文件,即補(bǔ)丁。完整內(nèi)核版本較大,一般是tar.gz或者是.bz2文件,二者分別是使用gzip或者bzip2進(jìn)行壓縮的文件,使用時(shí)需要解壓縮。patch文件則比較小,一般只有幾十K到幾百K,但是patch文件是針對(duì)于特定的版本的,你需要找到自己對(duì)應(yīng)的版本才能使用。Linux內(nèi)核及編程Linux內(nèi)核編譯Linux內(nèi)核編譯準(zhǔn)備知識(shí)編譯內(nèi)核需要root權(quán)限。一般把內(nèi)核拷貝到/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內(nèi)核及編程Linux內(nèi)核編譯步驟通常要運(yùn)行的第一個(gè)命令是:

cd/usr/src/linux

。makemrproper

:該命令確保源代碼目錄下沒(méi)有不正確的.ko文件以及文件的互相依賴(lài)。如果我們使用剛下載的完整的源程序包進(jìn)行編譯,本步可以省略。而如果你多次使用了這些源程序編譯內(nèi)核,那么最好要先運(yùn)行一下這個(gè)命令。Linux內(nèi)核及編程Linux內(nèi)核編譯步驟Linux內(nèi)核配置配置內(nèi)核可以根據(jù)需要與愛(ài)好使用下面命令中的一個(gè):

#makeconfig(基于文本的最為傳統(tǒng)的配置界面,不推薦使用)#makemenuconfig(基于文本選單的配置界面,字符終端下推薦使用)#makexconfig(基于圖形窗口模式的配置界面,Xwindow下推薦使用,要求QT被安裝)#makegconfig(要求GTK+被安裝)。Linux內(nèi)核及編程Linux內(nèi)核編譯步驟Linux內(nèi)核配置界面Linux內(nèi)核及編程Linux內(nèi)核編譯步驟Linux內(nèi)核編譯#makeclean:完成刪除前面步驟留下的文件,以避免出現(xiàn)一些錯(cuò)誤。這在多次編譯過(guò)內(nèi)核的話(huà)是有必要的。makebzImage或makezImage:實(shí)現(xiàn)完全編譯內(nèi)核,二者生成的內(nèi)核都是使用gzip壓縮的,只要使用一個(gè)就夠了,它們的區(qū)別在于使用makebzImage可以生成大一點(diǎn)的內(nèi)核。建議大家使用makezImage命令。Linux內(nèi)核及編程Linux內(nèi)核配置主要項(xiàng)目簡(jiǎn)介L(zhǎng)oadablemodulesupport這個(gè)選項(xiàng)是你的內(nèi)核對(duì)內(nèi)核模塊的支持選項(xiàng),包括是否支持和支持的一些配置等,選擇此項(xiàng)會(huì)使一些不常用到的驅(qū)動(dòng)或特性可以編譯為模塊以減少內(nèi)核的體積。SystemType

選擇對(duì)系統(tǒng)的支持,如什么樣的ARM內(nèi)核,什么樣的配置平臺(tái)等,如果使用不同的處理器其系統(tǒng)或是不同的內(nèi)核時(shí)此處的選項(xiàng)可能不同。Linux內(nèi)核及編程Linux內(nèi)核配置主要項(xiàng)目簡(jiǎn)介GeneralSetup這里是內(nèi)核本身的一些屬性的配置,包括壓縮方式,網(wǎng)絡(luò)支持等很多屬性。Parallelportsupport這個(gè)選項(xiàng)顧名思義就是選擇內(nèi)核對(duì)并口的支持情況,當(dāng)選中對(duì)并口支持后會(huì)出現(xiàn)新的選項(xiàng)來(lái)配置支持不同類(lèi)型不同模式的并口。Linux內(nèi)核及編程Linux內(nèi)核配置主要項(xiàng)目簡(jiǎn)介MemoryTechnologyDevices(MTD)對(duì)MTD設(shè)備的支持選項(xiàng),這個(gè)選項(xiàng)對(duì)嵌入式系統(tǒng)比較重要,內(nèi)核對(duì)各種Flash的支持都在這里配置,包括種類(lèi),分區(qū)等。Blockdevices內(nèi)核對(duì)塊設(shè)備的支持選項(xiàng),各種磁盤(pán)系統(tǒng)的支持。Networkingsupport對(duì)網(wǎng)絡(luò)設(shè)備的支持選項(xiàng),例如系統(tǒng)配置不同的網(wǎng)卡時(shí)就要在這里選中不同的選項(xiàng)。Linux內(nèi)核及編程Linux內(nèi)核配置主要項(xiàng)目簡(jiǎn)介Characterdevices字符型設(shè)備的支持,這個(gè)選項(xiàng)是嵌入式系統(tǒng)經(jīng)常使用的選項(xiàng),嵌入式系統(tǒng)中大量的設(shè)備都屬于Char型的設(shè)備。Multimediadevices多媒體設(shè)備的支持。Filesystems內(nèi)核對(duì)不同文件系統(tǒng)的支持選項(xiàng),在這里選擇需要支持的文件系統(tǒng)。Linux內(nèi)核及編程Linux內(nèi)核配置主要項(xiàng)目簡(jiǎn)介USBsupport各種USB設(shè)備的支持。Bluetoothsupport藍(lán)牙設(shè)備的支持。Kernelhacking內(nèi)核DeBug

用的一些選項(xiàng),用于報(bào)告各種信息。Linux內(nèi)核及編程內(nèi)核配置小結(jié)Linux內(nèi)核的配置系統(tǒng)由以下3個(gè)部分組成Makefile:定義Linux內(nèi)核的編譯規(guī)則。配置文件(Kconfig):給用戶(hù)提供配置選擇的功能。配置工具:配置命令解釋器和配置用戶(hù)界面。使用makemenuconfig等命令后,會(huì)生成一個(gè).config配置文件,記錄哪些被編譯入內(nèi)核,哪些被編譯為內(nèi)核模塊。Linux內(nèi)核及編程Kconfig和MakeFile在Linux內(nèi)核中增加程序需要完成以下3項(xiàng)工作將編寫(xiě)的源代碼拷入Linux內(nèi)核源代碼的相應(yīng)目錄。在目錄的Kconfig文件中增加關(guān)于新源代碼對(duì)應(yīng)項(xiàng)目的配置選項(xiàng)在目錄的Makefile文件中增加對(duì)新源代碼的編譯條目。Makefile定義Linux內(nèi)核的編譯規(guī)則,make工具可以實(shí)現(xiàn)自動(dòng)編譯和增量編譯,但必須告訴make源程序之間的依賴(lài)關(guān)系,描述這種關(guān)系的就是Makefile文件。Linux內(nèi)核及編程MakeFile文件分類(lèi)Linux內(nèi)核及編程MakeFile的作用決定編譯哪些文件頂層Makefile決定內(nèi)核根目錄下哪些子目錄將被編進(jìn)內(nèi)核(采用遞歸的方式)。arch/$(ARCH)/Makefile決定arch/$(ARCH)目錄下哪些文件、哪些目錄將被編進(jìn)內(nèi)核。各級(jí)子目錄下的Makefile決定所在目錄下哪些文件將被編進(jìn)內(nèi)核,哪些文件將被編成模塊(即驅(qū)動(dòng)程序),進(jìn)入哪些子目錄繼續(xù)調(diào)用它們的Makefile

。Linux內(nèi)核及編程Makefile的作用怎樣編譯這些文件?即編譯選項(xiàng)、連接選項(xiàng)是什么。選項(xiàng)分3類(lèi):全局的,適用于整個(gè)內(nèi)核代碼樹(shù);局部的,僅適用于某個(gè)Makefile中的所有文件;個(gè)體的,僅適用于某個(gè)文件。Linux內(nèi)核及編程MakeFile的作用怎樣連接這些文件,它們的順序如何?arch/arm/Makefile:頂層Makefile:Linux內(nèi)核及編程Makefile的作用頂層Makefile按照一定的順序組織文件,根據(jù)連接腳本arc/$(ARCH)/kernel/vmlinux.lds生成內(nèi)核映象文件vmlinux。obj–y用來(lái)定義哪些文件被編進(jìn)(built-in)內(nèi)核。obj-m用來(lái)定義哪些文件被編譯成可加載模塊(Loadablemodule)。lib-y用來(lái)定義哪些文件被編成庫(kù)文件。obj-y、obj-m還可以用來(lái)指定要進(jìn)入的下一層子目錄。Linux內(nèi)核及編程Makefile的主要語(yǔ)法目標(biāo)定義定義哪些內(nèi)容作為模塊編譯,哪些要編譯并連接進(jìn)內(nèi)核。更常見(jiàn)的做法:根據(jù).config文件中的CONFIG變量來(lái)決定文件編譯方式,如:obj-y+=foo.c:表示要由foo.c或者foo.s文件編譯得到foo.o并連接進(jìn)內(nèi)核。obj-$(CONFIG_ISDN)+=isdn.oobj-$(CONFIG_ISDN_PPP_BSDCOMP)+=isdn_bsdc.oLinux內(nèi)核及編程Makefile的主要語(yǔ)法多文件模塊的定義采用模塊名加-y或-bojs后綴來(lái)定義模塊的組成文件。目錄層次迭代當(dāng)CONFIG_EXT2_FS的值為y或m時(shí),kbuild將會(huì)把ext2目錄列入向下迭代的目標(biāo)中。obj-$(CONFIG_EXT2_FS)+=ext2.oext2-y:=balloc.odir.ofile.oobj-$(CONFIG_EXT2_FS)+=ext2/Linux內(nèi)核及編程Kconfig分析一個(gè)文本形式的文件,其中主要作用是在內(nèi)核配置時(shí)候,作為配置選項(xiàng),是各種配置界面的源文件。內(nèi)核的配置工具讀取各個(gè)Kconfig文件,生成配置界面供開(kāi)發(fā)人員配置內(nèi)核,最后生成配置文件.config。內(nèi)核的配置界面以樹(shù)狀的菜單形式組織,主菜單下有若干個(gè)子菜單,子菜單下又有子菜單或配置選項(xiàng)。每個(gè)子菜單或選項(xiàng)可以有依賴(lài)關(guān)系,這些依賴(lài)關(guān)系用來(lái)確定它們是否顯示。只有被依賴(lài)項(xiàng)的父項(xiàng)已經(jīng)被選中,子項(xiàng)才會(huì)顯示。內(nèi)核源碼每個(gè)子目錄中,都有一個(gè)Makefile文件和Kconfig文件。Linux內(nèi)核及編程Kconfig基本要素config條目config條目用來(lái)配置一個(gè)選項(xiàng),它用于生成一個(gè)變量,這個(gè)變量會(huì)連同它的值一起被寫(xiě)入配置文件.config中。config出現(xiàn)的三種配置結(jié)果:config關(guān)鍵字,表示一個(gè)配置選項(xiàng)的開(kāi)始。CONFIG_LEDS_S3C24XX=y#對(duì)應(yīng)的文件被編進(jìn)內(nèi)核CONFIG_LEDS_S3C24XX=m#對(duì)應(yīng)的文件被編成模塊#CONFIG_LEDS_S3C24XX#對(duì)應(yīng)的文件沒(méi)有被使用Linux內(nèi)核及編程Kconfig基本要素config變量類(lèi)型:bool布爾類(lèi)型、

tristate三態(tài)(內(nèi)建、模塊、移除)、string字符串、hex十六進(jìn)制、integer整型。條件判斷:依賴(lài)關(guān)系:缺省值定義:

注意:省略了前綴“CONFIG_”“if〈expr〉”“prompt”<prompt>[“if”<expr>]注意:prompt關(guān)鍵字可以省略“dependson”/“requires”<expr>“default”<expr>[“if”<expr>]Linux內(nèi)核及編程Kconfig基本要素選擇選項(xiàng):幫助信息:

“select”<symbol>[“if”<expr>]“help”or“---help---”Linux內(nèi)核及編程Kconfig基本要素menu條目所有處在“menu”和“endmenu”之間的菜單入口都會(huì)成為“Floatingpointemulation”子菜單。而且,所有子菜單選項(xiàng)都會(huì)繼承父菜單的依賴(lài)關(guān)系。menu“Floatingpointemulation”configFPE_NWFPE……configFPE_NWFPE_XP…………endmenuLinux內(nèi)核及編程Kconfig基本要素choice條目:將多個(gè)類(lèi)似的配置選項(xiàng)組合在一起,供用戶(hù)單選或多選,格式如下:“choice”<choiceoptions><choiceblock>“endchoice”choiceprompt“ARMsystemtype”defaultARCH_VERSATILEconfigARCH_AAEC2000…configARCH_INTEGRATOR…endchoiceLinux內(nèi)核及編程Kconfig基本要素comment條目:用于定義一些幫助信息,它在配置過(guò)程中出現(xiàn)在界面的第一行.并且這些幫助信息會(huì)出現(xiàn)在配置文件中(作為注釋),格式如下:“comment”<prompt><commentoptions>menu“Floatingpointemulation”comment“Atleastoneemulationmustbeselected”Linux內(nèi)核及編程Kconfig基本要素source條目:用于讀入另一個(gè)Kconfig文件,

格式如下:“source”<prompt>source“net/Kconfig”Linux內(nèi)核及編程.config文件分析是在進(jìn)行內(nèi)核配置的時(shí)候,經(jīng)過(guò)配置后生成的內(nèi)核編譯參考文件。是由配置工具自動(dòng)生成。記錄哪些部分被編譯入內(nèi)核、哪些部分被編譯為內(nèi)核模塊。位于源代碼的根目錄下。.config文件節(jié)選:1#

2#Automaticallygeneratedmakeconfig:don’tedit

3#

4CONFIG_X86=y

5CONFIG_MMU=y

6CONFIG_UID16=yLinux內(nèi)核及編程Kconfig、MakeFile、.config三者之間的聯(lián)系我們?cè)趦?nèi)核源碼下面執(zhí)行make命令,實(shí)際上是根據(jù)makefile來(lái)進(jìn)行編譯的。

obj-$(CONFIG_ISDN)+=isdn.o中CONFIG_ISDN是一個(gè)變量,這個(gè)變量的賦值則是通過(guò).config文件來(lái)集中賦值的。CONFIG_ISDN=y..config文件是通過(guò)Kconfig配置生成的。當(dāng)更改Kconfig文件或者通過(guò)配置工具進(jìn)行內(nèi)核配置的時(shí)候會(huì)自動(dòng)更新.config中相應(yīng)的值。這三者是怎樣配合工作的呢?Linux內(nèi)核及編程添加驅(qū)動(dòng)程序到內(nèi)核1、拷貝test到drivers路徑下cp–frtestlinux_kernel_path/drivers2、為新增目錄創(chuàng)建Kconfig和MakefileLinux內(nèi)核及編程添加驅(qū)動(dòng)程序到內(nèi)核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樹(shù)型目錄如下所示:

Linux內(nèi)核及編程Linux內(nèi)核的幾個(gè)概念(補(bǔ)充)驅(qū)動(dòng)層程序包括:硬件抽象層HAL;板間升級(jí)包BSP;設(shè)備驅(qū)動(dòng)程序。硬件抽象層:(HardwareAbstractionLayer)是位于操作系統(tǒng)內(nèi)核與硬件電路之間的接口層,操作系統(tǒng)中通過(guò)接口控制所有硬件電路如CPU、I/O、Memory等的操作。抽象層一般應(yīng)包括相關(guān)硬件的初始化配置操作、數(shù)據(jù)的輸入/輸出操作、硬件設(shè)備操作等功能。Linux內(nèi)核及編程Linux內(nèi)核的幾個(gè)概念(補(bǔ)充)抽象層的特點(diǎn)硬件抽象層具有與硬件的密切相關(guān)性;硬件抽象層具有與操作系統(tǒng)的無(wú)關(guān)性;接口定義的功能應(yīng)包含硬件或系統(tǒng)所需硬件支持的所有功能;接口定義簡(jiǎn)單明了,太多接口函數(shù)會(huì)增加軟件模擬的復(fù)雜性;具有可測(cè)性的接口設(shè)計(jì)有利于系統(tǒng)的軟硬件測(cè)試和集成。Linux內(nèi)核及編程Linux內(nèi)核的幾個(gè)概念(補(bǔ)充)板間升級(jí)包板級(jí)支持包BSP(BoardSupportPackage)是介于主板硬件和操作系統(tǒng)中驅(qū)動(dòng)程序?qū)又g的一層,一般認(rèn)為它屬于操作系統(tǒng)的一部分,主要是實(shí)現(xiàn)對(duì)操作系統(tǒng)的支持,為上層的驅(qū)動(dòng)程序提供訪(fǎng)問(wèn)硬件設(shè)備寄存器的函數(shù)包,使之能夠更好的運(yùn)行于硬件主板。另有說(shuō)法:在WindowsCE中,BSP是驅(qū)動(dòng)程序、OEM適應(yīng)層、硬件抽象層以及啟動(dòng)設(shè)備和使外設(shè)正常工作所需BIOS文件的集合。另外,每個(gè)公司的定義和標(biāo)準(zhǔn)可能不一樣。Linux內(nèi)核及編程Linux內(nèi)核的引導(dǎo)初始化代碼(啟動(dòng)代碼)使處理器從復(fù)位狀態(tài)進(jìn)入到操作系統(tǒng)能夠運(yùn)行的狀態(tài)??蓜澐譃槿齻€(gè)階段:初始化硬件配置、診斷、引導(dǎo)。系統(tǒng)的啟動(dòng)通常用的兩種方式:直接從flash啟動(dòng);將壓縮的內(nèi)存映像文件從Flash(為節(jié)省Flash資源,提高速度)中復(fù)制、解壓到RAM,再?gòu)腞AM啟動(dòng)Linux內(nèi)核及編程Linux內(nèi)核的引導(dǎo)X86PC上的Linux引導(dǎo)流程系統(tǒng)啟動(dòng)運(yùn)行init進(jìn)程Bootloader的第一階段Bootloader的第二階段啟動(dòng)內(nèi)核BIOSMBRLILO、GRUB內(nèi)核用戶(hù)空間上電/復(fù)位Linux內(nèi)核及編程Linux內(nèi)核的引導(dǎo)當(dāng)上電或復(fù)位時(shí),CPU會(huì)將PC指針賦值為一個(gè)特定的地址并執(zhí)行該地址處的指令,位于BIOS中,保存在ROM或Flash中。BIOS運(yùn)行時(shí)按照CMOS的設(shè)置的啟動(dòng)設(shè)備順序來(lái)搜索處于活動(dòng)狀態(tài)并且可以引導(dǎo)的設(shè)備。主引導(dǎo)加載程序查找并加載次引導(dǎo)加載次引導(dǎo)程序。次引導(dǎo)加載程序加載Linux內(nèi)核和可選的初始RAM磁盤(pán),將控制權(quán)交給Linux內(nèi)核源代碼。運(yùn)行被加載的內(nèi)核,并啟動(dòng)用戶(hù)空間應(yīng)用程序。Linux內(nèi)核及編程Linux內(nèi)核的引導(dǎo)Bootloader著名的LinuxBootloader包括應(yīng)用于PC的LILO和GRUB,應(yīng)用于嵌入式系統(tǒng)的U-Boot、RedBoot。怎樣完成啟動(dòng)內(nèi)核并運(yùn)行用戶(hù)空間的init進(jìn)程?當(dāng)內(nèi)核映像被加載到RAM之后,Bootloader的控制權(quán)被釋放,內(nèi)核映像并不是完全可直接執(zhí)行的目標(biāo)代碼,而是通過(guò)一個(gè)壓縮過(guò)的zImage或bzImage。Linux內(nèi)核及編程X86PC上的Linux引導(dǎo)流程/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內(nèi)核及編程Linux下C編程特點(diǎn)Linux編碼風(fēng)格Linux命名習(xí)慣不同于Windows程序命名習(xí)慣和匈牙利法。下劃線(xiàn)大量使用,不采用首字母大寫(xiě)以區(qū)分單詞的方式。代碼縮進(jìn)使用“TAB”(8個(gè)字符)。對(duì)于結(jié)構(gòu)體、if/for/while/switch語(yǔ)句,{不另起一行。如果if、for循環(huán)后只有1行,不要加{}。if和else混用的情況下,else語(yǔ)句不另起一行。對(duì)于函數(shù),{另起一行。switch和case對(duì)齊。注意空格的應(yīng)用,如for(i=0;i<10;i++){。Linux內(nèi)核及編程Linux下C編程特點(diǎn)GNUC與ANSICLinux上可用的C編譯器是GNUC編譯器,對(duì)標(biāo)準(zhǔn)C進(jìn)行一系列擴(kuò)展??梢远x零長(zhǎng)度和變量長(zhǎng)度數(shù)組,chardata[0],doublex[n]。把包含在括號(hào)中的復(fù)合語(yǔ)句看做是一個(gè)表達(dá)式,稱(chēng)為語(yǔ)句表達(dá)式。typeof(x)語(yǔ)句可以獲得x的類(lèi)型,借助這個(gè)可以重新定義宏。宏也可以接受可變數(shù)目的參數(shù),#definepr_debug(fmt,arg…)printk(fmt,##arg)。通過(guò)指定索引或結(jié)構(gòu)體成員名,允許初始化值可以順序出現(xiàn)。預(yù)定義了兩個(gè)標(biāo)識(shí)符保存當(dāng)前函數(shù)的名字。Linux內(nèi)核及編程Linux下C編程特點(diǎn)GNUC與ANSIC允許聲明函數(shù)、變量和類(lèi)型的特殊屬性,以便進(jìn)行手工的代碼優(yōu)化和定制代碼檢查的方法,在聲明后添加__attribute__((ATTRIBUTE)),ATTRIBUTE為屬性說(shuō)明。Noreturn、format、unused、aligned、packed屬性的意義。提供了大量?jī)?nèi)建函數(shù),大部分是標(biāo)準(zhǔn)C庫(kù)函數(shù),不屬于庫(kù)函數(shù)的其他內(nèi)建函數(shù)以__builtin開(kāi)始。在使用gcc編譯C程序的時(shí)候,使用gcc–ansi–penantic–ctest.c,則會(huì)告訴編譯器不使用GNU擴(kuò)展語(yǔ)法。Linux內(nèi)核及編程Linux下C編程特點(diǎn)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. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論