Linux驱动程序-----字符设备

时间:2023-01-24 16:35:09

根据书本<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 Linux驱动程序-----字符设备