linux內(nèi)核驅(qū)動模塊編寫ioctl

linux內(nèi)核驅(qū)動模塊編寫ioctl

ID:34724177

大?。?00.78 KB

頁數(shù):24頁

時間:2019-03-10

linux內(nèi)核驅(qū)動模塊編寫ioctl_第1頁
linux內(nèi)核驅(qū)動模塊編寫ioctl_第2頁
linux內(nèi)核驅(qū)動模塊編寫ioctl_第3頁
linux內(nèi)核驅(qū)動模塊編寫ioctl_第4頁
linux內(nèi)核驅(qū)動模塊編寫ioctl_第5頁
資源描述:

《linux內(nèi)核驅(qū)動模塊編寫ioctl》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫

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

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

3、設(shè)置langtype=pinyin,通過read函數(shù)讀出的數(shù)據(jù)將會是“nihao!Tom/n”??一般的內(nèi)核模塊中不會負(fù)責(zé)設(shè)備類別和節(jié)點的創(chuàng)建,我們在編譯完之后會得到.o或者.ko文件,然后insmod之后需要mknod來創(chuàng)建相應(yīng)文件,這個簡單的例子中我們讓驅(qū)動模塊加載時負(fù)責(zé)自動創(chuàng)建設(shè)備類別和設(shè)備文件。這個功能有兩個步驟,1)創(chuàng)建設(shè)備類別文件?class_create();2)創(chuàng)建設(shè)備文件??device_create();關(guān)于這兩個函數(shù)的使用方法請參閱其他資料。?linux設(shè)備驅(qū)動的編寫相對windows編程來說更容易理解一點因為不需要處理IRP,應(yīng)用層函數(shù)和內(nèi)核函數(shù)的關(guān)

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

5、備操作的各種函數(shù)的指針。我在設(shè)備中用到了這些函數(shù)所以就如下定義,注意下面的寫法不是標(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,};?這個結(jié)構(gòu)體變量定義好之后我們在模塊初始化函數(shù)中就可以通過register_chrdev()或者

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

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

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

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

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