device-driver:bus/kobject/kset

一文讲解Linux 设备模型 kobject,kset 既然我们知道 kobject是一个目录,那么kset是kobject的高级体,那么kset也就是一个目录,这个目录的名字也就是kobject来指定的,而且kset 里面有一个链表,可以看出来,kset就是一个类别的kobject的集合,比如bus目录下面,就全部是bus相关的,i2c是一个Bus,platform也是一个bus,等等。抽象系统中所有的硬件设备,描述它的名字、属性、从属的Bus、从属的Class等信息,我们正常些驱动,还会写上这个设备的一些硬件资源,中断口,复位口,I2C地址等等。 阅读详情

bus

bus是驱动模型的主要一环,衔接了driver和device,特别地,bus负责管理挂载在上面的所有driver和devices, 大部分的情况是: 系统初始化时候,xxx-bus-core注册了一个虚拟总线,比如 i2c总线, 然后soc厂家在这个总线上, 注册自己的i2c-host, 一个host,一个driver,多个client devices.

简略版本的bus-type:

struct bus_type {
	const char		*name;
	const char		*dev_name;
	//common functions
	int (*match)(struct device *dev, struct device_driver *drv);
	int (*uevent)(struct device *dev, struct kobj_uevent_env *env);
	int (*probe)(struct device *dev);
	void (*remove)(struct device *dev);
	//power management
	void (*shutdown)(struct device *dev);
	int (*suspend)(struct device *dev, pm_message_t state);
	int (*resume)(struct device *dev);	
};

驱动owner一般很少创建自己的bus,系统基本已经造好了轮子, 直接使用即可.
比如下面的i2c总线,是kernel已经创建好的.
soc驱动开发者, 可以调用i2c_add_adapter( )去注册一个自己的i2c host bus.
调用层次:
i2c_add_adapter( )
i2c_register_adapter() ->
bus_for_each_drv(&i2c_bus_type, NULL, adap, __process_new_adapter);

struct bus_type i2c_bus_type = {
	.name		= "i2c",
	.match		= i2c_device_match,
	.probe		= i2c_device_probe,
	.remove		= i2c_device_remove,
	.shutdown	= i2c_device_shutdown,
};

下面是一个bus的常规kenrel创建过程:
注册一个device,作为顶层的device, 所有从属于这个bus的设备, 当前的platform_bus device节点都是他们的parent, 即 /sys/devices/platform
同时,注册一个platform到bus目录下, 来作为总线,管理隶属于platform的driver和devices, 即 /sys/bus/platform.

struct device platform_bus = {
	.init_name	= "platform",
};
struct bus_type platform_bus_type = {
	.name		= "platform",
	.match		= platform_match,
	.uevent		= platform_uevent,
	.probe		= platform_probe,
	.remove		= platform_remove,
	.shutdown	= platform_shutdown,
	.pm		= &platform_dev_pm_ops,
};
int __init platform_bus_init(void)
{
	int error;
	error = device_register(&platform_bus);
	error =  bus_register(&platform_bus_type);
	return error;
}

Summary

kobject
#include <linux/kobject.h>
包含文件中包含了对kobject的定义,以及相关的结构和函数。
void kobject_init(struct kobject *kobj);
int kobject_set_name(struct kobject *kobj,const char *format,…);
kobject的初始化函数。

struct kobject *kobject_get(struct kobject *kobj);
void kobject_put(struct kobject *kobj);
管理kobject引用计数的函数。

struct kobj_type *get_ktype(struct kobject *kobj);
对包含kobject的结构类型的描述,使用get_ktype获得与指定kobject相关的
kobjtype.

int kobject_add(struct kobject *kobj);
extern int kobject_register(struct kobject *kobj);
void kobject_del(struct kobject *kobj);
void kobject_unregister(struct kobject *kobj);
kobject add向系统添加kobject,处理kset成员关系,sysfs表述以及产生热插拔事
件。kobject_register函数是kobject_init和kobject_add的组合。使用kobject del
删除一个kobject,或者使用kobject_unregister函数,它是kobject_del和kobject_put
的组合。

