Linux內(nèi)核驅(qū)動(dòng)模塊編寫概覽-ioctl,class_create,device_create

Linux內(nèi)核驅(qū)動(dòng)模塊編寫概覽-ioctl,class_create,device_create

ID:47614493

大?。?76.50 KB

頁數(shù):12頁

時(shí)間:2019-10-09

Linux內(nèi)核驅(qū)動(dòng)模塊編寫概覽-ioctl,class_create,device_create_第1頁
Linux內(nèi)核驅(qū)動(dòng)模塊編寫概覽-ioctl,class_create,device_create_第2頁
Linux內(nèi)核驅(qū)動(dòng)模塊編寫概覽-ioctl,class_create,device_create_第3頁
Linux內(nèi)核驅(qū)動(dòng)模塊編寫概覽-ioctl,class_create,device_create_第4頁
Linux內(nèi)核驅(qū)動(dòng)模塊編寫概覽-ioctl,class_create,device_create_第5頁
資源描述:

《Linux內(nèi)核驅(qū)動(dòng)模塊編寫概覽-ioctl,class_create,device_create》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在學(xué)術(shù)論文-天天文庫。

1、如果你對(duì)內(nèi)核驅(qū)動(dòng)模塊一無所知,請(qǐng)先學(xué)習(xí)內(nèi)核驅(qū)動(dòng)模塊的基礎(chǔ)知識(shí)。如果你已經(jīng)入門了內(nèi)核驅(qū)動(dòng)模塊,但是仍感覺有些模糊,不能從整體來了解一個(gè)內(nèi)核驅(qū)動(dòng)模塊的結(jié)構(gòu),請(qǐng)賞讀一下這篇拙文。如果你已經(jīng)從事內(nèi)核模塊編程N(yùn)年,并且道行高深,也請(qǐng)不吝賜教一下文中的疏漏錯(cuò)誤。?本文中我將實(shí)現(xiàn)一個(gè)簡(jiǎn)單的Linux字符設(shè)備,旨在大致勾勒出linux內(nèi)核模塊的編寫方法的輪廓。其中重點(diǎn)介紹ioctl的用途。我把這個(gè)簡(jiǎn)單的Linux字符設(shè)備模塊命名為hello_mod.設(shè)備類型名為hello_class設(shè)備名為hello?該設(shè)備是一個(gè)虛擬設(shè)備,模塊加載時(shí)會(huì)在/sys/class/中創(chuàng)建名為hello_class的邏輯設(shè)備

2、,在/dev/中創(chuàng)建hello的物理設(shè)備文件。模塊名為hello_mod,可接受輸入字符串?dāng)?shù)據(jù)(長(zhǎng)度小于128),處理該輸入字符串之后可向外輸出字符串。并且可以接受ioctl()函數(shù)控制內(nèi)部處理字符串的方式。例如:a.通過write函數(shù)寫入“Tom”,通過ioctl函數(shù)設(shè)置langtype=chinese,通過read函數(shù)讀出的數(shù)據(jù)將會(huì)是“你好!Tom/n”b.通過write函數(shù)寫入“Tom”,通過ioctl函數(shù)設(shè)置langtype=english,通過read函數(shù)讀出的數(shù)據(jù)將會(huì)是“hello!Tom/n”c.通過write函數(shù)寫入“Tom”,通過ioctl函數(shù)設(shè)置langtype=p

3、inyin,通過read函數(shù)讀出的數(shù)據(jù)將會(huì)是“nihao!Tom/n”??一般的內(nèi)核模塊中不會(huì)負(fù)責(zé)設(shè)備類別和節(jié)點(diǎn)的創(chuàng)建,我們?cè)诰幾g完之后會(huì)得到.o或者.ko文件,然后insmod之后需要mknod來創(chuàng)建相應(yīng)文件,這個(gè)簡(jiǎn)單的例子中我們讓驅(qū)動(dòng)模塊加載時(shí)負(fù)責(zé)自動(dòng)創(chuàng)建設(shè)備類別和設(shè)備文件。這個(gè)功能有兩個(gè)步驟,1)創(chuàng)建設(shè)備類別文件?class_create();2)創(chuàng)建設(shè)備文件??device_create();關(guān)于這兩個(gè)函數(shù)的使用方法請(qǐng)參閱其他資料。?linux設(shè)備驅(qū)動(dòng)的編寫相對(duì)windows編程來說更容易理解一點(diǎn)因?yàn)椴恍枰幚鞩RP,應(yīng)用層函數(shù)和內(nèi)核函數(shù)的關(guān)聯(lián)方式淺顯易懂。比如當(dāng)應(yīng)曾函數(shù)對(duì)我的

