2017-02-18 14 views

回答

1

首先,您需要頭文件linux/fs.h,其中聲明瞭文件系統的函數。這是必需的,因爲字符驅動程序管理對字符設備的訪問,該字符設備通常在/dev中表示爲文件。

如果您在/devls -l你看到這樣的句子:

crw-rw----. 1 root lp   6, 0 14. Feb 18:23 lp0 
crw-rw----. 1 root lp   6, 1 14. Feb 18:23 lp1 
crw-rw----. 1 root lp   6, 2 14. Feb 18:23 lp2 
crw-rw----. 1 root lp   6, 3 14. Feb 18:23 lp3 
crw-rw-rw-. 1 root tty   5, 0 15. Feb 10:57 tty 
crw--w----. 1 root tty   4, 0 14. Feb 18:23 tty0 

c在一行的開頭表示字符設備文件。這些是您可以通過驅動程序與設備進行通信的文件系統中的節點。日期之前的兩個數字表示哪個驅動程序用於該設備。例如,lp0具有數字60。第一個數字被稱爲major和第二個未成年人。主內核使用主編號爲該設備選擇正確的驅動程序。在/proc/devices中可以找到這個數字的內核模塊名稱,實際的驅動程序。第二個號碼僅供驅動程序使用,以便可以使用一個驅動程序管理多個設備。例如,上面的lp0-3使用主要編號爲6的所有驅動程序。

註冊您的驅動程序並在/dev/devices中生成條目的舊且簡單的方法是調用以下函數。

int register_chrdev(unsigned int major, const char *name, 
         const struct file_operations *fops) 

major是你的驅動程序的主設備號,name是將出現在/dev/devicesfops是一個指向跳轉表與驅動程序的所有功能的名稱。這是通過struct file_operations來實現的。您必須在內核的fe.h中查找此結構以瞭解支持的功能。比你在驅動程序中定義這個結構並且放入驅動程序的函數名稱並且爲你的驅動程序不支持的函數使用NULL。對於NULL條目,則使用一些默認值。使用C tagged structure initialization syntax更舒服。最重要的功能是lseek,readwrite。該設備由linux/fs.h中定義的file結構表示。

在較新的代碼中,使用linux/cdev.h中的cdev結構代替上述函數。 對於這種方式和驅動程序編程的更多細節,我推薦這個:http://www.oreilly.com/openbook/linuxdrive3/book/ch03.pdf

如果你有你編譯好的驅動程序,你可以把它加載到內核中加入insmod。如果您想使用modprobe,請查看它在系統上的配置方式,因爲它有所不同。要獲得/dev中的節點,請使用mknod。對於主號碼爲10和次號碼0的字符設備,看起來像這樣:

mknod /dev/my_device c 10 0