linux 字符設備注冊


如我們提過的, 內核在內部使用類型 struct cdev 的結構來代表字符設備. 在內核調用你 的設備操作前, 你編寫分配並注冊一個或幾個這些結構. [11] 11為此, 你的代碼應當包含

<linux/cdev.h>, 這個結構和它的關聯幫助函數定義在這里.

 

有 2 種方法來分配和初始化一個這些結構. 如果你想在運行時獲得一個獨立的 cdev 結構, 你可以為此使用這樣的代碼:

 

struct cdev *my_cdev = cdev_alloc(); my_cdev->ops = &my_fops;

 

但是, 偶爾你會想將 cdev 結構嵌入一個你自己的設備特定的結構; scull 這樣做了. 在 這種情況下, 你應當初始化你已經分配的結構,

 

 

有一個早些的機制以避免使用 cdev 結構(我們在"老方法"一節中討論).但是, 新代碼應當使用新技術.

 

 

void cdev_init(struct cdev *cdev, struct file_operations *fops);

 

任一方法, 有一個其他的 struct cdev 成員你需要初始化. 象 file_operations 結構, struct cdev 有一個擁有者成員, 應當設置為 THIS_MODULE. 一旦 cdev 結構建立, 最后 的步驟是把它告訴內核, 調用:

 

int cdev_add(struct cdev *dev, dev_t num, unsigned int count);

 

這里, dev 是 cdev 結構, num 是這個設備響應的第一個設備號, count 是應當關聯到設 備的設備號的數目. 常常 count 是 1, 但是有多個設備號對應於一個特定的設備的情形. 例如, 設想 SCSI 磁帶驅動, 它允許用戶空間來選擇操作模式(例如密度), 通過安排多個 次編號給每一個物理設備.

 

在使用 cdev_add 是有幾個重要事情要記住. 第一個是這個調用可能失敗. 如果它返回一 個負的錯誤碼, 你的設備沒有增加到系統中. 它幾乎會一直成功, 但是, 並且帶起了其他 的點: cdev_add 一返回, 你的設備就是"活的"並且內核可以調用它的操作. 除非你的驅動 完全准備好處理設備上的操作, 你不應當調用 cdev_add.

 

為從系統去除一個字符設備, 調用: void cdev_del(struct cdev *dev);

顯然, 你不應當在傳遞給 cdev_del 后存取 cdev 結構.


注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: