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