device_add源码研究
前面光学习了bus和class的基本结构和注册方法其如何和device产生互动的,什么时候会创建到/sys/devices/下目录的链接等这些问题还需要再探究一下最好的开始就是device_add从device_register开始其负责调用device_initialize()里面设置其暂时属于devices_kset,以及内核管理用的ktype初始化一些必须要用的数据,链表等device_add源码研究第一段1594行内部给device的私有数据申请了空间给device维护了一个klist链表其p指针的私有数据结构体如下通过上面这个结构体,能将device安全的插入到不同的层级结构中,同时还能保留父子设备的拓扑信息1604行-1616行是确定device的名称,也就是确认其内嵌Kobj的名称逻辑是先用指定的名称,没有再通过bus来确定名称第二段1620行,获取当前设备的父设备1621行,里面有点复杂,整体功能是确定当前device的kobj在sysfs层级结构中的位置,需要展开讲讲也就是确定当前device的目录,应该在/sys/devices/下的哪个子目录里面get_device_parent1320行,首先判断该设备是不是一个类设备如果不是类设备,直接看1369行,一般情况下,对于设备注册都会指定父设备,如果没有指定,就看当前bus有没有提供默认父设备,提供了则返回这个默认的/sys/devices/下的父设备作为挂载点1372行,则排除上面这些特殊情况后,如果当前设备有父设备,则正常返回其父设备的kobj,作为sysfs层级结构中当前设备kobj的父亲接下来再看比较复杂的对于类设备找sysfs层级结构中父节点的处理同时我提到的/sys/的目录结构,也就代表了sysfs中kobj的层级结构1339行,首先判断当前类设备有没有父亲,没有的话则调用virtual_device_parent为其创建一个虚拟的父亲,该虚拟父亲直接就在/sys/devices/下存在1341行,如果当前类设备有父亲,并且其父亲也是一个类设备,而且父亲还没有指定命名空间那么就很简单,直接返回当前类设备的父亲的kobj,即他俩是在一个类目录下的父子关系1344行,就是这样一种条件:当前设备既有父设备,而且还归属于某个类此时就暂时先将parent_kobj指针指向父设备的kobj,1349行开始处理这个设备1350行,则开始遍历当前class提供的胶水目录的kobj如果能找到一个胶水目录的parent,就是当前设备的父设备的kobj则直接返回该胶水目录的Kobj所谓胶水目录,就是内核为了让一个既有父设备,又是类设备的设备在/sys/devices层级结构中保持结构清晰,在其父设备的目录下,又加了一个以其所属类命名的目录1362行,这里就是创建胶水目录的地方,说明前面没有给该类设备在其父设备目录下找到胶水目录这里就在其父设备的/sys/devices/目录中的所属位置下,创建一个名为其所属类名称的目录同时,这些胶水目录还挂载在对应的class下的p-glue_dirs.list上这样,通过class可以很方便的找到这些在不同父设备下的同一类的设备而且还通过加了一层胶水目录的方式,完美留存了父子设备的关系整个目录就变成这样/sys/devices/../父设备 -类1 -子设备1 -子设备2 -类2 -子设备3 -子设备41622行,将前面找到的父亲kobj作为当前设备内嵌kobj的父亲1626行,这里是让申请连续内存的位置跟随其父设备的位置,这块又涉及到一个复杂知识点NUMA,反正这里这样操作的原因是为了提高内存访问效率1631行,正式将device的kobj注册进sysfs的层级结构中,并且在/sys/devices下生成对应目录1638行,在设备向统一设备模型注册完成的第一时间通知特定硬件架构平台Platform/Architecture-specific code执行底层的硬件级绑定与钩子处理。这个不同平台的实现方式也不同,也是个比较复杂的内容,有时间再研究1641行,在当前设备对应的/sys/devices/中的目录中创建属性文件1645行,创建其到设备树节点的链接和其到class目录的链接文件 (如果有的话)1648行,添加一些类设备特有的属性1651行,将当前device添加到对应的总线上,作为knode加到其bus的klist上1654,这块没学习过,暂时就是添加一些电源管理的文件,然后加入到对应的pm系统中第三段这段代码很关键,因为有些设备节点是不具备真实读写的能力的,其是作为虚拟纯逻辑节点比如usb的interfaces,虽然其会被加入到sysfs层级结构中,但是其具体提供读写的字符设备却是驱动probe中代码创建出来的这里判断如果某个device已经被分配了设备号,则说明其能被vfs进行路由,也就意味着其能够被作为文件操作这里就直接让devtmpfs给当前device在/dev下创建节点第四段前提,一个device不能既是bus设备,又是class设备,bus负责物理逻辑,class负责使用逻辑整体做的就是通知bus,有新设备添加了,同时发布新Kobj添加的uevent到用户空间然后1679行让bus开始遍历自己的两个klist,进行设备驱动匹配1680行,维持在sysfs体系结构之外的对当前device的拓扑结构,该拓扑结构对用户不可见1684行,如果当前设备是类设备,则将其添加到其类的klist中同时调用监听该类的所有外部模块的class_interface,告知他们有新设备添加进来了对这个class_interface的解释如下:class interfaces:让第三方内核模块能够订阅某个class下的设备添加或者移除的接口,其插入到interfaces链表的结构体如下.其实也很好理解,就是当设备被注册到class上的时候,调用所有的class_interface中的add_dev()函数做第三方模块的对应操作总而言之,就是让别的模块可以添加自己的接口来监听该class类上的设备,当该class有设备被添加或者移除的时候,能够自动调用上面这两个函数,做出一些对应的操作比如evdev模块就添加自己的接口来监听input_class上设备的注册,然后class上设备添加的时候调用interfaces链表中的所有class interface的add_dev()函数,该函数自己再去/dev/input/下创建对应的eventx的inode设备节点

