18_热拔插驱动

18_热拔插驱动

1、介绍

热拔插即:hotplug/uevent机制。
问:在以前写的驱动程序中分配了主设备号,创建了file_operatinons结构体,为什么还要创建类?还要在类下面创建设备呢?
答:以前说为了让mdev根据这些信息来创建设备节点
在这里插入图片描述

2、分析class_device_create函数

class_device_create
	class_device_register
		class_device_add
			kobject_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目录

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

「已注销」

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值