背景:怎么构建一个最简单的字符设备驱动并且可以使用app进行操作
名称 | 大致意思 |
---|---|
设备 | proc/devices/设备名称 简单来说 insmode出来的 |
设备节点 | /dev/xxx 对这个设备进行操作的文件 mknode使用主次设备号对设备关联 |
大致方法
1.写驱动文件(file_operation),构造对应的read write 函数
2.分配设备名称(/proc/devices/设备名称)
3.注册进内核 使用主次设备号,设备名称 ,insmode 注册后 在/proc/devices/设备名称 就能找到对应设备
4.对这个设备进行设备文件注册,mknode 命令,生成 /dev/设备文件名称
5.应用程序打开 设备文件 获得设备的 file_operation 结构体 对设备进行操作
1实现底层驱动程序
linux中万物皆为文件
图中的一个设备会有各种调用参数 open read write 来组成这个设备的 file_operation结构体
内核层中 在驱动程序里面 各种调用参数来对底层的硬件进行操作 作为驱动程序注册进内核变成一个设备 也会有 open read write等操作接口
2 注册这个驱动程序到内核变成一个设备
开始有了驱动程序的 file_operation结构体
把 主次设备号 和 file_operation 结构体进行内核中的注册
注册到内核中 变成一个设备驱动程序
major = register_chrdev(DEV_MAJOR, DEV_NAME, &led_fops); //注册到内核
注册到内核后 有了 proc/devices/DEV_NAME
mknod [选项]… 名称 类型 [主设备号 次设备号]
2.1 驱动层注册详细描述
其实在驱动层中是构造了一个char_device_struct 结构体,char_device_struct 结构体继承了驱动结构体
char_device_struct 是驱动的基本对象, 把这个对象保存在内核中
static struct char_device_struct {//指向下一个链表节点struct char_device_struct *next;//主设备号unsigned int major;//次设备号unsigned int baseminor;//次设备号的数量int minorct;//设备的名称char name[64];//内核字符对象(已废弃)struct cdev *cdev; /* will die */} *chrdevs[CHRDEV_MAJOR_HASH_SIZE];
3 对设备构建设备文件
上一步已经有proc/devices/DEV_NAME
对这个DEV_NAME设备构建出对应的设备文件进行操作
使用mkmod /dev/test c 2 0 命令 构建对应设备的设备文件,通过查找内核设备所有的主次设备号挑选出对应的 设备
/dev/test 设备文件的文件名
c 文件为字符设备文件
2 主设备号
0 次设备号
4 应用程序使用设备文件进行操作
应用程序是一个进程
进程有自己的结构体 task_srtuct
task_srtuct->files_struct->fd_array[]->file_operations
//里面保存了打开的文件 inode 节点 对这个节点 进行 write read 操作
使用 open(/dev/xxx) 打开这个文件 把这个文件的file_operation 保存在 inode 数组里面
后续使用 read write 调用 inode节点的各种操作函数 对文件 /dev/xxx 这个设备文件进行操作