根据书本<Linux设备驱动开发详解>,写了自己的一个Linux驱动,一个简单的字符设备,其实也没什么实际功能,主要是能对字符设备类驱动有一个很清晰的认识,也增加了自己对驱动程序开发的信心吧
1、重要的结构体分析
1.1 cdev结构体
cdev 结构体的 dev_t 成员定义了设备号,为 32 位,其中高 12 位为主设备号,低20 位为次设备号。使用下列宏可以从dev_t中生成主次设备号
主设备号:MAJOR(dev_t dev);
次设备号:MINOR(dev_t dev);
使用下列宏则可以通过主次设备号生成dev_t
MKDEV(int major,int minor);
cdev另一个重要成员就是file_operations定义了字符设备驱动程序提供给虚拟文件系统的接口函数,也是字符设备驱动程序的主要组成部分。cdev结构体的操作函数有:
void cdev_init(struct cdev *, struct file_operations *);
int cdev_add(struct cdev *, dev_t, unsigned);
viod cdev_del(struct cdev *);
cdev_init()函数用于初始化cdev的各个成员,并建立cdev与file_operations 之间的连接,cdev_add()和cdev_del()分别是用于向系统添加和删除一个cdev,完成字符设备的注册和消除。
1.2 file_operations结构体
file_operations是实现系统调用的具体操作
1.3 注册和释放设备号
2、驱动程序结构分析
3、具体程序实现
该例程是一个简单的memory程序,就把一块内存虚拟成一个字符设备,对其进行读写操作。代码简易,对字符驱动程序有个很清楚的概括
Makefile如下
----------------------测试----------------------------
$:sudo su #:insmod globalmem.ko #:mknod /dev/globalmem c 250 0 #:echo "Hello World" >/dev/globalmem #cat /dev/globalmem 屏幕上显示Hello World 驱动测试Ok