Linux 设备模型之 Uevent

前言

此文始于 2019-04-02,这是在简书的第一篇文章,目的是为了练习 markdown语法。先选择一篇文章进行 copy to write,结合目前正在看的内容 android ueventd,选一篇对 uevent 的描述来进行练习。

进展

Linux 设备模型之 Uevent

1. Uevent的功能

uevent 是 Kobject 的一部分,用于在 Kobject 状态发生改变时,例如增加、移除等,通知用户空间程序,用户空间程序接收到这样的时间后,会做出相应的处理。该机制通常是用来支持热插拔设备的,例如U盘插入后,USB相关 的驱动软件会动态创建用于表示该 U盘的 device 结构(相应的也包括其中的 kobject),并告知用户空间程序,为该 U盘动态的创建/dev/目录下的设备节点,更进一步,可以通知其他应用程序,将该 U盘 mount 到系统中,从而动态的支持该设备。

2. sysfs 概述

设备节点是为设备驱动所创建的,而设备device和驱动driver都是以链表的形式连接在总线bus上的,而设备——驱动——总线的更上一层就是sysfs层。
sysfs是一个内存文件系统,它把连接在系统上的设备和总线组织成为一个分级的文件,用户空间的程序同样可以利用这些信息,以实现和内核的交互。sysfs文件系统是当前系统上实际设备树的一个直观反映,用mount命令查看可以得知其挂载在“/sys”下 sysfs on /sys type sysfs (rw,seclabel,relatime))。当一个kobject被创建的时候,对应的sys文件和目录也就被创建了;其主要文件目录如下:

  • /sys/block 存放块设备,提供以设备名(如sda)到/sys/devices的符号链接
  • /sys/bus 按总线类型分类,在某个总线目录之下可以找到连接该总线的设备的符号链接,指向/sys/devices。某个总线目录之下的 drivers 目录包含了该总线所需的所有驱动的符号链接对应kernel中的 struct bus_type
  • /sys/class 按设备功能分类,如输入设备在 /sys/class/input 之下,图形设备在 /sys/class/graphics 之下,是指向 /sys/devices 目录下对应设备的符号链接对应kernel中的 struct class
  • /sys/dev 按设备驱动程序分层(字符设备/块设备),提供以major:minor为名到 /sys/devices 的符号链接对应kernel中的 struct device_driver
  • /sys/devices 包含所有被发现的注册在各种总线上的各种物理设备。
    所有的物理设备都按其在总线上的拓扑结构来显示,除了 platform devices 和 system devices 。platform devices一般是挂在芯片内部高速或者低速总线上的各种控制器和外设,能被CPU直接寻址。system devices不是外设,他是芯片内部的核心结构,比如CPU,timer等,他们一般没有相关的driver,但是会有一些体系结构相关的代码来配置他们对应kernel中的 struct device
    上面展现了在sys目录下总线,设备,驱动和类所对应的文件,而他们的区别为:
  • device用于描述各种设备,其保存了所有的设备信息
  • driver 用于驱动 device ,其保存了所有能够被它所驱动的设备链表。
  • bus 是连接 CPU 和 device 的桥梁,其保存了所有挂载在它上面的设备链表和驱动这些设备的驱动链表。
  • class 用于描述一类 device ,其保存了所有该类 device 的设备链表。

创建设备节点文件的过程

下图描述了设备节点文件的创建过程:


创建设备节点文件的整个过程

由此可知,设备模型中任何设备有事件需要上报时,会触发 uevent提供的接口,uevent模块准备好上报事件的格式后,可以通过两个途径上报到用户空间:

  • 通过 kmod 模块,直接调动用户空间的可执行文件
  • 通过 netlink 通信机制,将事件从内核空间传递给用户空间
    PS: 目前多采用 netlink 通信机制,ueventd 也是采用 netlink机制创建 socket 与 kernel 进行通信。
    netlink基本概念
    用户空间程序接收到上报的uevent之后就可以根据其event类型进行相应操作了。

uevent的数据结构描述

kobject.h定义了uevent相关的常量和数据结构,如下:

kernel/lib/kobject_uevent.c  
/* 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", //暂未看到ueventd有具体处理  
    [KOBJ_ONLINE] =     "online",  
    [KOBJ_OFFLINE] =    "offline",//暂未看到ueventd有具体处理  
};  
/* 
 * The actions here must match the index to the string array 
 * in lib/kobject_uevent.c 
 * 
 * Do not add new actions here without checking with the driver-core 
 * maintainers. Action strings are not meant to express subsystem 
 * or device specific properties. In most cases you want to send a 
 * kobject_uevent_env(kobj, KOBJ_CHANGE, env) with additional event 
 * specific variables added to the event environment. 
 */  
kernel/include/linux/kobject.h  
 enum kobject_action {     
     KOBJ_ADD,
     KOBJ_REMOVE,      
     KOBJ_CHANGE, 
     KOBJ_MOVE,  
     KOBJ_ONLINE, 
     KOBJ_OFFLINE,  
     KOBJ_MAX   
 };  

kobject_action定义了event的类型,包括:

  • ADD/REMOVE,Kobject(或上层数据结构)的添加/移除事件。
  • ONLINE/OFFLINE,Kobject(或上层数据结构)的上线/下线事件,其实是是否使能。
  • CHANGE,Kobject(或上层数据结构)的状态或者内容发生改变。
  • MOVE,Kobject(或上层数据结构)更改名称或者更改Parent(意味着在sysfs中更改了目录结构)。
  • CHANGE,如果设备驱动需要上报的事件不再上面事件的范围内,或者是自定义的事件,可以使用该event,并携带相应的参数。

小结

以上就是 uevent 的基础知识,作为了解 ueventd 前的准备。

期望

在后续日子可以完全使用 markdown 语言誊写文档

参考的文章

Linux设备模型之 Uevent

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,911评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,014评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,129评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,283评论 1 264
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,159评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,161评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,565评论 3 382
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,251评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,531评论 1 292
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,619评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,383评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,255评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,624评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,916评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,199评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,553评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,756评论 2 335