嵌入式linux內(nèi)核的配置及編譯File課件



單擊此處編輯母版標(biāo)題樣式,單擊此處編輯母版文本樣式,第二級(jí),第三級(jí),第四級(jí),第五級(jí),可編輯ppt,*,單擊此處編輯母版標(biāo)題樣式,單擊此處編輯母版文本樣式,二級(jí),三級(jí),四級(jí),五級(jí),可編輯ppt,*,內(nèi)核裁剪篇,1,可編輯ppt,內(nèi)核裁剪篇1可編輯ppt,為什么要裁減內(nèi)核,自己定制編譯的內(nèi)核運(yùn)行更快(具有更少的代碼),系統(tǒng)將擁有更多的內(nèi)存(內(nèi)核部分將不會(huì)被交換到虛擬內(nèi)存中),不需要的功能編譯進(jìn)入內(nèi)核可能會(huì)增加被系統(tǒng)攻擊者利用的漏洞,將某種功能編譯為模塊方式會(huì)比編譯到內(nèi)核內(nèi)的方式速度要慢一些,2,可編輯ppt,為什么要裁減內(nèi)核自己定制編譯的內(nèi)核運(yùn)行更快(具有更少的代碼),如何升級(jí)內(nèi)核,添加進(jìn)內(nèi)核的方式:,將新增加部分編譯到內(nèi)核中(build-in),把新增加部分編譯成模塊(module),動(dòng)態(tài)加載各自特點(diǎn):,編譯到內(nèi)核中,在內(nèi)核啟動(dòng)時(shí)就可以自動(dòng)支持相應(yīng)部分的功能,這樣的,優(yōu)點(diǎn),是方便、速度快,機(jī)器一啟動(dòng),用戶就可以使用這部分功能了;,缺點(diǎn),是會(huì)使內(nèi)核變得龐大起來(lái),不管你是否需要這部分功能,它都會(huì)存在建議,經(jīng)常使用的部分直接編譯到內(nèi)核中,比如網(wǎng)卡如果編譯成模塊,就會(huì)生成對(duì)應(yīng)的.o文件,在使用的時(shí)候可以動(dòng)態(tài)加載,,優(yōu)點(diǎn),是不會(huì)使內(nèi)核過(guò)分龐大,,缺點(diǎn),是你得自己來(lái)調(diào)用這些模塊。
3,可編輯ppt,如何升級(jí)內(nèi)核添加進(jìn)內(nèi)核的方式:3可編輯ppt,內(nèi)核的模塊式結(jié)構(gòu),內(nèi)核模塊是Linux內(nèi)核向外部提供的一個(gè)接口,其全稱為動(dòng)態(tài)可加載內(nèi)核模塊(Loadable Kernel Module,LKM),簡(jiǎn)稱為模塊Linux內(nèi)核之所以提供模塊機(jī)制,是因?yàn)樗旧硎且粋€(gè)單內(nèi)核(monolithic kernel)單內(nèi)核的最大優(yōu)點(diǎn)是效率高,因?yàn)樗械膬?nèi)容都集成在一起,但其缺點(diǎn)是可擴(kuò)展性和可維護(hù)性相對(duì)較差,模塊機(jī)制就是為了彌補(bǔ)這一缺陷4,可編輯ppt,內(nèi)核的模塊式結(jié)構(gòu)內(nèi)核模塊是Linux內(nèi)核向外部提供的一個(gè)接口,模塊,模塊是具有獨(dú)立功能的程序,它可以被單獨(dú)編譯,但不能獨(dú)立運(yùn)行它在運(yùn)行時(shí)被鏈接到內(nèi)核作為內(nèi)核的一部分在內(nèi)核空間運(yùn)行,這與運(yùn)行在用戶空間的進(jìn)程是不同的模塊通常由一組函數(shù)和數(shù)據(jù)結(jié)構(gòu)組成,用來(lái)實(shí)現(xiàn)一種文件系統(tǒng)、一個(gè)驅(qū)動(dòng)程序或內(nèi)核中其他上層的功能5,可編輯ppt,模塊 模塊是具有獨(dú)立功能的程序,它可以被單獨(dú)編譯,但不能獨(dú)立,模塊與內(nèi)核的關(guān)系,模塊和內(nèi)核都在內(nèi)核空間運(yùn)行,模塊編程在一定意義上就是內(nèi)核編程因?yàn)閮?nèi)核版本的每次變化使得其中的某些函數(shù)名也會(huì)相應(yīng)地發(fā)生變化,因此模塊編程與內(nèi)核版本密切相關(guān)。
本課中所涉及的內(nèi)核編程基于的Linux內(nèi)核為24x版本,對(duì)于其他版本,可能還需要做一些調(diào)整6,可編輯ppt,模塊與內(nèi)核的關(guān)系 模塊和內(nèi)核都在內(nèi)核空間運(yùn)行,模塊編程在一定,應(yīng)用程序與內(nèi)核模塊的比較,C語(yǔ)言應(yīng)用程序,內(nèi)核模塊程序,使用函數(shù),libc庫(kù),內(nèi)核函數(shù),運(yùn)行空間,用戶空間,內(nèi)核空間,運(yùn)行權(quán)限,普通用戶,超級(jí)用戶,入口函數(shù),main(),init_module(),出口函數(shù),exit(),cleanup_module(),編譯,gcc-c,gcc c D _KERNEl_ _DMOKULE,連接,gcc,Gcc,運(yùn)行,直接運(yùn)行,insmod,調(diào)試,gdb,kdbug,kdb,kgdb等,7,可編輯ppt,應(yīng)用程序與內(nèi)核模塊的比較C語(yǔ)言應(yīng)用程序內(nèi)核模塊程序使用函數(shù)l,名字空間污染namespace pullution,當(dāng)存在大量的函數(shù)和全局變量,并且它們的名字沒(méi)有明確的含義以至于難以區(qū)別時(shí),就會(huì)發(fā)生所謂的名字空間污染程序員需花費(fèi)更多的時(shí)間和精力去記住這些已經(jīng)保留的名字并為新符號(hào)尋找一個(gè)不重復(fù)的名字名字空間沖突可能照成很多問(wèn)題,如加載模塊失敗等古怪問(wèn)題,解決辦法,將所有符號(hào)定義為靜態(tài)變量,對(duì)于非全局變量的符號(hào)前加上一個(gè)內(nèi)核中唯一的前綴。
8,可編輯ppt,名字空間污染namespace pullution 當(dāng)存在,用戶空間與內(nèi)核空間,操作系統(tǒng)的作用,為程序提供一個(gè)計(jì)算機(jī)硬件的一致視圖負(fù)責(zé)程序的獨(dú)立操作以及保護(hù)資源不受非法訪問(wèn)內(nèi)核運(yùn)行在最高級(jí)(管理員模式 supervisor mode),可以進(jìn)行所有操作應(yīng)用程序運(yùn)行在優(yōu)先級(jí)最低即所謂的用戶模式(user mode),在這一級(jí)中處理器控制著對(duì)硬件的直接訪問(wèn)以及對(duì)內(nèi)存的非授權(quán)訪問(wèn)9,可編輯ppt,用戶空間與內(nèi)核空間操作系統(tǒng)的作用9可編輯ppt,lsmod 查看已注冊(cè)的內(nèi)核,10,可編輯ppt,lsmod 查看已注冊(cè)的內(nèi)核 10可編輯ppt,內(nèi)核模塊實(shí)例,#define _KERNEL_,#define MODULE,#include,#include,int init_module(void),printk(Hellow World!n”);,return 0;,),void cleanup_module(void),printk(Goodbye,cruel world!n”);,),module_init(hello_init);module_exit(hello_exit);,11,可編輯ppt,內(nèi)核模塊實(shí)例#define _KERNEL_ 11可編,模塊主要函數(shù)及定義,頭文件及宏定義,#define _KERNEL_,#define MODULE,#include,#include,module_init():模塊的初始化函數(shù),module_exit():模塊的卸載函數(shù),初始化函數(shù)和卸載函數(shù)必須成對(duì)出現(xiàn)。
模塊常用信息:作者、描述、版權(quán)等,,MODULE_AUTHOR(author);MODULE_DESCRIPTION(the description);MODULE_LICENSE(GPL);,寫(xiě)內(nèi)核或內(nèi)核模塊不能用寫(xiě)應(yīng)用程序時(shí)的系統(tǒng)調(diào)用或函數(shù)庫(kù).,12,可編輯ppt,模塊主要函數(shù)及定義頭文件及宏定義12可編輯ppt,模塊的編譯,KDIR=/YF2410/kernel,INCLUDEDIR=$(KDIR)/include,CFLAGS=-D_KERNEL_-DMODULE-I$(INCLUDEDIR),CC=arm-linux-gcc,OBJS=hello.o,$(OBJS):hello.c,$(CC)$(CFLAGS)-c$,clean:,-rm-f$(OBJS)*.o,13,可編輯ppt,模塊的編譯KDIR=/YF2410/kernel13可編,模塊的加載與卸載,Insmod./hello.o,rmmod hello,14,可編輯ppt,模塊的加載與卸載Insmod./hello.o14可編輯p,modutils,modutils是管理內(nèi)核模塊的一個(gè)軟件包用戶可以在任何提供內(nèi)核源代碼的地方獲取modutils(modutils-xyztar,gz)源代碼,然后選擇最高級(jí)別的、patchxyz等于或小于當(dāng)前版本的內(nèi)核版本,安裝后在sbin目錄下就會(huì)有insmod、rmmod、ksyms、lsmod、modprobe等實(shí)用程序。
當(dāng)然,通常在加載Linux內(nèi)核時(shí),modutils已經(jīng)被載入15,可編輯ppt,modutils modutils是管理內(nèi)核模塊的一個(gè)軟,Modutils的常用命令,insmod命令,調(diào)用insmod程序,把需要插入的模塊以目標(biāo)代碼的形式插入到內(nèi)核中在插入的時(shí)候,insmod自動(dòng)調(diào)用init_module()函數(shù)運(yùn)行注意,只有超級(jí)用戶才能使用這個(gè)命令格式,#insmod pathmodulename.o,rmmod命令,調(diào)用rmmod程序,將已經(jīng)插入內(nèi)核的模塊從內(nèi)核中移出rmmod會(huì)自動(dòng)運(yùn)行 cleanup_module()函數(shù),,格式:,#rmmod pathmodulename.o,16,可編輯ppt,Modutils的常用命令insmod命令16可編輯ppt,Modutils的常用命令,lsmod命令,調(diào)用lsmod程序?qū)@示當(dāng)前系統(tǒng)中正在使用的模塊信息實(shí)際上這個(gè)程序的功能就是讀取procmodules文件中的數(shù)據(jù)格式為:,#lsmod,ksyms命令,Ksyms這個(gè)程序用來(lái)顯示內(nèi)核符號(hào)和模塊符號(hào)表的信息與lsmod相似,它的功能是讀取/proc文件系統(tǒng)中另一個(gè)文件/proc/ksyms的內(nèi)容,17,可編輯ppt,Modutils的常用命令lsmod命令17可編輯ppt,模塊的導(dǎo)出,和用戶空間的應(yīng)用程序不同的是,引入一個(gè)模塊的目的常常是為了給內(nèi)核提供一些routine,來(lái)完成特定的功能,很少有模塊什么符號(hào)都不導(dǎo)出。
Linux為用戶提供了如下宏:,EXPORT_SYMBOL(var);/輸出symbol varEXPORT_SYMBOL_GPL(var);/輸出的symbol版權(quán)為GPL,18,可編輯ppt,模塊的導(dǎo)出和用戶空間的應(yīng)用程序不同的是,引入一個(gè)模塊的目的常,內(nèi)核符號(hào)表,模塊與模塊之間的共享方式,共享變量,函數(shù),內(nèi)核只把各個(gè)模塊中主要的變量和函數(shù)放在一個(gè)特定 的區(qū)段,這些變量和函數(shù)統(tǒng)稱為,符號(hào),對(duì)于內(nèi)核這個(gè)特殊的母模塊,在kemelksymsc中定義了可以從中“移出”的符 號(hào)19,可編輯ppt,內(nèi)核符號(hào)表模塊與模塊之間的共享方式19可編輯ppt,模塊的依賴關(guān)系,模塊依賴,如前所述,內(nèi)核符號(hào)表記錄了所有模塊可以訪問(wèn)的符號(hào)及相應(yīng)的地址當(dāng)一個(gè)新的 模塊被裝入內(nèi)核后,它所聲明的某些符號(hào)就會(huì)被登記到這個(gè)表中,使這些符號(hào)可能被其 他模塊所引用,這就引出了模塊依賴問(wèn)題一個(gè)模塊A引用從另一個(gè)模塊B中移出的符號(hào),叫做模塊B被模塊A引用,或者 模塊A依賴模塊B如果要鏈接模塊A,必須先鏈接模塊B這種模塊間相互依賴的關(guān) 系叫做模塊依賴20,可編輯ppt,模塊的依賴關(guān)系模塊依賴20可編輯ppt,模塊引用計(jì)數(shù)器,為了確保安全地卸載模塊,每個(gè)模塊都有一個(gè)引用計(jì)數(shù)器。
當(dāng)執(zhí)行模塊所涉及的操 作時(shí)就遞增該模塊的計(jì)數(shù)器,在操作結(jié)束時(shí)就遞減這個(gè)計(jì)數(shù)器另外,當(dāng)模塊B被模塊 A引用時(shí),模塊B的引用計(jì)數(shù)器就遞增;引用結(jié)束,計(jì)數(shù)器遞減什么時(shí)候可以卸載這 個(gè)模塊?當(dāng)然只有這個(gè)計(jì)數(shù)器值為0的時(shí)候例如,當(dāng)一個(gè)文件系統(tǒng)還安裝在系統(tǒng)中時(shí) 就不能將其卸載,而當(dāng)這個(gè)文件系統(tǒng)不再被使用時(shí),引用計(jì)數(shù)器為0,可以卸載在linuxmoduleh文件中定義了如下三個(gè)宏來(lái)維護(hù)計(jì)數(shù)器:,MOD INC USE COUNT 當(dāng)前模塊計(jì)數(shù)器加1,MOD DEC USE COUNT 當(dāng)前模塊計(jì)數(shù)器減1,MOD m USE 計(jì)數(shù)器非0時(shí)返回真,21,可編輯ppt,模塊引用計(jì)數(shù)器 為了確保安全地卸載模塊,每個(gè)模塊都有一個(gè)引用,內(nèi)核的編譯,22,可編輯ppt,內(nèi)核的編譯22可編輯ppt,內(nèi)核簡(jiǎn)介,內(nèi)核是一個(gè)操作系統(tǒng)的核心它負(fù)責(zé)管理系統(tǒng)的進(jìn)程、內(nèi)存、設(shè)備驅(qū)動(dòng)程序、文件 和網(wǎng)絡(luò)系統(tǒng),決定著系統(tǒng)的性能和穩(wěn)定性Linux的一個(gè)重要特點(diǎn)就是其源代碼的公開(kāi)性其所有的內(nèi)核源程序都可以在 usrsrcLinux下找到,大部分應(yīng)用軟件都是遵循GPL設(shè)計(jì)的,用戶可以獲取相應(yīng)的源程 序代碼23,可編輯ppt,內(nèi)核簡(jiǎn)介 內(nèi)核是一個(gè)操作系統(tǒng)的核心。
它負(fù)責(zé)管理系統(tǒng)的進(jìn)程、內(nèi),配置內(nèi)核所需指令,#make config,基于文本的、最為傳統(tǒng)的配置界面make menuconfig,基于文本菜單的配置界面,字符終端下推薦使用make xconfig,基于圖形窗口模式的配置界面,Xwindow環(huán)境下推薦使用make oldconfig,如果只想在原來(lái)內(nèi)核配置的基礎(chǔ)上修改一些小地方,用此命令會(huì)省去不少麻煩,24,可編輯ppt,配置內(nèi)核所需指令#make config24可編輯ppt,1,代碼成熟度選項(xiàng),對(duì)那些還在測(cè)試階段的代碼,驅(qū)動(dòng)模塊等的支持對(duì)那些已經(jīng)老舊的,被現(xiàn)有文件替代了的驅(qū)動(dòng),代碼的支持,可以不選動(dòng)態(tài)加載模塊支持選項(xiàng),支持模塊加載功能,該項(xiàng)用來(lái)支持跨內(nèi)核版本的模塊支持通過(guò)kerneld程序的幫助在需要的時(shí)候自動(dòng)載入或卸載那些可載入式的模塊系統(tǒng)類型,主要是CPU類型,以及于此相關(guān)的內(nèi)容,常用設(shè)備設(shè)置,可熱拔插的設(shè)備的支持,網(wǎng)。
