字符設備是Linux三大設備之一(另外兩種是塊設備,網(wǎng)絡設備),字符設備就是字節(jié)流形式通訊的I/O設備,絕大部分設備都是字符設備,常見的字符設備包括鼠標、鍵盤、顯示器、串口等等,當我們執(zhí)行ls -l /dev的時候,就能看到大量的設備文件,c就是字符設備,b就是塊設備,網(wǎng)絡設備沒有對應的設備文件。編寫一個外部模塊的字符設備驅動,除了要實現(xiàn)編寫一個模塊所需要的代碼之外,還需要編寫作為一個字符設備的代碼。

驅動模型

Linux一切皆文件,那么作為一個設備文件,它的操作方法接口封裝在struct file_operations,當我們寫一個驅動的時候,一定要實現(xiàn)相應的接口,這樣才能使這個驅動可用,Linux的內核中大量使用"注冊+回調"機制進行驅動程序的編寫,所謂注冊回調,簡單的理解,就是當我們open一個設備文件的時候,其實是通過VFS找到相應的inode,并執(zhí)行此前創(chuàng)建這個設備文件時注冊在inode中的open函數(shù),其他函數(shù)也是如此,所以,為了讓我們寫的驅動能夠正常的被應用程序操作,首先要做的就是實現(xiàn)相應的方法,然后再創(chuàng)建相應的設備文件。

#include <linux/cdev.h> //for struct cdev#include <linux/fs.h>   //for struct file#include <asm-generic/uaccess.h>    //for copy_to_user#include <linux/errno.h>            //for error number/* 準備操作方法集 *//* 
struct file_operations {
    struct module *owner;   //THIS_MODULE