資源描述:
《linux字符設(shè)備驅(qū)動程序_筆記》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫。
1、4.6linux字符設(shè)備驅(qū)動程序4.6linux字符設(shè)備驅(qū)動程序[4-6-1]linux驅(qū)動程序介紹(參考課件)驅(qū)動程序:使硬件工作的軟件。模型一的缺點(diǎn):軟件程序的復(fù)用性不好模型二的缺點(diǎn):如果驅(qū)動程序接口變化,則所有的應(yīng)用程序就必須都改模型三:即linux驅(qū)動程序驅(qū)動模型:如圖“使用驅(qū)動程序所示”。解決了上述兩種模型的缺點(diǎn)。4.6linux字符設(shè)備驅(qū)動程序10/104.6linux字符設(shè)備驅(qū)動程序linux驅(qū)動程序的分類:◎字符設(shè)備驅(qū)動(重點(diǎn))◎網(wǎng)絡(luò)接口驅(qū)動(重點(diǎn))◎塊設(shè)備驅(qū)動1)字符設(shè)備:字符設(shè)備是一種按字節(jié)來訪問的設(shè)備,字符驅(qū)動則負(fù)責(zé)驅(qū)動
2、字符設(shè)備,這樣的驅(qū)動通常實(shí)現(xiàn)open,close,read和write系統(tǒng)調(diào)用。2)塊設(shè)備:◎在大部分unix系統(tǒng),塊設(shè)備不能按字節(jié)處理數(shù)據(jù),只能一次傳送一個或多個長度是512字節(jié)(或一個更大的2次冪的數(shù))的整塊數(shù)據(jù)?!蚨鳯inux則允許塊設(shè)備傳送任意數(shù)目的字節(jié)。因此塊和字符設(shè)備的區(qū)別:僅僅是驅(qū)動的接口函數(shù)與內(nèi)核的接口函數(shù)不同。3)網(wǎng)絡(luò)接口:任何網(wǎng)絡(luò)事物都通過一個接口來進(jìn)行,一個接口通常是一個硬件(eth0),但它也可以是一個純粹的軟件設(shè)備,比如回環(huán)接口(lo)。一個網(wǎng)絡(luò)接口負(fù)責(zé)發(fā)送和接收數(shù)據(jù)報(bào)文。字符設(shè)備與塊設(shè)備:隨機(jī)訪問?塊設(shè)備隨機(jī)訪問,
3、字符設(shè)備必須按順序訪問驅(qū)動程序安裝方式:有兩種◎模塊方式(已知)(insmod,rmmod)◎直接編譯進(jìn)內(nèi)核如何直接把驅(qū)動程序(內(nèi)核模塊)編譯進(jìn)內(nèi)核?需要修改兩個文件:Kconfig,Makefile(Kconfig用來產(chǎn)生配置菜單,到處有Kconfig):第一步:首先把驅(qū)動程序或內(nèi)核模塊源文件(hello.c)放到內(nèi)核源代碼相應(yīng)的目錄下(根據(jù)功能選擇目錄)(如drivers/char下)第二步:修改Kconfig,修改所放源文件目錄下的Kconfig,在內(nèi)核源代碼的頂層目錄執(zhí)行:vidrivers/char/Kconfig(打開Kconfi
4、g),然后在其中加上如下兩行代碼(照著寫):configHELLO_WORLDBool“helloworld”第三步:通過makemenuconfigARCH=arm進(jìn)入配置菜單,選中剛添加(要編譯進(jìn)內(nèi)核)的項(xiàng)。配置結(jié)果體現(xiàn)在(.config)中,.config文件位于內(nèi)核源代碼頂層目錄下,通過vi.config可以查看。可以看到:CONFIG_HELLO_WORLD=y第四步:修改Makefile,修改所放源文件目錄下的Makefile。照著寫obj-$(CONFIG_HELLO_WORLD)+=hello.o(加上這一項(xiàng),hello.c)
5、第五步:編譯內(nèi)核。修改好后,回到內(nèi)核源代碼頂層目錄執(zhí)行如下命令編譯內(nèi)核。:maleuImageARCH=armCROSS_COMPILE=arm-linux-hello.c代碼如下:#include#includestaticint__inithello_init(){4.6linux字符設(shè)備驅(qū)動程序10/104.6linux字符設(shè)備驅(qū)動程序printk("helloworld!");return0;}staticvoid__exithello_exit(){printk(KER
6、N_EMERG"helloexit!");}module_init(hello_init);module_exit(hello_exit);編譯完成啟動內(nèi)核的過程中,會打印出:HelloWorld!信息。因?yàn)閳?zhí)行了模塊初始化函數(shù)。__init標(biāo)志表示此函數(shù)將被放置到初始化代碼段;內(nèi)核在啟動時(shí),會依次調(diào)用初始化代碼段中的函數(shù)指針。__exit類似。驅(qū)動程序使用:linux用戶程序通過設(shè)備文件(也稱:設(shè)備節(jié)點(diǎn))來使用驅(qū)動程序操作字符設(shè)備和塊設(shè)備(根據(jù)fp找到在內(nèi)核里面對應(yīng)的sturctfile結(jié)構(gòu),從而找到相應(yīng)的read,write函數(shù))網(wǎng)絡(luò)
7、設(shè)備沒有設(shè)備文件,設(shè)備文件在dev目錄下面。[4-6-2]字符設(shè)備驅(qū)動程序設(shè)計(jì)(參考課件)1、主次設(shè)備號字符設(shè)備通過字符設(shè)備文件來存取。字符設(shè)備文件由使用ls–l命令后輸出的第一列的“c”標(biāo)識。在dev目錄下使用ls–l命令可以看到設(shè)備文件項(xiàng)中有2個數(shù)字,由逗號分隔,這些數(shù)字就是設(shè)備文件的主次設(shè)備編號。前主后次。4.6linux字符設(shè)備驅(qū)動程序10/104.6linux字符設(shè)備驅(qū)動程序1.1設(shè)備號的作用思考:字符設(shè)備文件與字符設(shè)備驅(qū)動如何建立聯(lián)系?——通過主設(shè)備號設(shè)備文件所對應(yīng)的主設(shè)備號和驅(qū)動程序所對應(yīng)的主設(shè)備號相同的話,那么這個驅(qū)動程序就對
8、應(yīng)這個設(shè)備文件。(設(shè)備文件的主設(shè)備號通過創(chuàng)建設(shè)定,驅(qū)動程序通過申請獲得)主設(shè)備號:用來標(biāo)識與設(shè)備文件相連的驅(qū)動程序。次設(shè)備號:被驅(qū)動程序用來辨別操作的是哪個設(shè)備。總