内核热插拔管理

原创 2012年03月24日 17:42:52

在可插拔的总线如USB(和CardbusPCI)中,终端用户在主机运行时将设备插入到总线上。在大部分情况下,用户期望设备立即可用。这意味着系统必须作许多事情,包括:

  • 找到一个可以处理设备的驱动。它可能包括装载一个内核模块,较新的驱动可以用模块初始化工具将设备的支持发布到用户应用工具集中。

  • 将一个驱动绑定到该设备中。总线框架使用设备驱动的probe()函数来为该设备绑定一个驱动。

  • 告诉其他的子系统配置新的设备。打印队列可能被使能,网络被开启,磁盘分区被挂载等等。在一些情况下,还会有一些驱动相关的动作。

PolicyAgent:是指当发生热插拔事件时,被内核触发的用户空间程序(如/sbin/hotplug)。通常这些程序是一些shell脚本,通过该脚本去调用更多的管理工具。


这种机制主要是通过kobject对象模型来实现的。

热插拔相关接口函数:

/**
 * kobject_uevent - notify userspace by ending an uevent
 *
 * @action: action that is happening
 * @kobj: struct kobject that the action is happening to
 *
 * Returns 0 if kobject_uevent() is completed with success or the
 * corresponding error when it fails.
 */
int kobject_uevent(struct kobject *kobj, enum kobject_action action);
相当于kobject_uevent_env(kobj, action, NULL);
/**
 * kobject_uevent_env - send an uevent with environmental data
 *
 * @action: action that is happening
 * @kobj: struct kobject that the action is happening to
 * @envp_ext: pointer to environmental data
 *
 * Returns 0 if kobject_uevent() is completed with success or the
 * corresponding error when it fails.
 */
int kobject_uevent_env(struct kobject *kobj, enum kobject_action action,
			char *envp[]);
/**
 * add_uevent_var - add key value string to the environment buffer
 * @env: environment buffer structure
 * @format: printf format for the key=value pair
 *
 * Returns 0 if environment variable was added successfully or -ENOMEM
 * if no space was available.
 */
int add_uevent_var(struct kobj_uevent_env *env, const char *format, ...)
	__attribute__((format (printf, 2, 3)));

/**
 * kobject_action_type - translate action string to numeric type
 *
 * @buf: buffer containing the action string, newline is ignored
 * @len: length of buffer
 * @type: pointer to the location to store the action type
 *
 * Returns 0 if the action string was recognized.
 */
int kobject_action_type(const char *buf, size_t count,
			enum kobject_action *type);

相关数据结构:

enum kobject_action {
	KOBJ_ADD,
	KOBJ_REMOVE,
	KOBJ_CHANGE,
	KOBJ_MOVE,
	KOBJ_ONLINE,
	KOBJ_OFFLINE,
	KOBJ_MAX
};
/* the strings here must match the enum in include/linux/kobject.h */
static const char *kobject_actions[] = {
	[KOBJ_ADD] =		"add",
	[KOBJ_REMOVE] =		"remove",
	[KOBJ_CHANGE] =		"change",
	[KOBJ_MOVE] =		"move",
	[KOBJ_ONLINE] =		"online",
	[KOBJ_OFFLINE] =	"offline",
};
struct kobj_uevent_env {
	char *envp[UEVENT_NUM_ENVP];
	int envp_idx;
	char buf[UEVENT_BUFFER_SIZE];
	int buflen;
};
//热插拔事件相关操作
struct kset_uevent_ops {
	int (*filter)(struct kset *kset, struct kobject *kobj);//事件过滤函数
	const char *(*name)(struct kset *kset, struct kobject *kobj);//获取总线名称,如USB
	int (*uevent)(struct kset *kset, struct kobject *kobj,
		      struct kobj_uevent_env *env);//提交热插拔事件
};

相关函数:

struct kset *kset_create_and_add(const char *name,
				 struct kset_uevent_ops *uevent_ops,
				 struct kobject *parent_kobj);

其中structkset_uevent_ops中指定具体的uevent函数。


Linux芯片级移植与底层驱动(基于3.7.4内核) --SMP多核启动以及CPU热插拔驱动

在Linux系统中,对于多核的ARM芯片而言,Bootrom代码中,CPU0会率先起来,引导Bootloader和Linux内核执行,而其他的核则在上电时Bootrom一般将自身置于WFI或者WFE状...

热插拔时间从内核空间到用户空间的传递过程

将可移动设备连入系统时,系统的后台中会依次发生如下事件: l         内核检测到新硬件插入,然后分别通知hotplug和udev。前者用来装入相应的内核模块(如usb-stora...

Linux2.6.10内核下PCIExpressNative热插拔框架的实现机制

PCI热插拔技术,可以有效避免由更换外设引起的服务器系统停机,对于提高服务器系统可用性和可扩展性意义重大。本文讨论了PCI Express热插拔所涉及的软件因素,并基于此,剖析了Linux 2.6.1...

内核hotplug事件---利用Netlink处理hotplug实现热插拔监控

先上monitor的demo: sd_monitor.c #include #include #include #include #include #include #include...

Linux 2.6.10内核下PCI Express Native热插拔框架的实现机制

Linux 2.6.10内核下PCI Express Native热插拔框架的实现机制 [日期:2008-7-22] 来源:IBM  作者:王兵 国防科学技术大学计算机学院软件所 ...

1 - 热插拔时间从内核空间到用户空间的传递过程

1 - 热插拔时间从内核空间到用户空间的传递过程
  • ztguang
  • ztguang
  • 2016年12月18日 09:19
  • 125

Linux内核对CPU热插拔的支持

CPU hotplug Supportin Linux(tm) Kernel                      Maintainers:                    CPUHo...
  • yarsen
  • yarsen
  • 2011年10月03日 14:35
  • 2668

Linux设备管理文件系统,mdev,热插拔

努力成为linux kernel hacker的人李万鹏原创作品,为梦而战。转载请标明出处 http://blog.csdn.net/woshixingaaa/archive/2011/05/1...

使用Quartz.net、Topshelf、wcf命名管道制作的一个c#定时任务管理程序(热插拔)

管理端界面: 编辑任务: 配置说明: 1.双击Manager.exe进入管理界面 2.第一次使用点击左侧按钮安装服务 3.服务安装好后点击开启服务 4.服务开启后点击刷新,即可看到当前配置的...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:内核热插拔管理
举报原因:
原因补充:

(最多只允许输入30个字)