資源描述:
《linux字符設備驅(qū)動程序筆記》由會員上傳分享,免費在線閱讀,更多相關內(nèi)容在工程資料-天天文庫。
1、4.6linux字符設備驅(qū)動程序[4-6-l]linux驅(qū)動程序介紹(參考課件)驅(qū)動程序:使硬件工作的軟件。早期驅(qū)動-模式一應用程序1應用程序2ReadRegReadMemReadRegReadMemWriteRegWriteMemWriteRegWriteMem硬件模型一的缺點:軟件程序的復用性不好O醐wv/w.enjoyHnux.cniw/w.enjoytlnux.cn早期驅(qū)動?模式二模型二的缺點:如果驅(qū)動程序接口變化,則所有的應用程序就必須都改模型三:即linux驅(qū)動程序驅(qū)動模型:如圖“使用驅(qū)動程序所示”。解決了上述兩種模型的缺點。linu
2、x驅(qū)動程序的分類:◎字符設備驅(qū)動(重點)◎網(wǎng)絡接口驅(qū)動(東點)◎塊設備驅(qū)動1)字符設備:字符設備是一種按字節(jié)來訪問的設備,字符驅(qū)動則負貴驅(qū)動字符設備,這樣的驅(qū)動通常實現(xiàn)open,close,read和write系統(tǒng)調(diào)用。2)塊設備:◎在大部分unix系統(tǒng),塊沒備不能按字節(jié)處理數(shù)據(jù),只能一次傳送一個或多個長度是512字節(jié)(或一個更大的2次冪的數(shù))的整塊數(shù)裾。◎而Linux則允許塊設備傳送任意數(shù)目的字節(jié)。因此塊和字符設備的區(qū)別:僅僅是驅(qū)動的接口函數(shù)與內(nèi)核的接口函數(shù)不同。3)網(wǎng)絡接口:任何網(wǎng)絡事物都通過一個接口來進行,一個接口通常是一個硬件(ethO)
3、,但它也可以是一個純粹的軟件設備,比如回環(huán)接口(lo)。一個網(wǎng)絡接口負責發(fā)送和接收數(shù)據(jù)報文。字符設備與塊設備:隨機訪問?塊設備隨機訪問,字符設備必須按順序訪問驅(qū)動程序安裝方式:有兩種◎模塊方式(己知)(insmod,rmmod)◎直接編譯進閃核如何直接把驅(qū)動程序(內(nèi)核模塊)編譯進內(nèi)核?需要修改兩個文件:Kconfig,Makefile(Kconfig用來產(chǎn)生配置菜舉,到處有Kconfig):第一步:首先把驅(qū)動程序或內(nèi)核模塊源文件(hello.c)放到內(nèi)核源代碼相應的H錄下(根據(jù)功能選擇目錄)(如drivers/char下)第二步:修改Kconfi
4、g,修改所放源文件目錄下的Kconfig,在內(nèi)核源代碼的頂層目錄執(zhí)行:vidrivers/char/Kconfig(打開Kconfig),然后在其中加上如下兩行代碼(照著寫):configHELLO.WORLDBool“helloworld”第三步:通過makemenuconfigARCH=arm進入配置菜單,選屮剛添加(要編譯進內(nèi)核)的項。配賈結(jié)果體現(xiàn)在(.config)屮,.config文件位于內(nèi)核源代碼頂層目錄下,通過vi.config可以查看??梢钥吹剑篊ONFIG_HELLO_WORLD=y第四步:修改Makefile,修改所放源文件目
5、4下的Makefile。照著寫obj-$(CONFIG_HELLO_WORLD)+=hello.o(加上這一項,hello.c)第五步:編譯A核。修改好后,回到A核源代碼頂層目錄執(zhí)行如下命令編譯A核。:maleulmageARCH=armCROSS_COMPILE=arm-linux-111I-1TZ,/-pri
6、L*1^個個個個個個個個個個個個個個個個個個個個個個個個個個個個個M11c4{/II?個個中個個個個個個個個個中個個個個個中個個個個個個個個個個個個個個個#include#include7、nit.h>staticint_inithello_init()printkfhelloworld!H);return0;}staticvoid一exithello_exit(){printk(KERN_EMERG"helloexit!"}module_init(hello_init);module_exit(hello_exit);^2z?f>rTwrTwrTwrTwrTwrT*rT*rT*rT*rT*rT*rTwrT*rTwrT*rTwrT*rTwrT*rTwrT*rTwrTwrTwrTwrTwrTwrTwrTwrTwrTwrTwrT
8、wrTwrTwrTwrTwrTwrTwrTwrTwrTwrTwrTwr7wrTwr7wrTwr7wrTwr7wrTwr7wrTwr7wrTwr7wrTwr7wrTwr7wrTwr7wrTwr7wrTw編譯完成啟動P、j核的過程屮,會打印出:HelloWorld!信息。因為執(zhí)行了模塊初始化函數(shù)。__init標志表示此函數(shù)將被放置到初始化代碼段;內(nèi)核在啟動吋,會依次調(diào)用初始化代碼段中的函數(shù)指針。_exit類似。驅(qū)動程序使用:linux用戶程序通過設備文件(也稱:設備節(jié)點)來使用驅(qū)動程序操作字符設備和塊設備(根據(jù)町p找到在內(nèi)核里面對應的stmxtfil
9、e結(jié)構(gòu),從而找到相應的read,write函數(shù))網(wǎng)絡設備沒有設備文件,設備文件在dev0錄下囲。[4-6-2]字符設備驅(qū)動程序設計(參考