1.主設備號和次設備號node
下圖中,「」5月」的前兩列分別是主設備號和次設備號,主設備號用來標識設備對應的驅動程序,次設備號用來肯定設備文件所指的設備。linux
在內核,dev_t類型用來保存設備編號,位於文件<linux/types.h>。目前版本(3.1),dev_t 是一個unsigned int 類型,12位用來標識主版本號,20位用來標識次版本號,使用 MAJOR(dev_t dev) 和 MINOR (dev_t dev)兩個宏來獲取主版本號和次版本號. 使用MKDEV(int major,int minor) 獲取dev_t類型的版本號。函數
主版本號的靜態分配和動態分配:指針
在2.4版本以前,使用register_chrdev(unsigned int major, const char *name,const struct file_operations *fops); 進行註冊,若是major 爲0則自動分配 主版本號。blog
靜態分配 , 使用 register_chrdev_region(dev_t first,unsigned int count, char * name) ;字符串
動態分配,使用 alloc_chrdev_region(dev_t *dev, unsigned int firstminor,unsigned int count, char * name);it
2.文件操做io
struct file_operations class
經過上面的操做獲取了設備號,可是尚未將任何驅動程序連接到 你獲取的設備號,linux內核採用 struct file_operations <linux/fs.h>來創建鏈接,這個結構定義了一些列的文件操做的函數指針,例如open read write,ioctl 等,是否是很熟悉? 用戶程序調用了 open read 等系統調用,而後通過 VFS層,在vfs層拿到 struct file 指針,經過調用f_op(struct file_operations )的函數指針實現驅動程序的調用,詳情請參見read_write.c。兼容性
struct file
file結構表明一個打開的文件,它有內核在調用open 時建立,直到最後的close函數,在文件的全部實例都被關閉以後內核纔會釋放、
struct inode
內核用inode表示文件,與file 不一樣的是,file 隨着open 系統調用的屢次調用打開同一個文件,內核中會有多個struct file的實例,可是inode實例只有一個。
dev_t i_rdev 設備號,這個字段的類型在2.5中發生了變化,爲了兼容性,內核中增長了兩個新的宏,用來獲取主、次設備號
unsigned int iminor(struct inode * inode);
unsigned int imajor(struct inode * inode);
3.註冊驅動
初始化
使用struct cdev <linux/cdev.h>結構來標示字符串設備, struct cdev 結構有兩種初始化方式, struct cdev * cdev_alloc()和 void cdev_init(struct cdev * cdev, struct file_operations * fops)。
添加
使用 int cdev_add(struct cdev * cdev, dev_t num, unsigned int count);
刪除
使用 void cdev_del(struct cdev * cdev);
4.用戶態與內核態的數據交互。
unsigned long copy_from_user(void *to, const void __user *from, unsigned long n) ;
unsigned long copy_to_user(void __user *to, const void *from, unsigned long n);