七、设备模型

news/2025/11/26 22:47:13/文章来源:https://www.cnblogs.com/gramming/p/19266143

一、概述

  1. kobject内核抽象出来的通用对象,对应/sys目录下的一个文件
  2. kset是kobject的一个扩展,一个kset尅包含多个kobject,将多个kobject通过parent进行关联,实现了层次化的结构
  3. sysfs虚拟文件系统,向用户空间提供内核的设备
  4. 总线和驱动同时有probe函数,会打印警告,并且只会执行一次bus的probe函数
  5. 驱动注册时,添加驱动到bus之后会执行driver_attach,遍历该bus下的device,匹配成功后执行probe函数
  6. 设备注册时,添加设备到bus之后会执行bus_probe_device,遍历该bus下的driver,匹配成功后执行probe函数,因此设备和驱动的加载顺序不重要

二、关键API

// 创建kobject,该方法指定了创建的kobject的kobj_type
struct kobject *kobject_create_and_add(const char *name, struct kobject *parent);  // 参数设置名字和kobject的父对象
// 创建kobject,该方法的kobject对象必须自己分配空间,可以自己指定ktype
int kobject_init_and_add(struct kobject *kobj, struct kobj_type *ktype, struct kobject *parent, const char *fmt, ...);
// 释放kobject
void kobject_put(struct kobject *kobj);
// 创建kset
struct kset * kset_create_and_add(const char *name, const struct kset_uevent_ops *u, struct kobject *parent_kobj);    // 参数设置名字、属性和父object
// kset下创建kobject
kobject->kset = kset;

三、总线、设备、驱动和类

  1. struct bus_type包含的关键成员:match函数匹配设备和驱动(通过名字),uevent函数处理设备的事件,probe函数探测设备(执行驱动的probe函数),remove函数移除设备,suspend挂起,resume恢复
  2. struct device包含的关键成员:bus_type所属的总线,device_driver所对应的驱动,class所属的类
  3. struct device_driver包含的关键成员:bus_type所属的总线,of_match_table设备匹配表,probe函数探测函数,remove函数移除设备,suspend挂起,resume恢复
  4. struct class包含的关键成员:class_groups表示类属性组,dev_groups表示设备属性组,devnode函数生成设备节点,dev_uevent处理设备事件

四、引用计数器

  1. 表示资源被引用的计数,当计数值减少为0时才能真正释放资源
  2. 相关API
// 初始化,值初始化为1
void kref_init(struct kref *kref);
// 计数值加1
void kref_get(struct kref *kref);
// 计数值减1,减少为0后会调用注册的release函数
int kref_put(struct kref *kref, void (*release)(struct kref *kref));
  1. kobject的release函数,即kobject_cleanup,最终调用了type结构体的release函数,该函数中需要有kfree(kobj)对应的kzalloc
  2. type结构体中还有attribute结构体数组表示属性(主要是name和mode),sysfs_ops结构体表示操作函数
  3. struct kobj_attribute结构体包含了attribute属性结构体对象以及show和store函数
  4. sysfs_create_file函数将kobj_attribute结构体添加到kobject对象的type的attribute数组中,并能回调注册好的show和store函数
  5. sysfs_create_group函数注册一个kobject对象的type的attribute数组,只不过是以group的形式注册

五、注册总线、设备和驱动

// 注册总线
int bus_register(struct bus_type *bus);
// 注销总线
void bus_unregister(struct bus_type *bus);
// 在总线下创建属性文件
int bus_create_file(struct bus_type *bus, struct kobject *kobj, const struct attribute *attr);
// 初始化平台总线
platform_bus_init();
// 平台总线的match函数,匹配优先级of_match_table、id_table、name
// 注册设备-初始化结构体、添加到总线的链表下、建立一些属性文件和链接文件
int device_register(struct device *dev);
// 注册平台设备
int platform_device_register(struct platform_device *pdev);
// 注册驱动
int driver_register(struct device_driver *drv);
// 注册平台驱动,平台总线的probe函数中会调用驱动的probe函数
int __platform_driver_register(struct platform_driver *drv, struct module *owner);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/977738.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Scrum冲刺阶段 Day Three

一、站立会议纪要 1. 已完成工作 后端开发:设计用户与文件表结构 实现注册登录接口 实现文件上传接口 实现全局异常处理 封装请求拦截器前端开发:搭建前端基础框架 开发注册登录页面2. 今日计划工作实现文件列表查询…

鼎鉴时代锋芒 智启品牌新章 ——2025品牌智鉴榜荣耀登临

