当前位置: 首页 > news >正文

七、设备模型

一、概述

  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.zskr.cn/news/62014.html

相关文章:

  • 鼎鉴时代锋芒 智启品牌新章 ——2025品牌智鉴榜荣耀登临
  • Day25综合案例一--CSS精灵--京东服务
  • agentic terminal coding
  • 2025年11月26日
  • Day3 Scrum冲刺博客
  • 贪心专题笔记(从b站左程云老师那上完后的笔记)
  • 做题警醒
  • 微软发布 Godot C# 游戏开发教程:godot-csharp-essentials
  • [KaibaMath]1028 关于[log(m, a)]+1=⌈log(m+1, a)⌉的证明
  • 软件工程学习日志2025.11.26
  • [KaibaMath]1027 关于mn ⇔ m≥n+1(m,n均为整数)的证明
  • Webpack高级之常用配置项
  • 详细介绍:从零开始的云原生之旅(七):ConfigMap 和 Secret 配置管理
  • 详细介绍:逻辑回归 Logistic 算法从入门到入土
  • NOIP 集训 day5 DP
  • 解码JSON
  • 深入解析:Vue2.x + Webpack + ES6仿懂球帝足球项目实战
  • 生产事故救火指南:Kafka 消息积压了怎么办?如何保证数据一条不丢?
  • qoj 2610 题解
  • P4158 [SCOI2009] 粉刷匠
  • Google 新出的 Antigravity 有哪些新特性?
  • AI元人文实践:家庭旅游规划
  • 畅通工程 小记
  • Linuxの磁盘知识2
  • 大盘风险控制策略分析报告 - 2025年11月26日
  • ASR+TTS - 实践
  • 1. 密码学基础
  • 笔记分享 : 一文读懂3个概念 : RoI, RoI pooling, RoI Align
  • LLM提示注入攻击深度解析:从原理到防御的完整应对方案
  • Ceres Solver优化库学习笔记