您的位置:首页 > 运维架构 > Linux

(一)linux 字符设备驱动的编写

2014-09-22 21:51 176 查看
在编写驱动的过程中主要参考《老罗android之旅博客》 以及《深入linux设备驱动内核机制》,编写一个字符设备驱动,主要编写3个文件:

1)Makefile 主要用于编译驱动模块的

2)Kconfig Kconfig 主要是加入linux kernel 的图形编译系统,可以将驱动模块独立编译,或者是编进内核中。

3)驱动程序(chr_dev.c)

chr_dev 字符设备的主要目的是:能够实现数组中的前面个数之间的加减乘运算,并将结果保存在数组的最后一个元素中。

文件结构如下:


'

Makefile:



Kconfig:



makefile 中的CONFIG_CHR_DEV 是根据CHR_DEV 的值来确定的,系统会自动在CHR_DEV前面添加CONFIG_ 前缀,以便makefile使用。

具体源代码:



chr_open 主要作用是,将自定义设备结构提的数据挂到文件指针去,以便其他操作能够访问设备中的数据,其中的container_of 函数主要通过nd->i_cdev 获取demo_cdev 结构的地址。



chr_read 函数中的 char __user*u, 是用户空间的数据,__user 表示 char* u 所指向的数据是用户空间的数据,内核中如果需要访问用户层的数据必须通过copy_to_user,将用户空间的数据拷贝到内核空间,因为驱动其实是工作在内核空间的,用户空间需要访问内核空间的数据,也是需要将内核空间的数据拷贝到用户空间的。



chr_write 与 chr_read 类似,仅仅是方向不一致而已,这里的down_interruptible() 主要是为了防止多个进程,同时访问数组数据。使用信号量的方法来控制数据的原子访问,并且进程无法获取到操作权限的时候,进入睡眠状态,是可以被像信号之类的东西唤醒的。



ioctl 函数主要是可以接受不同的command, 来实现不同的功能,这样我们就可以完成类似加、减、乘的需求,这里的cmd,命令其实是有一定的规则的,这里仅仅是直接定义为0,、1、2,规范的使用方法,不是这样做的,后期需要注意。

file_operations 是字符设备中一个非常重要的结构体,这里我们仅仅实现了open,read,write, unlocked_ioctl 接口,不同的内核版本,可能接口名称又不一样,只要养成查看源代码的习惯,那种版本都是一样的。







demo_init 是chr_dev 字符设备驱动的初始化函数,主要作用是分配驱动需要的数据结构空间,分配设备号,创建设备,以及类,这里需要明白设备驱动模型的知识,创建设备device_create,会在/dev/目录下创建chr_dev 字符设备,这样,我们就可以通过open函数找到字符设备文件了,最后就能够通过fd来操控我们编写的驱动。

后面的module_init, 以及module_exit 是标准的模块初始化,退出操作,主要的作用是将对应的驱动程序加载到对应的数据段,以便内核能够独立加载,卸载。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: