linux驅(qū)動(dòng)程序編寫(xiě)基礎(chǔ).ppt

linux驅(qū)動(dòng)程序編寫(xiě)基礎(chǔ).ppt

ID:48186389

大小:438.50 KB

頁(yè)數(shù):45頁(yè)

時(shí)間:2020-01-18

linux驅(qū)動(dòng)程序編寫(xiě)基礎(chǔ).ppt_第1頁(yè)
linux驅(qū)動(dòng)程序編寫(xiě)基礎(chǔ).ppt_第2頁(yè)
linux驅(qū)動(dòng)程序編寫(xiě)基礎(chǔ).ppt_第3頁(yè)
linux驅(qū)動(dòng)程序編寫(xiě)基礎(chǔ).ppt_第4頁(yè)
linux驅(qū)動(dòng)程序編寫(xiě)基礎(chǔ).ppt_第5頁(yè)
資源描述:

《linux驅(qū)動(dòng)程序編寫(xiě)基礎(chǔ).ppt》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。

1、Linux操作系統(tǒng)分析與實(shí)踐第七講:Linux驅(qū)動(dòng)程序編寫(xiě)基礎(chǔ)《Linux操作系統(tǒng)分析與實(shí)踐》課程建設(shè)小組北京大學(xué)二零零八年春季*致謝:感謝Intel對(duì)本課程項(xiàng)目的資助本講主要內(nèi)容Linux內(nèi)核模塊中斷和中斷處理下半部Linux內(nèi)核模塊Linux操作系統(tǒng)的內(nèi)核是單一體系結(jié)構(gòu)(monolithickernel)有了模塊機(jī)制后,提高Linux操作系統(tǒng)的可擴(kuò)充性,內(nèi)核編程不再是一個(gè)惡夢(mèng)什么是模塊呢?模塊的全稱(chēng)是“動(dòng)態(tài)可加載內(nèi)核模塊”(LoadableKernelModule,LKM)模塊在內(nèi)核空間運(yùn)行模塊實(shí)際上是一種目標(biāo)對(duì)

2、象文件沒(méi)有鏈接,不能獨(dú)立運(yùn)行,但是其代碼可以在運(yùn)行時(shí)鏈接到系統(tǒng)中作為內(nèi)核的一部分運(yùn)行或從內(nèi)核中取下,從而可以動(dòng)態(tài)擴(kuò)充內(nèi)核的功能這種目標(biāo)代碼通常由一組函數(shù)和數(shù)據(jù)結(jié)構(gòu)組成Linux內(nèi)核模塊的優(yōu)點(diǎn)與缺點(diǎn)優(yōu)點(diǎn)使得內(nèi)核更加緊湊和靈活修改內(nèi)核時(shí),不必全部重新編譯整個(gè)內(nèi)核。系統(tǒng)如果需要使用新模塊,只要編譯相應(yīng)的模塊,然后使用insmod將模塊裝載即可模塊的目標(biāo)代碼一旦被鏈接到內(nèi)核,它的作用域和靜態(tài)鏈接的內(nèi)核目標(biāo)代碼完全等價(jià)缺點(diǎn)由于內(nèi)核所占用的內(nèi)存是不會(huì)被換出的,所以鏈接進(jìn)內(nèi)核的模塊會(huì)給整個(gè)系統(tǒng)帶來(lái)一定的性能和內(nèi)存利用方面的損失;裝

3、入內(nèi)核的模塊就成為內(nèi)核的一部分,可以修改內(nèi)核中的其他部分,因此,模塊的使用不當(dāng)會(huì)導(dǎo)致系統(tǒng)崩潰;為了讓內(nèi)核模塊能訪問(wèn)所有內(nèi)核資源,內(nèi)核必須維護(hù)符號(hào)表,并在裝入和卸載模塊時(shí)修改符號(hào)表;模塊會(huì)要求利用其它模塊的功能,所以,內(nèi)核要維護(hù)模塊之間的依賴(lài)性.Linux內(nèi)核模塊與應(yīng)用程序的區(qū)別C語(yǔ)言程序Linux內(nèi)核模塊運(yùn)行用戶空間內(nèi)核空間入口main()module_init()指定;出口無(wú)module_exit()指定;編譯gcc–cMakefile連接ldinsmod運(yùn)行直接運(yùn)行insmod調(diào)試gdbkdbug,kdb,kgd

4、b等模塊相關(guān)命令insmod[moduleparameters]Loadthemodule注意,只有超級(jí)用戶才能使用這個(gè)命令RmmodUnloadthemodulelsmodListallmodulesloadedintothekernel這個(gè)命令和cat/proc/modules等價(jià)modprobe[-r]–Loadthemodulespecifiedandmodulesitdepends模塊依賴(lài)一個(gè)模塊A引用另一個(gè)模塊B所導(dǎo)出的符號(hào),我們就說(shuō)模塊B被模塊A引用。如果要

5、裝載模塊A,必須先要裝載模塊B。否則,模塊B所導(dǎo)出的那些符號(hào)的引用就不可能被鏈接到模塊A中。這種模塊間的相互關(guān)系就叫做模塊依賴(lài)。最簡(jiǎn)單的內(nèi)核模塊例子#include#include#includestaticint__inithello_init(void){printk(KERN_INFO"Helloworld");return0;}staticvoid__exithello_exit(void){printk(KERN

6、_INFO"Goodbyeworld");}module_init(hello_init);module_exit(hello_exit);staticint__inithello_init(void)staticvoid__exithello_exit(void)Static聲明,因?yàn)檫@種函數(shù)在特定文件之外沒(méi)有其它意義__init標(biāo)記,該函數(shù)只在初始化期間使用。模塊裝載后,將該函數(shù)占用的內(nèi)存空間釋放_(tái)_exit標(biāo)記該代碼僅用于模塊卸載。Init/exit宏:module_init/module_exit聲明模塊

7、初始化及清除函數(shù)所在的位置裝載和卸載模塊時(shí),內(nèi)核可以自動(dòng)找到相應(yīng)的函數(shù)module_init(hello_init);module_exit(hello_exit);編譯內(nèi)核模塊Makefile文件obj-m:=hello.oall:make-C/lib/modules/$(shelluname-r)/buildM=$(shellpwd)modulesclean:make-C/lib/modules/$(shelluname-r)/buildM=$(shellpwd)cleanModuleincludesmorefi

8、lesobj-m:=hello.ohello-objs:=a.ob.o裝載和卸載模塊相關(guān)命令lsmodinsmodhello.kormmodhello.ko模塊參數(shù)傳遞有些模塊需要傳遞一些參數(shù)參數(shù)在模塊加載時(shí)傳遞#insmodhello.kotest=2參數(shù)需要使用module_param宏來(lái)聲明module_param的參數(shù):變量名稱(chēng),類(lèi)型以

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫(huà)的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無(wú)此問(wèn)題,請(qǐng)放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫(kù)負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭(zhēng)議請(qǐng)及時(shí)聯(lián)系客服。
3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無(wú)法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請(qǐng)聯(lián)系客服處理。