18_热拔插驱动
文章目录
- 18_热拔插驱动
- 1、介绍
- 2、分析class_device_create函数
- 3、示例
- 3.1、装载buttons驱动
- 3.2、卸载buttons驱动
- 4、自动挂载U盘
- 4.1、U盘介绍
- 4.2、分析mdev
- 4.3、写mdev.conf进行U盘测试
- 4.3.1、文件装载
- 4.3.2、U盘自动挂载到mnt目录
1、介绍
热拔插即:hotplug/uevent机制。
问:在以前写的驱动程序中分配了主设备号,创建了file_operatinons结构体,为什么还要创建类?还要在类下面创建设备呢?
答:以前说为了让mdev根据这些信息来创建设备节点
2、分析class_device_create函数
class_device_createclass_device_registerclass_device_addkobject_uevent(&class_dev->kobj, KOBJ_ADD);kobject_uevent_env(kobj, action, NULL);// action_string = "add";action_string = action_to_string(action);/* 分配保存环境变量的内存 *//* environment values */buffer = kmalloc(BUFFER_SIZE, GFP_KERNEL);/* 设置环境变量 */envp [i++] = scratch;scratch += sprintf(scratch, "ACTION=%s", action_string) + 1;envp [i++] = scratch;scratch += sprintf (scratch, "DEVPATH=%s", devpath) + 1;envp [i++] = scratch;scratch += sprintf(scratch, "SUBSYSTEM=%s", subsystem) + 1;/ * 调用应用程序: 比如mdev* 启动脚本 echo /sbin/mdev > /proc/sys/kernel/hotplug * 设置了uevent_helper为“/sbin/mdev“* /argv [0] = uevent_helper; // = "/sbin/mdev"argv [1] = (char *)subsystem;argv [2] = NULL;call_usermodehelper (argv[0], argv, envp, 0);
其中环境变量可通过env命令来查看:
这些环境变量就是sh程序的环境变量:
为什么确定调用的应用程序为mdev呢:?如下:
cat /etc/init.d/rcS
在类下面创建一个设备时,最终会导致mdev程序的运行,调用用户模式下的辅助程序call_usermodehelper 。在设置环境变量之后,运行mdev,mdev根据设备好的环境变量来创建设备节点。
3、示例
操作vi lib/kobject_uevent.c +208,在里面加上:printk("100ask: uevent_helper = %s\n", uevent_helper);for(i = 0; i < envp[i]; i++){/* 应用程序的环境变量 */printk("envp[%d] = %s\n", i, envp[i]);}
3.1、装载buttons驱动
可以看出buttons中创建类和设备最终就会调用一个应用程序uevent_helper,这个应用程序一般就设备为 /sbin/mdev。之后mdev这个应用程序就会根据这些环境变量创建设备节点。
来分析: busybox mdev.c
100ask: uevent_helper = /sbin/mdev
envp[0] = HOME=/
envp[1] = PATH=/sbin:/bin:/usr/sbin:/usr/bin
envp[2] = ACTION=add
envp[3] = DEVPATH=/class/sixth_drv/buttons
envp[4] = SUBSYSTEM=sixth_drv
envp[5] = SEQNUM=720
envp[6] = MAJOR=252
envp[7] = MINOR=0
mdev_main
//temp = /sys/class/sixth_drv/buttons
make_device(temp, 0);
/* 确定设备文件名,类型,主次设备号 */
device_name = bb_basename(path); //= “buttons”
//‘c’ == > 字符设备节点
//根据"/sys/class/sixth_drv/buttons/dev"的内容确定主次设备号
mknod(device_name, mode | type, makedev(major, minor)
3.2、卸载buttons驱动
也会调用到应用程序call_usermodehelper,还是会根据环境变量:envp[2] = ACTION=remove来删除设备节点
4、自动挂载U盘
4.1、U盘介绍
4.2、分析mdev
在busybos工程下,文件mdev.c里的make_device函数中:
如果没有配置文件的话,只创建设备节点:
如果有配置文件的话,根据配置文件操作:
问:是否可以通过配置文件来执行我的挂载命令呢?
答:可以,在mdev.txt中有配置文件的介绍
mdev.conf的格式:
<device regex> <uid>:<gid> <octal permissions> [<@|$|*> <command>]
device regex:正则表达式,表示哪一个设备
uid: owner
gid: 组ID
octal permissions:以8进制表示的属性
@:创建设备节点之后执行命令
$:删除设备节点之前执行命令
*: 创建设备节点之后 和 删除设备节点之前都可以来执行命令
command:要执行的命令
其中8进制属性默认为660,即rw-:可读、可写、不可执行
例如:(c表示字符设备、b表示块设备)
从左到右:
c(字符设备)rw-(用户对这个文件的权限)rw-(用户同一个组的成员权限) —(其他用户的权限)
正则表达式介绍:
4.3、写mdev.conf进行U盘测试
装载leds.ko查看权限:
vi /etc/mdev.conf修改为:
4.3.1、文件装载
4.3.2、U盘自动挂载到mnt目录