一、图解字符驱动模块设计思路
-
用户空间调用
-
VFS 层 (虚拟文件系统)
-
字符设备层
-
驱动程序实现
二、应用代码
用户程序通过标准的系统调用(如 open、read、write 等)与字符设备交互。例如:
int fd = open("/dev/mydevice", O_RDWR); write(fd, buffer, size); read(fd, buffer, size); close(fd);
目标:将用户的请求从用户空间传递到内核空间的字符驱动。
三、VFS 层 (虚拟文件系统)
系统调用会通过 VFS (Virtual File System ) 进入内核。这一层的主要任务是将与文件系统相关的操作抽象化:
-
VFS 通过
file_operations结构体找到设备驱动程序提供的对应实现。 -
file_operations是字符设备的核心结构体,它定义了驱动程序如何处理系统调用:
struct file_operations { .open = my_open, .read = my_read, .write = my_write, .release = my_close, // 其他操作 };

四、驱动程序实现
应用程序利用 open 函数打开设备文件后获取类型信息和主设备号,再利用该信息得到注册在 chrdevs 的设备驱动程序 index,接着利用获取到的 index 值,获得注册在 chrdevs 变量上的 file_operations 结构体地址,该结构体记录了字符设备驱动程序使用其注册函数设定相应低级文件输入输出函数的内容。
如下图所示,表示了设备驱动程序的运作方式。