当全球产业重构与消费升级浪潮澎湃交汇,品牌早已成为衡量时代实力的核心标尺,更是穿越周期、引领变革的核心力量。2024 品牌智鉴榜,以 “智识为基、专业为刃、价值为魂”,历经百日全域筛查、多维体系核验、业界权威…

深入解析:MTK5G旗舰系列——天玑9500/9400/9300/9200/9000在AI和处理器性能、DDR频率及UFS的深度对比分析

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

迈向人机共育的文明语法:AI元人文理论体系深度阐释——内观照叙事模型

迈向人机共育的文明语法:AI元人文理论体系深度阐释——内观照叙事模型 我们正站在一个文明史的奇点上。人工智能不再是遥远的科幻,而是深度介入社会运作、伦理决策与意义构建的“文明参与者”。传统的“价值对齐”范…

Day25综合案例一--CSS精灵--京东服务

<!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0">…

Intellij扩展列表

开发idea插件,需要找到可用的扩展点,之前都是直接在网上搜索,最近详细看了下官方文档, 发现已经给我们列好了所有可用的扩展点 文档位置 https://plugins.jetbrains.com/docs/intellij/plugin-extensions.html#exp…

agentic terminal coding

opencode: https://github.com/sst/opencode The AI coding agent built for the terminalWhat is OpenCode? OpenCode is an open source agent that helps you write and run code directly from the terminal.[*] …

the badness of USA

it has no bad review. Maybe R/N/G can get the real worst some, but theres no even in the people they killed so much. so USA never changes. somehow.

Day3 Scrum冲刺博客

Day3 Scrum冲刺博客 1. 团队会议 todo补充会议照片 1)昨天已完成的工作前端实现个人设置弹窗以及问答模式静态页面,实现问答模式缓存 "关于我们"细节修正后端完成爬虫数据的数据清洗 增加爬虫程序适配的信…

完整教程:内核里常用宏BUG_ON/WARN_ON/WARN_ONCE

完整教程:内核里常用宏BUG_ON/WARN_ON/WARN_ONCE2025-11-26 22:27 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; displa…

贪心专题笔记(从b站左程云老师那上完后的笔记)

https://www.bilibili.com/video/BV1ST4y1s7XT/?spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=56781f0f92104550238c449cb1aebd72 关键:用对数器验证 1.如果要排序,保证排序具有…

Agent编写全攻略(超详细)从零基础到精通,一篇搞定,不看后悔,赶紧收藏!

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

做题警醒

1.一定要写边界条件,不要偷懒不要偷懒!!! 经典案例题目https://www.luogu.com.cn/problem/P3763 这里一开始没把根节点单独考虑,直接将st1的赋值为0,st2的也复制为0 2.链式向前星建完图遍历是注意head[]写的是节点不…

动态规划可能性展开

1.以结尾展开可能性 从0……i中,判断i,然后调用0……i-1的可能性(可以是以i这个下标为结尾,也可以是0……i的范围上,也可以是以i下标所放的值进行展开) 2.定义往往从递归的定义出发,但是为了避免讨论边界的麻烦…

微软发布 Godot C# 游戏开发教程:godot-csharp-essentials

对于希望踏入游戏开发领域的 C# 开发者来说,一个令人振奋的好消息是:微软在其 GitHub 上发布了一个全新的开源项目microsoft/godot-csharp-essentials:https://github.com/microsoft/godot-csharp-essentials。这个仓…

Day3-20251126

本文介绍了Java开发相关的JDK、JRE和JVM概念,并详细说明了JDK的卸载和安装步骤。卸载时需删除安装目录和环境变量配置,安装时要注意下载对应版本并正确配置环境变量。最后通过cmd验证安装是否成功,并推荐使用notepa…

[KaibaMath]1028 关于[log(m, a)]+1=⌈log(m+1, a)⌉的证明

下面给出[log(m,a)]+1=⌈log(m+1,a)⌉的证明,证明过程非常丝滑。特别地,令a=2,则有1025的结论。

QT TCP服务器构建及网络通信实现 - 详解

QT TCP服务器构建及网络通信实现 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mo…

SCTimer/PWM定时器(续二)

前面讨论了SCT的全部寄存器结构及其功能,现在就具体来看一下LPC824中这个充满特色的SCTimer/PWM,首先看一下它的简介。 状态可配置定时器(SCTimer/PWM) 是恩智浦半导体特有的一种外设,它不仅可像大多数传统定时器一…