kset的初始化和注册函数。
void kset_init(struct kset *kset);
int kset_add(struct kset *kset);
int kset_register(struct kset *kset);
void kset_unregister(struct kset *kset);

sysfs操作

#include <linux/sysfs.h>
包含sysfs声明的包含文件。

  • int sysfs_create_file(struct kobject *kobj,struct attribute *attr);
    int sysfs_remove_file(struct kobject *kobj,struct attribute *attr);
    int sysfs_create_bin file(struct kobject *kobj,struct bin attribute *attr);
    int sysfs_remove_bin_file(struct kobject *kobj,struct bin_attribute *attr);
    int sysfs_create_link(struct kobject *kobj,struct kobject *target,char
    *name):
    void sysfs_remove_link(struct kobject *kobj,char *name);
    添加或删除与kobject相关属性文件的函数。
    总线、设备和驱动程序

  • int bus_register(struct bus_type *bus);
    void bus_unregister(struct bus_type *bus);
    在设备模型中实现总线注册和注销的函数。
    int bus_for_each dev(struct bus_type *bus,struct device *start,void *data,
    int (*fn)(struct device *void *))
    int bus for each drv(struct bus type *bus,struct device driver *start,void *para)
    这些函数分别遍历附属于指定总线的每个设备和驱动程序。
    BUS_ATTR(name,mode,show,store);
    int bus_create_file(struct bus_type *bus,struct bus_attribute *attr);
    void bus_remove_file(struct bus_type *bus,struct bus_attribute *attr);
    使用宏BUS ATTR声明了一个bus_attribute结构,使用上面的两个函数可对
    该结构进行添加和删除。

  • int device_register(struct device *dev);
    void device_unregister(struct device *dev);
    处理设备注册的函数。
    DEVICE_ATTR(name,mode,show,store);
    int device_create_file(struct device *device,struct device_attribute *entry);
    void device_remove_file(struct device *dev,struct device_attribute *attr);
    处理设备属性的宏和函数。

  • int driver_register(struct device_driver *drv);
    void driver_unregister(struct device_driver *drv);
    注册和注销设备驱动程序的函数。
    DRIVER_ATTR(name,mode,show,store);
    int driver_create_file(struct device_driver *drv,struct driver_attribute
    *attr);
    void driver_remove_file(struct device_driver *drv,struct driver_attribute
    *attr);
    管理驱动程序属性的宏和函数。

类

  • struct class_simple *class_simple_create(struct module *owner,char *name);
    void class_simple_destroy(struct class_simple *cs);
    struct class_device *class_simple_device_add(struct class_simple *cs,dev_t
    devnum,struct device *device,const char *fmt,…);
    void class_simple_device_remove(dev_t dev);
    int class_simple_set_hotplug(struct class_simple *cs,int (*hotplug)(struct
    class_device *dev,char **envp,int num_envp,char *buffer,int
    buffer_size));
  • 实现class_simple接口的函数;它们管理了包含dev属性和其他内容在内的简
    单类人口。
    int class_register(struct class *cls);
    void class_unregister(struct class *cls);
    注册和注销类。
    CLASS_ATTR(name,mode,show,store);
    int class_create_file(struct class *cls,const struct class_attribute *attr);
    void class_remove file(struct class *cls,const struct class_attribute *attr);
    处理类属性的常用宏和函数。
    int class_device_register(struct class_device *cd);
    void class_device_unregister(struct class_device *cd);
    int class_device_rename(struct class_device *cd,char *new_name);
    CLASS_DEVICE_ATTR(name,mode,show,store);
    int class_device_create_file(struct class_device *cls,const struct
    class_deviceattribute *attr);
    void class_device_remove_file(struct class_device *cls,const struct
    class_device_attribute *attr);
    实现类设备接口的函数和宏。
    int class_interface_register(struct class_interface *intf);
    void class_interface_unregister(struct class_interface *intf);
    向类添加(或者删除)接口的函数。