4、設(shè)備調(diào)用了open()函數(shù),而最終這個(gè)應(yīng)用層函數(shù)會(huì)調(diào)用我的設(shè)備中的自定義open()函數(shù),這個(gè)函數(shù)要怎么寫呢,我在我的設(shè)備中定義的函數(shù)名是hello_mod_open,注意函數(shù)名是可以隨意定義,但是函數(shù)簽名是要符合內(nèi)核要求的,具體的定義是怎么樣請(qǐng)看?staticinthello_mod_open(structinode*,structfile*);?這樣就定義了內(nèi)核中的open函數(shù),這只是定義還需要與我們自己的模塊關(guān)聯(lián)起來,這就要用到一個(gè)結(jié)構(gòu)?structfile_operations?這個(gè)結(jié)構(gòu)里面的成員是對(duì)應(yīng)于設(shè)備操作的各種函數(shù)的指針。我在設(shè)備中用到了這些函數(shù)

5、所以就如下定義,注意下面的寫法不是標(biāo)準(zhǔn)ANSIC的語法,而是GNU擴(kuò)展語法。?structfile_operationshello_mod_fops={?.owner=THIS_MODULE,?.open=hello_mod_open,?.read=hello_mod_read,?.write=hello_mod_write,?.ioctl=hello_mod_ioctl,?.release=hello_mod_release,};?這個(gè)結(jié)構(gòu)體變量定義好之后我們?cè)谀K初始化函數(shù)中就可以通過register_chrdev()或者填充cdev結(jié)構(gòu)來關(guān)聯(lián)所有的操作到我們的模塊函數(shù)了。?和設(shè)備

6、交互的數(shù)據(jù)我們總稱為“數(shù)據(jù)”,但是大致可劃分為兩種“功能數(shù)據(jù)”:我們要輸入設(shè)備處理的和設(shè)備處理完之后輸出的數(shù)據(jù)。“控制數(shù)據(jù)”:我們用來控制設(shè)備特性功能的命令和參數(shù)。open,read,write,release等函數(shù)是對(duì)一個(gè)驅(qū)動(dòng)模塊的使用,就是我們對(duì)“設(shè)備的功能”的使用。但是一個(gè)設(shè)備有可能有很多功能,那么我們要怎么控制設(shè)備讓設(shè)備完成指定的功能呢?據(jù)個(gè)例子來說:假如我們有一個(gè)翻譯機(jī)(姑且說機(jī)吧,也可能是器)實(shí)體設(shè)備,主要功能是輸入中文,然后可以輸出各種語言對(duì)應(yīng)的翻譯結(jié)果,那這個(gè)機(jī)的功能就是翻譯,我們真正用來處理的數(shù)據(jù)是我們輸入的中文,我們要得到的“設(shè)備功能”就是翻譯后的輸出內(nèi)容,而各種語

7、言則是我們的選擇控制了,我們可設(shè)定這個(gè)設(shè)備翻譯成何種語言。這就要求我們要向設(shè)備發(fā)送命令,設(shè)定目標(biāo)語言。請(qǐng)注意我們要發(fā)送的是兩個(gè)“控制數(shù)據(jù)”,命令和參數(shù)。?命令:一個(gè)設(shè)備可能有很多種行為,我們的命令就是代表我們要讓設(shè)備執(zhí)行何種行為?!皬?fù)位”,“設(shè)定目標(biāo)語言”,“獲得當(dāng)前目標(biāo)語言”等參數(shù):對(duì)于某一個(gè)命令,可能需要參數(shù)可能不需要參數(shù)。???????比如:????????“復(fù)位”命令就不需要參數(shù)。???????“設(shè)定目標(biāo)語言”則需要傳入目標(biāo)語言的類型。

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

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

當(dāng)前文檔最多預(yù)覽五頁,下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無此問題,請(qǐng)放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫負(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)等原因無法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請(qǐng)聯(lián)系客服處理。