嵌入式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)核變得龐大起來,不管你是否需要這部分功能,它都會(huì)存在。,建議,經(jīng)常使用的部分直接編譯到內(nèi)核中,比如網(wǎng)卡。,如果編譯成模塊,就會(huì)生成對(duì)應(yīng)的.o文件,在使用的時(shí)候可以動(dòng)態(tài)加載,,優(yōu)點(diǎn),是不會(huì)使內(nèi)核過分龐大,,缺點(diǎn),是你得自己來調(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)組成,用來實(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ù)和全局變量,并且它們的名字沒有明確的含義以至于難以區(qū)別時(shí),就會(huì)發(fā)生所謂的名字空間污染。,程序員需花費(fèi)更多的時(shí)間和精力去記住這些已經(jīng)保留的名字并為新符號(hào)尋找一個(gè)不重復(fù)的名字。,名字空間沖突可能照成很多問題,如加載模塊失敗等古怪問題,解決辦法,將所有符號(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ù)資源不受非法訪問。,內(nèi)核運(yùn)行在最高級(jí)(管理員模式 supervisor mode),可以進(jìn)行所有操作。,應(yīng)用程序運(yùn)行在優(yōu)先級(jí)最低即所謂的用戶模式(user mode),在這一級(jí)中處理器控制著對(duì)硬件的直接訪問以及對(duì)內(nèi)存的非授權(quá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);,寫內(nèi)核或內(nèi)核模塊不能用寫應(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è)程序用來顯示內(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,來完成特定的功能,很少有模塊什么符號(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)表記錄了所有模塊可以訪問的符號(hào)及相應(yīng)的地址。當(dāng)一個(gè)新的 模塊被裝入內(nèi)核后,它所聲明的某些符號(hào)就會(huì)被登記到這個(gè)表中,使這些符號(hào)可能被其 他模塊所引用,這就引出了模塊依賴問題。一個(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è)宏來維護(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)就是其源代碼的公開性。其所有的內(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,如果只想在原來內(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)用來支持跨內(nèi)核版本的模塊支持。,通過kerneld程序的幫助在需要的時(shí)候自動(dòng)載入或卸載那些可載入式的模塊。,系統(tǒng)類型,主要是CPU類型,以及于此相關(guān)的內(nèi)容,常用設(shè)備設(shè)置,可熱拔插的設(shè)備的支持,網(wǎng)