字符設(shè)備是Linux三大設(shè)備之一(另外兩種是塊設(shè)備,網(wǎng)絡(luò)設(shè)備),字符設(shè)備就是字節(jié)流形式通訊的I/O設(shè)備,絕大部分設(shè)備都是字符設(shè)備,常見(jiàn)的字符設(shè)備包括鼠標(biāo)、鍵盤(pán)、顯示器、串口等等,當(dāng)我們執(zhí)行ls -l /dev的時(shí)候,就能看到大量的設(shè)備文件,c就是字符設(shè)備,b就是塊設(shè)備,網(wǎng)絡(luò)設(shè)備沒(méi)有對(duì)應(yīng)的設(shè)備文件。編寫(xiě)一個(gè)外部模塊的字符設(shè)備驅(qū)動(dòng),除了要實(shí)現(xiàn)編寫(xiě)一個(gè)模塊所需要的代碼之外,還需要編寫(xiě)作為一個(gè)字符設(shè)備的代碼。
驅(qū)動(dòng)模型
Linux一切皆文件,那么作為一個(gè)設(shè)備文件,它的操作方法接口封裝在struct file_operations
,當(dāng)我們寫(xiě)一個(gè)驅(qū)動(dòng)的時(shí)候,一定要實(shí)現(xiàn)相應(yīng)的接口,這樣才能使這個(gè)驅(qū)動(dòng)可用,Linux的內(nèi)核中大量使用"注冊(cè)+回調(diào)"機(jī)制進(jìn)行驅(qū)動(dòng)程序的編寫(xiě),所謂注冊(cè)回調(diào),簡(jiǎn)單的理解,就是當(dāng)我們open一個(gè)設(shè)備文件的時(shí)候,其實(shí)是通過(guò)VFS找到相應(yīng)的inode,并執(zhí)行此前創(chuàng)建這個(gè)設(shè)備文件時(shí)注冊(cè)在inode中的open函數(shù),其他函數(shù)也是如此,所以,為了讓我們寫(xiě)的驅(qū)動(dòng)能夠正常的被應(yīng)用程序操作,首先要做的就是實(shí)現(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