linux驅動開發的基本框架
#define led_major 200
#define led_name "led"
static int led_open(struct inode *inode, struct file *filp)
static int led_release(struct inode *inode, struct file *filp)
static ssize_t led_write(struct file *filp, const char __user *buf, size_t count, loff_t *ppos)
static const struct file_operations led_fops;
static int __init led_init(void)
}static int __exit led_exit(void)
/* 註冊驅動的載入與解除安裝 */
module_init(led_init);
module_exit(led_exit);
module_license("gpl");
module_author("zgs");
這裡涉及到了linux的三大結構體:file、inode、file_operations;
inode:
linux一切皆檔案,在linux中每建立乙個檔案就會在相應的檔案系統建立乙個inode與之對應;當第一次open時就會將inode在記憶體中產生乙個備份,同乙個檔案被多次開啟並不會產生多個inode,當所有被開啟的檔案都被close之後,inode在記憶體中的例項就會被釋放。當我們建立乙個裝置檔案時,也會在檔案系統中建立乙個inode,這個inode用來儲存關於這個檔案的靜態資訊,包括這個裝置檔案對應的裝置號,檔案的路徑以及對應的驅動物件etc。驅動開發中一般不需要自己填。對於不同的檔案型別,inode被填充的成員內容也會有所不同,以建立字元裝置為例,我們知道,add_chrdev_region其實是把乙個驅動物件和乙個(一組)裝置號聯絡到一起。而建立裝置檔案,其實是把裝置檔案和裝置號聯絡到一起。至此,這三者就被繫結在一起了。這樣,核心就有能力建立乙個struct inode例項了。
file:
linux核心會為每乙個程序維護乙個檔案描述符表,這個表其實就是struct file的索引。open()的過程其實就是根據傳入的路徑填充好乙個file結構並將其賦值到陣列中並返回其索引。
file_operations:
linux使用file_operations結構訪問驅動程式的函式,這個結構的每乙個成員的名字都對應著乙個呼叫。第乙個 file_operations 成員根本不是乙個操作; 它是乙個指向擁有這個結構的模組的指標.、 這個成員用來在它的操作還在被使用時阻止模組被解除安裝. 幾乎所有時間中, 它被簡單初始化為 this_module, 乙個在 中定義的巨集.這個巨集比較複雜,在進行簡單學習操作的時候,一般初始化為this_module。
(參考於
linux 驅動學習筆記 - file_operations結構體詳細分析_linux程式設計_linux公社-linux系統門戶**
測試驅動開發筆記(二) xUnit
1.防止改完後引起新錯誤 再次執行單元測試。2.如果單元測試涉及到可變資訊 如當前時間 需要將待測試資料也變為可變,否則無法回歸測試 3.使用測試驅動開發必須從頭開始,嚴格進行,否則到半中間會很費事的。4.測試驅動開發中,私有方法也要測試,可通過反射實現,如 summer example new s...
驅動開發筆記 開篇
身為資訊保安專業的學生,接觸計算機也有十來的年頭了,到現在還沒有深入過windows核心的世界,不禁有些慚愧。所以現在開始認認真真沉下心來研究這個全新的世界,記些筆記,不但方便自己回頭翻閱,也希望可以和同樣研究驅動 核心的朋友們一起研究 首先向大家推薦一本好書 rootkits windows核心的...
嵌入式Linux裝置驅動開發筆記(二)
一 核心的時間 1 tick 滴答 核心採用了乙個新的時間單位來進行計時。該時間單位稱為tick 滴答 乙個tick對應硬體定時器兩次中斷之間的時間間隔。當前核心每秒鐘硬體定時器會發生hz次中斷。tick和秒的換算關係為 1 tick 1 hz秒。hz是在核心make menuconfig 核心的....