您好,登錄后才能下訂單哦!
怎樣進(jìn)行Linux驅(qū)動開發(fā)注冊,相信很多沒有經(jīng)驗的人對此束手無策,為此本文總結(jié)了問題出現(xiàn)的原因和解決方法,通過這篇文章希望你能解決這個問題。
你必須記住一件事, 在注冊內(nèi)核設(shè)備時, 注冊可能失敗,即便最簡單的動作常常需要內(nèi)存分配, 分配的內(nèi)存可能不可用,因此模塊代碼必須一直檢查返回值, 并且確認(rèn)要求的操作實際上已經(jīng)成功。
如果證實你的模塊在一個特別類型的失敗后完全不能加載, 你必須取消任何在失敗前注冊的動作。
錯誤恢復(fù)有時用 goto 語句處理是最好的。我們通常不愿使用 goto, 但是在我們的觀念里, 這是一個它有用的地方。在錯誤情形下小心使用 goto 可以去掉大量的復(fù)雜, 過度對齊的"結(jié)構(gòu)形" 的邏輯,因此在內(nèi)核里goto 是處理錯誤經(jīng)常用到。
模塊清理函數(shù)必須撤銷任何由初始化函數(shù)進(jìn)行的注冊, 并且慣例(但常常不是要求的)是按照注冊時相反的順序注銷設(shè)施。
使代碼重復(fù)最小和所有東西流線化, 你應(yīng)當(dāng)做的是無論何時發(fā)生錯誤都從初始化里調(diào)用清理函數(shù),清理函數(shù)接著必須在撤銷它的注冊前檢查每一項的狀態(tài)。
注意清理函數(shù)當(dāng)由非退出代碼調(diào)用時不能標(biāo)志為 __exit。
不要注冊任何設(shè)備, 直到所有的需要支持那個設(shè)備的你的內(nèi)部初始化已經(jīng)完成。cdev_add 一返回, 你的設(shè)備就是"活的"并且內(nèi)核可以調(diào)用它的操作。除非你的驅(qū)動完全準(zhǔn)備好處理設(shè)備上的操作, 你不應(yīng)當(dāng)調(diào)用 cdev_add。
字符設(shè)備的注冊,內(nèi)核在內(nèi)部使用類型 struct cdev 的結(jié)構(gòu)來代表字符設(shè)備,在內(nèi)核調(diào)用你的設(shè)備操作前, 你編寫分配并注冊一個或幾個這些結(jié)構(gòu)。
分配和初始化:cdev_init(...)
通知內(nèi)核:cdev_add(...)
去除:cdev_del(...)
任何使用它們的細(xì)節(jié)見 moduleparam.h,所有的模塊參數(shù)應(yīng)當(dāng)給定一個缺省值; insmod 只在用戶明確告知它的時候才改變這些值。模塊可檢查明顯的參數(shù), 通過對應(yīng)它們的缺省值檢查這些參數(shù)。
最后的 module_param 字段是一個權(quán)限值,你應(yīng)當(dāng)使用 <linux/stat.h> 中定義的值,這個值控制誰可以存取這些模塊參數(shù)在 sysfs 中的表示. 如果 perm 被設(shè)為 0, 就根本沒有 sysfs 項。否則它出現(xiàn)在 /sys/module下面,帶有給定的權(quán)限。使用 S_IRUGO 作為參數(shù)可以被所有人讀取, 但是不能改變; S_IRUGO|S_IWUSR 允許 root 來改變參數(shù)。注意如果一個參數(shù)被 sysfs 修改, 你的模塊看到的參數(shù)值也改變了, 但是你的模塊沒有任何其他的通知。你應(yīng)當(dāng)不要使模塊參數(shù)可寫, 除非你準(zhǔn)備好檢測這個改變并且因而作出反應(yīng)。
看完上述內(nèi)容,你們掌握怎樣進(jìn)行Linux驅(qū)動開發(fā)注冊的方法了嗎?如果還想學(xué)到更多技能或想了解更多相關(guān)內(nèi)容,歡迎關(guān)注億速云行業(yè)資訊頻道,感謝各位的閱讀!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。