Linux驱动程序框架

LINUX驱动程序框架

Linux应用程序是通过系统调用来产生一个swi异常来进入内核态从而调用驱动程序。框图如下:
driver

用户进程利用系统调用在对设备文件进行诸如读写操作时,系统调用通过设备文件的主设备号找到相应的设备驱动程序,然后读取这个数据结构相应的函数指针,接着将控制权交给该函数。

所以需要实现驱动程序的:open、read、write、ioctl等函数。

所以一个驱动程序的一般步骤:

  1. 定义驱动程序的入口和出口函数:module_init(My_drv_init);``module_exit(My_drv_exit);,内核通过修饰不同的入口函数让内核知道该驱动程序的入口和出口。
  2. 通过定义填充一个file_operations类型结构体,然后使用在入口函数调用major = register_chrdev(0, "MyTest_Drv", &sencod_drv_fops);函数来告诉内核该驱动程序对应的open、read、write等函数。
  3. 当卸载驱动程序时,内核会调用对应出口函数My_drv_exit

通过上面三个步骤后就可以实现最简单的驱动程序,编译后加载驱动程序则/proc/device文件就会出现该驱动模块的名字。

但是用户是通过open函数来打开字符驱动设备的,所以还需要创建对应设备号/dev/目录下的设备文件。
使用命令mknod设备文件,需要同时设置"主设备号"和"次设备号",这是手动创建设备节点的方法。

可以利用udev(mdev)机制来自动创建设备节点。

注册一个驱动程序后,会在/sys目录下生成相关设备的硬件信息。mde程序会根据这些5y5目录下提供的信息自动创建设备节点。所以要在驱动程序中提供这些sys目录下的信息。
echo /sbin/mdev > /proc/sys/kernel/hotplug mdev -s
内核中有设备加载或卸载掉时,就会通过“/proc/ sys/kernel/hotplug”所指示的应用程序(上面是/ sbin/mdev)去自动加载或卸载设备节点

驱动代码还需要先创建类,再然后在类下面创建设备。创建设备信息时,会提供主设备号和名字:
Mydrv_class = class_create(THIS_MODULE, "MyTest_Drv");
Mydrv_class_dev = class_device_create(Mydrv_class, NULL, MKDEV(major, 0), NULL, "buttons"); /* /dev/buttons */

此时用户通过open函数打开设备文件后,会得到此设备文件的属性,获得"设备类型"和"主设备号"。
然后 VFS 层通过“设备类型”(如字符设备)去找内核中对应的驱动程序入口,从而执行对应的驱动open函数。

用户成功打开设备文件后,可以根据设备描述符来进行read、write等相关操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值