相关新闻

信创适配不是换系统,而是四层穿透式重构

信创适配不是换系统,而是四层穿透式重构

简介:本资源是一份面向政府信息化建设单位、信创项目实施方及软件开发商的专业技术指导文件,聚焦定制开发类软件在国产化环境下的适配路径与费用测算方法。内容系统梳理了服务器操作系统、中间件、数据库及浏览器四大核心适配环节的工作流程、技术要点与…

2026/10/10 1:59:49 阅读更多 →
英译中翻译质量对比工具cloud_compare:原理、参数调优与避坑指南

英译中翻译质量对比工具cloud_compare:原理、参数调优与避坑指南

简介:这份资源是 CloudCompare 2.1 版用户手册的中文翻译文档,面向从事三维点云处理、激光扫描、测绘建模等工作的初学者与工程技术人员。CloudCompare 是一款开源且功能灵活的点云处理软件,原手册由 DGM、AB、RM 编写,Rosemary L…

2026/10/10 1:59:49 阅读更多 →
Power Query三步合并Excel多表:告别手动粘贴与公式玄学

Power Query三步合并Excel多表:告别手动粘贴与公式玄学

简介:本资源是一份面向Excel初、中级用户的数据整合实战指南,聚焦解决多工作表批量合并这一高频办公痛点。适用于财务、人事、销售等需汇总部门/人员/产品数据的日常分析场景,无需编程基础,通过VBA自动化脚本即可实现跨工作簿、多…

2026/10/10 1:59:48 阅读更多 →

最新新闻

springboot商城购物app98746-计算机课程设计、毕业设计

springboot商城购物app98746-计算机课程设计、毕业设计

前言 ✨ 博主介绍:一线全栈工程师,毕设实战引路人。技术栈覆盖Java、Python、C#、PHP、Node.js及UniApp跨端开发,擅长多语言项目落地与架构设计。持续分享毕设源码、开题报告、技术选型心得与职场踩坑经验。用工程化思维写代码,帮…

2026/10/10 2:46:04 阅读更多 →
Ant Design Blazor Cascader 级联选择组件完全指南:从省市区数据模型到源码实现

Ant Design Blazor Cascader 级联选择组件完全指南:从省市区数据模型到源码实现

前端UI组件设计系统 【免费下载链接】ant-design-blazor 基于 Ant Design 与 Blazor 的前端组件库。让开发者解放生产力,实现更大价值。 项目地址: https://gitcode.com/ant-design-blazor/ant-design-blazor 点击查看 免费下载 Cascader(级…

2026/10/10 2:46:04 阅读更多 →
Babel 插件开发利器:@babel/helper-module-imports 自动插入 import 与 require 的完整指南

