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

驅(qū)動模型

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

#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/* 準(zhǔn)備操作方法集 *//* 
struct file_operations {
    struct module *owner;   //THIS_MODULE
    
  
        
		

網(wǎng)友評論