【linux kernel】一文总结linux的uevent机制

在Linux系统中,用户空间可以通过uevent机制与内核交互。这种机制允许内核向用户空间发送事件,比如设备添加、移除或者状态变化等。

uevent机制主要包括以下几个组件:

  1. Netlink套接字:内核通过Netlink套接字向用户空间发送uevent。
  2. udev:用户空间的守护进程,用于处理来自内核的事件。
  3. uevent helper程序:当udev监控到设备事件时,可以通过调用uevent helper程序来处理特定设备的事件。

要在内核中实现uevent机制,可以使用以下步骤:

  1. 使用class\_device\_create或device\_create创建设备。
  2. 设置dev->kset->hotplug\_ops指向自定义的hotplug操作。
  3. 实现自定义的hotplug操作,通常是hotplug和show\_device方法。

以下是一个简单的示例,展示如何在内核模块中实现发送uevent:




#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/kobject.h>
#include <linux/device.h>
 
static struct kobject *example_kobj;
 
static struct attribute example_attr = {
    .name = "test",
    .mode = S_IWUSR | S_IRUGO,
};
 
static int example_hotplug(struct kset *kset, struct kobject *kobj)
{
    kobject_uevent(kobj, KOBJ_ADD);
    return 0;
}
 
static const struct kset_hotplug_ops hotplug_ops = {
    .hotplug = example_hotplug,
};
 
static int __init example_init(void)
{
    int ret;
 
    example_kobj = kobject_create_and_add("example", NULL);
    if (!example_kobj)
        return -ENOMEM;
 
    ret = sysfs_create_file(example_kobj, &example_attr);
    if (ret)
        goto err_create_file;
 
    kobject_set_kset_hotplug_ops(example_kobj, &hotplug_ops);
 
    return 0;
 
err_create_file:
    kobject_put(example_kobj);
    return ret;
}
 
static void __exit example_exit(void)
{
    sysfs_remove_file(example_kobj, &example_attr);
    kobject_put(example_kobj);
}
 
module_init(example_init);
module_exit(example_exit);
 
MODULE_LICENSE("GPL");

在这个示例中,我们创建了一个名为"example"的kobject,并添加了一个名为"test"的attribute。在example\_init中,我们调用kobject\_set\_kset\_hotplug\_ops注册了自定义的hotplug操作。在example\_hotplug函数中,我们调用kobject\_uevent发送了一个uevent。

这个示例仅用于说明如何在内核模块中发送uevent。在实际设备驱动中,通常是在设备添加、移除或状态改变时自动发送uevent,如在调用device\_add函数时。

最后修改于:2024年08月08日 09:11

评论已关闭

推荐阅读

Vue中使用mind-map实现在线思维导图
2024年08月04日
VUE
Web前端最全Vue实现免密登录跳转的方式_vue怎么样不登录返回首页,最强技术实现
2024年08月04日
VUE
vue3 项目搭建教程(基于create-vue,vite,Vite + Vue)
2024年08月04日
VUE
Vue-颜色选择器实现方案——>Vue-Color( 实战*1+ Demo*7)
2024年08月04日
VUE
Vue项目卡顿慢加载?这些优化技巧告诉你!_vue数据多渲染卡顿
2024年08月04日
VUE
vue中的keep-alive详解与应用场景
2024年08月04日
VUE
Vue、React实现excel导出功能(三种实现方式保姆级讲解)
2024年08月04日
vue-office/docx插件实现docx文件预览
2024年08月04日
VUE
java调用js文件的两种方法(支持V8引擎)
2024年08月04日
JavaScript:解决计算精度问题/mathjs/bignumber.js/big.js/decimal.js
2024年08月04日
两周从爬虫小白变大神 _yjs_js_security_passport
2024年08月04日
JS笔记(对象、函数、数组)
2024年08月04日
Markdown.js:强大的纯JavaScript Markdown解析器
2024年08月04日
Vue项目:js模拟点击a标签下载文件并重命名,URL文件地址下载方法、请求接口下载文件方法总结。
2024年08月04日
vue 父组件怎么获取子组件里面的data数据
2024年08月04日
VUE
个人开发实现AI套壳网站快速搭建(Vue+elementUI+SpringBoot)
2024年08月04日
el-table 表格封装并改造实现单元格可编辑
2024年08月04日
none
nodejs环境下创建vue项目、SSH密钥登陆!!!
2024年08月04日
vue+quill+element-ui实现视频、图片上传及缩放保姆级教程,轻松使用富文本
2024年08月04日
【three.js】22. Imported Models导入模型
2024年08月04日