Babel 插件开发利器:@babel/helper-module-imports 自动插入 import 与 require 的完整指南

【免费下载链接】context-hub 项目地址: https://gitcode.com/gh_mirrors/co/context-hub 点击查看 免费下载 babel/helper-module-imports 是 Babel 为插件与 codemod 作者提供的模块插入助手:在自定义 transform 中,它能把 import、requir…

2026/10/10 2:46:04 阅读更多 →
C语言day1递归和分治

C语言day1递归和分治

#include<stdio.h> int f(int n){if(n>2){int resultf(n-1)f(n-2);return result;}else if(n2){return 2;}else if(n1)}return 1;} } int main(){ int n4; printf("f(n)%d",f(n)); return 0;1.爬梯子问题void han(int n ,char qi,char buffer,char zhong){i…

2026/10/10 2:46:04 阅读更多 →
SSD1322 OLED驱动调试核心指南:时序、灰度与初始化避坑

SSD1322 OLED驱动调试核心指南:时序、灰度与初始化避坑

简介&#xff1a;本资源为Solomon Systech官方发布的SSD1322 OLED/PLED显示驱动芯片完整英文数据手册&#xff08;Rev 1.3版&#xff09;&#xff0c;面向嵌入式硬件工程师、显示模组开发者及FPGA/单片机驱动开发人员&#xff0c;用于深入理解该芯片的电气特性、时序规范、命令…

2026/10/10 2:46:04 阅读更多 →
Mavericks 项目中的 View Binding 实践:用一行 `by viewBinding()` 替代 findViewById

Mavericks 项目中的 View Binding 实践:用一行 `by viewBinding()` 替代 findViewById

移动开发原生移动 【免费下载链接】mavericks Mavericks: Android on Autopilot 项目地址&#xff1a; https://gitcode.com/gh_mirrors/ma/mavericks 点击查看 免费下载 View Binding 是 Google 官方推出的替代 findViewById()、Kotlin 合成访问器&#xff08;synthetic acce…

2026/10/10 2:45:04 阅读更多 →

日新闻

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

卫星轨道分类全解析:从LEO到GEO的选型逻辑与工程实践

1. 从“卫星轨道分类”这个标题说起&#xff1a;为什么值得花时间搞懂第一次接触“卫星轨道分类”这个概念&#xff0c;很多人会觉得它离自己很远——不就是天上的星星怎么转吗&#xff1f;但如果你正在做航天任务规划、遥感数据接收、星座设计&#xff0c;甚至只是准备一场航天…

2026/10/10 0:00:39 阅读更多 →
Spring AOP 核心原理与实战:从概念到日志切面落地

Spring AOP 核心原理与实战:从概念到日志切面落地

1. 从一个真实痛点说起&#xff1a;为什么你的代码里到处都是重复逻辑刚入行那会儿&#xff0c;我写过一个用户管理模块&#xff0c;注册、登录、改密码、注销四个接口。每个接口里都塞了几乎一样的日志打印、参数校验、事务开启和提交。当时觉得没什么&#xff0c;能跑就行。直…

2026/10/10 0:00:40 阅读更多 →
Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

Python招聘数据采集与分析可视化:从采集清洗到薪资技能城市可视化全链路

简介&#xff1a;这是一套面向计算机相关专业学生与项目实战学习者的Python数据采集与分析可视化完整项目&#xff0c;以Boss直聘岗位数据为对象&#xff0c;适合用作毕业设计、课程设计或期末大作业。资源包共38个文件&#xff0c;约246KB&#xff0c;以13个py源码文件为核心&…

2026/10/10 0:00:40 阅读更多 →

周新闻

KT148A语音芯片外挂8002D功放的工程实践指南

KT148A语音芯片外挂8002D功放的工程实践指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 15:26:32 阅读更多 →
LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

LLC谐振变换器增益公式推导:从FHA等效到完整归一化表达式

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/10 1:36:08 阅读更多 →
ARM架构深度解析:从RISC设计理念到交叉编译实战

ARM架构深度解析:从RISC设计理念到交叉编译实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 10:11:06 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/8 21:13:17 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 21:32:20 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/9 6:17:20 阅读更多 →