固件

  • #include <linux/firmware.h>
    int request_firmware(const struct firmware **fw,char *name,struct device
    *device);
    int request_firmware nowait(struct module *module,char *name,struct device
    *device, void *context, void (*cont)(const struct firmware *fw,void
    *context));
    void release firmware(struct firmware *fw);
    内核中实现固件加载的接口函数。
Linux驱动的kobj/kset/bus/dev/drv/class sysfs和kobject和kset和kobject_uevent()、内核对象 阅读详情

相关推荐

qPCR定量方法在肠道微生物特定种属定量应用

大家都知道肠道中有上千种细菌,肠道微生物可参与人体代谢,促进营养物质的消化吸收,肠道微生态均衡关系到身体健康,肠道微生态失衡可能会导致疾病产生。此外有文献指出肠道微生物可能与人体免疫及炎性反应等有关。目前也越来越多人关注到疾病与肠道微生物的关系,也做了很多研究及实验,一般高通量结果得到的是每个物种在样本中的相对百分含量,而不同微生物的绝对含量其实也对疾病有很重要的影响。在此分享几篇有采用qPCR方法研究疾病与肠道微生物关系的文章。 早在2013年Kim-Anne Lê1、Yan Li等人发表文章Alter

tinygene的博客 2143

11-linux设备模型

它以一种层次结构的方式组织数据,并将这些数据表示为文 件和目录,使得用户空间可以通过文件系统接口访问和操作内核对象的属性比如:当使用kobject 时,通常不会单独使用它,而是将其嵌入到一个数据结构中。这样做的目 的是将高级对象接入到设备模型中。比如cdev结构体和platform_device结构体,如下所示: cdev 结构体如下所示,其成员有kobject所以我们也可以把总线,设备,驱动看作是kobject的派生类。

2202_75321950的博客 393

利用DRONEKIT-SITL + MAVPROXY + QGroundControl模拟飞行

dronekit: 一种用于无人机控制的python库。 dronekit-sitl:一种本地仿真工具,相当于本地虚拟化了一个无人机。 mavproxy:数据转发软件(类似于插线板的感觉,一个输入,多个相同的输出)。打开一个Anaconda prompt 首先激活相应的环境 然后运行如下命令: 保持2中的Anaconda prompt处于运行状态,另打开一个Anaconda prompt窗口,运行如下命令: tcp:127.0.0.1:5760: SITL默认端口,作为mavproxy的输入,把输入数据转发

Done___的博客 4344

Linux设备模型剖析系列一(基本概念、kobject、kset、kobj_type)

【摘要】本文是linux设备模型剖析系列文章之一,主要内容包括了Linux内核中设备模型的核心思想,讲述了Bus, class, device和device_driver等的概念,特别是对kobject、kset、kobj_type作为Linux设备模型的基本单元,同时也是设备模型中最难理解的一部分,进行了源码级的较为清楚的分析。

Leon的博客 1627

RK3588 MIPI屏幕调试避坑指南:双通道8Lane下DSC压缩屏的花屏、分层问题排查实录

本文详细解析了RK3588平台在双通道8Lane MIPI接口下调试DSC压缩屏时遇到的花屏、分层问题。通过硬件信号完整性检查、软件配置验证及帧数据分析,提供了一套系统化的排查方法,并深入探讨了初始化序列优化和双通道同步机制,帮助工程师高效解决高分辨率屏幕显示异常问题。

weixin_27015733的博客 280

链家二手房信息爬取(内附完整代码)

链家二手房信息爬取1.简介2. 爬虫思路2.1 网页分析2.2 详情页分析2.3 不同页码的爬取2.4 解决链家只显示100页数据2.5 简单的反爬与进度条显示3. 总结 1.简介   最近帮同学爬取了链家在售二手房的信息,这是本人学习爬虫以来爬取数据最多的一次,就想着写个博客记录一下。   本次爬虫是利用python+jupyter notebook实现的,用到的第三方库如下: import pandas as pd # 数据存储 import requests # 网页内容获取 import re #

qq_46256922的博客 3万+

linux设备模型bus,device,driver,Kobject和Kset及设备驱动模型--Apple的学习笔记

前言:今天我主要想学习linux驱动开发中的对象关联关系,网上搜索了下linux设备模型其实是从Kobject和Kset开始的。之前我是直接从bus/device/drive开始学习的,所以就补充下这块内容吧一,Kobject和Kset代码分析Kobject和Kset若站在sysfs角度来看就是创建对应的文件夹。从而建立起设备驱动框架。我从driver_init开始看的。做下笔记image.png...

weixin_39971172的博客 352

华为OD机试新系统真题【仓库盘点】

华为OD机试真题 新系统【仓库盘点】,提供C语言、Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。华为OD机试真题【仓库盘点】

qq_45776114的博客 571

linux设备模型bus,device,driver,(kobject、ktype、kset,bus_type、device、device_driver)

1.1Linux设备驱动模型简介1、什么是设备驱动模型(1)类class。总线bus(负责将设备和驱动挂接起来)。设备devices、驱动driver(可以看到在驱动源码中,不管是什么样的驱动,都是以struct_xxx_driver来表示的)。Linux设备驱动中的四个框架、分别对应Linux驱动源代码中的四个结构体。四个结构体分别描述Linux设备驱动中的类、总线、设备、驱动,这四个概念。对应...

weixin_39922868的博客 499

2025美赛C题奥运奖牌榜模型(附代码+全保姆教程)Models for Olympic Medal Tables

伟大教练”效应的测量方法定义奖牌变化率:−−​如果变化率显著为正,且超出历史平均增长率,则认为存在“伟大教练”效应。使用统计方法(如t检验)验证教练到来是否带来显著性差异。

博客 6371

RTOS与Linux功能差异与应用场景全面对比

在嵌入式系统的开发中,操作系统的选择至关重要。和是两种广泛应用的操作系统,它们在功能、设计目标以及应用领域中各具优势。随着嵌入式系统的不断发展,已成为嵌入式行业的大趋势。那么,这两者到底有什么不同呢?

硬核科技 400

kobject,kset,子系统层次结构 、platform_device platform_driver

为什么两个name的名字必须匹配才能实现device和driver的绑定? (1)在内核初始化时kernel_init()->do_basic_setup()->driver_init()->platform_bus_init()初始化platform_bus(虚拟总线); (2)设备注册的时候platform_device_register()->platform_device_add()-

ADC0809608的专栏 6002

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

struct device_driver的probe的调用

<br />最近看到linux的设备驱动模型,关于Kobject、Kset等还不是很清淅。看到了struct device_driver这个结构时,想到一个问题:它的初始化函数到底在哪里调用呢?以前搞PCI驱动时用pci驱动注册函数就可以调用它,搞 s3c2410驱动时只要在mach-smdk2410.c中的struct platform_device *smdk2410_devices {}中加入设备也会调用。但从来就没有想过具体的驱动注册并调用probe的过程。<br /><br /> 于是

dongliqiang2006的专栏 726

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

Linux device driver拓扑结构-用户视角

这一个章节,我尝试从用户的角度去观察Linux的设备与设备驱动是怎么呈现出来的。 在进行Linuxdriver的分析时,我们首先要搞清楚的就是Linuxdevicerdriver的模型,在这里面运用了面向对象的思想,而且写的相当的有技巧。 我们知道在java中,会有一个object对象,这个就是一生万物中的一,在LinuxKernel中,我们也有一个叫做kobject,这个“一”到时会化作sys文件系统的中的实体体现出来,就是一个目录。然后这个一又被演化万物(在实现过程中,如果一个对象...

笨老男孩 608

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

kobject device model and sys file system introduction

一、Linux Device Model 1.linux设备模型简介 在内核2.5的开发周期中需要完成一个目标:为内核建立一个统一的设备模型,目的是为了对计算机上的所有设备进行统一地表示和操作,包括设备本身和设备之间的连接关系。这个模型是在分析了PCI和USB的总线驱动过程中得到的,这两个总线类型能代表当前系统中的大多数设备类型,它们都有完善的热插拔机制和电源管理的支持,也都有级连机制的支持,

子夜的专栏 907

09 - 设备模型和 sysfs 文件系统

09 - 设备模型和 sysfs 文件系统

嵌入式wu 933

Linux设备驱动模型:从kobject到platform_driver的完整解析

Linux设备驱动模型是内核中用于统一管理硬件设备的核心框架,它基于kobject、kset和sysfs等基础机制构建。该模型通过总线、设备、驱动和类四大核心组件,实现了设备与驱动的自动匹配、统一生命周期管理以及用户空间的标准化访问。其技术价值在于大幅提升了驱动的可维护性、可扩展性,并原生支持电源管理、热插拔等高级特性。在应用场景上,无论是嵌入式开发中的GPIO、I2C设备,还是服务器领域的PCIe、USB外设,都依赖这套模型进行高效管理。本文以platform_driver为例,结合设备树和sysfs,深

weixin_29175469的博客 227

Linux设备模型深度解析:从kobject到驱动实战

在Linux内核开发中,设备管理是一个核心且基础的技术领域,它关乎系统如何高效、统一地组织和管理硬件资源。其背后的核心原理是一套基于对象模型的抽象框架,通过kobject、kset和ktype等基础数据结构,为所有设备提供了统一的引用计数、层次化管理和资源释放机制。这套基础设施的技术价值在于实现了设备与驱动的解耦,支持动态发现、热插拔和统一的电源管理。其典型的应用场景包括嵌入式系统、服务器以及任何需要管理复杂、多样外设的场合。本文聚焦于Linux设备模型,深入剖析其如何通过总线(Bus)、设备(Device

weixin_29173777的博客 308

转----嵌入式Linux驱动笔记(十六)------设备驱动模型(kobject、kset、ktype)

2017年10月27日 20:43:01 风筝丶 阅读数:4458 版权声明:本文为 风筝 博主原创文章,转载请署名出处!!谢谢合作。文章地址: https://blog.youkuaiyun.com/Guet_Kite/article/details/78368928 ###你好!这里是风筝的博客, ###欢迎和我一起交流。 前几天去面试,被问到Linux设备驱动模型这个问题,没答好,回来后恶...

xiaoyao1004的专栏 342

(kobject、ktype、kset,bus_type、device、device_driver)

1.1Linux设备驱动模型简介1、什么是设备驱动模型(1)类class。总线bus(负责将设备和驱动挂接起来)。设备devices、驱动driver(可以看到在驱动源码中,不管是什么样的驱动,都是以struct_xxx_driver来表示的)。Linux设备驱动中的四个框架、分别对应Linux驱动源代码中的四个结构体。四个结构体分别描述Linux设备驱动中的类、总线、设备、...

weixin_33722405的博客 284

kset/kobj/ktype结构体之间的关系(个人笔记)

Linux设备模型的核心是kobject、kset和ktype机制,它们共同构建了设备管理的拓扑结构。kobject代表内核对象;kset是kobject的集合;ktype则定义了kobject的操作方法和释放机制。这些基础结构通过sysfs文件系统以目录形式向用户空间展示设备信息,支持设备的热插拔和动态管理。设备、驱动和总线通过kobject相互关联,总线负责设备与驱动的匹配。sysfs提供多视角查看设备,支持通过attribute实现内核与用户空间的信息交互。

weixin_62788090的博客 742
上一篇: kernel trace function call-stack
下一篇: DRM 从app到libdrm,到/dev/dri/card0
liveloading
博客等级 码龄7年 53粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值