RK3568驱动指南|第九篇 设备树模型-第85章设备模型基本框架-kobject和kset

本文主要是介绍RK3568驱动指南|第九篇 设备树模型-第85章设备模型基本框架-kobject和kset,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工智能应用。RK3568 支持安卓 11 和 linux 系统,主要面向物联网网关、NVR 存储、工控平板、工业检测、工控盒、卡拉 OK、云终端、车载中控等行业。


【公众号】迅为电子

【粉丝群】824412014(加群获取驱动文档+例程)

【视频观看】嵌入式学习之Linux驱动(第九期_设备模型_全新升级)_基于RK3568

【购买链接】迅为RK3568开发板瑞芯微Linux安卓鸿蒙ARM核心板人工智能AI主板


第九篇 设备模型

第85章设备模型基本框架-kobject和kset

85.1 什么是设备模型

字符设备驱动通常适用于相对简单的设备,对于一些更复杂的功能,比如说电源管理和热插拔事件管理,使用字符设备框架可能不够灵活和高效。为了应对更复杂的设备和功能,Linux内核提供了设备模型。设备模型允许开发人员以更高级的方式来描述硬件设备和它们之间的关系,并提供一组通用API和机制来处理设备的注册,热插拔事件,电源管理等。

   通过使用设备模型,驱动开发人员可以将更多的底层功能交给内核来处理,而不必重复实现这些基础功能。这使得驱动的编写更加高级和模块化,减少了重复工作和出错的可能性。对于一些常见的硬件设备,如USB、i2c和平台设备,内核已经提供了相应的设备模型和相关驱动,开发人员可以基于这些模型来编写驱动,从而更快地实现特定设备的功能,并且可以借助内核的电源管理和热插拔事件管理功能。

总之,使用设备模型可以帮助简化驱动开发过程,并提供更高级的功能和灵活性,使得驱动开发人员能够更好地适应复杂的硬件设备需求。

85.2 设备模型的好处

设备模型在内核驱动中扮演着重要的角色,它提供了一种统一的方式来描述硬件设备和它们之间的关系。以下是设备模型在内核驱动中的几个重要方面。

1 代码复用:设备模型允许多个设备复用同一个驱动。通过在设备树或总线上定义不同的设备节点,这些设备可以使用相同的驱动进行初始化和管理。这样可以减少代码的冗余,提高驱动的复用性和维护性。

2 资源的动态申请和释放:设备模型提供了一种机制来动态申请和释放设备所需的资源,如内存,中断等。驱动可以使用这些机制来管理设备所需的资源,确保在设备初始化和关闭时进行正确的资源分配和释放。

3 简化驱动编写: 设备模型提供了一组通用API和机制,使得驱动编写更加简化和模块化。开发人员可以使用这些API来注册设备,处理设备事件,进行设备的读写操作等,而无需重复实现这些通用功能。

4 热插拔机制:设备模型支持热插拔机制,能够在运行时动态添加或移除设备。当设备插入或拔出时,内核会生成相应的热插拔事件,驱动可以通过监听这些事件来执行相应的操作,如设备的初始化或释放。

5 驱动的面向对象思想:设备模型的设计借鉴了面向对象编程(OOP)的思想。每个设备都被看作是一个对象,具有自己的属性和方法,并且可以通过设备模型的机制进行继承和扩展。这种设计使得驱动的编写更加模块化和可扩展,可以更好地应对不同类型的设备和功能需求。

总之,设备模型在内核驱动中扮演着关键的角色,通过提供统一的设备描述和管理机制,简化了驱动的编写和维护过程,提高了代码的复用性和可维护性,并支持热插拔和动态资源管理等重要功能。

85.3 kobject和kset基本概念

kobject和kset是Linux内核中用于管理内核对象的基本概念。

kobject(内核对象)是内核中抽象出来的通用对象模型,用于表示内核中的各种实体。kobject是一个结构体,其中包含了一些描述该对象的属性和方法。它提供了一种统一的接口和机制,用于管理和操作内核对象。kobject结构体在内核源码kernel/include/linux/kobject.h文件中,如下所示:

struct kobject {const char		*name;struct list_head	entry;struct kobject		*parent;struct kset		*kset;struct kobj_type	*ktype;struct kernfs_node	*sd; /* sysfs directory entry */struct kref		kref;
#ifdef CONFIG_DEBUG_KOBJECT_RELEASEstruct delayed_work	release;
#endifunsigned int state_initialized:1;unsigned int state_in_sysfs:1;unsigned int state_add_uevent_sent:1;unsigned int state_remove_uevent_sent:1;unsigned int uevent_suppress:1;ANDROID_KABI_RESERVE(1);ANDROID_KABI_RESERVE(2);ANDROID_KABI_RESERVE(3);ANDROID_KABI_RESERVE(4);
};

这是Linux内核中的struct kobject结构体的定义。它包含了一些字段用于表示和管理内核对象。

下面是一些主要字段的解释:

- const char *name:表示kobject的名称,通常用于在/sys目录下创建对应的目录。

- struct list_head entry:用于将kobject链接到父kobject的子对象列表中,以建立层次关系。

- struct kobject *parent:指向父kobject,表示kobject的层次关系。

- struct kset *kset:指向包含该kobject的kset,用于进一步组织和管理kobject。

- struct kobj_type *ktype:指向定义kobject类型的kobj_type结构体,描述kobject的属性和操作。

- struct kernfs_node *sd:指向sysfs目录中对应的kernfs_node,用于访问和操作sysfs目录项。

- struct kref kref:用于对kobject进行引用计数,确保在不再使用时能够正确释放资源。

- unsigned int 字段:表示一些状态标志和配置选项,例如是否已初始化、是否在sysfs中、是否发送了add/remove uevent等。

 

图 85-1

之前我们在学习平台总线时,查看平台总线要进入/sys/bus目录下,bus目录下的文件都是和总线相关的目录,比如amba总线,CPU总线,platform总线。如下图所示:

图 85-2

kobject表示系统/sys下的一个目录,而目录又是有多个层次,所以对应kobject的树状关系如下图所示:

图 85-3

我们来分析一下上图。在kobject结构体中,parent指针用于表示父kobject,从而建立了kobject之间的层次关系,类似于目录结构中的父目录和子目录的关系。一个kobject可以有一个父kobject和多个子kobject,通过parent指针可以将它们连接起来形成一个层次化的结构,类似于目录结构中,一个目录可以有一个父目录和多个子目录,通过目录的路径可以表示目录之间的层次关系。这种层次化的关系可以方便地进行遍历,查找和管理,使得内核对象能够按照层次关系进行组织和管理。这种设计使得kobject的树状结构在内核中具有很高的灵活性和可扩展性。

接下来我们继续学习kset。

kset(内核对象集合)是一种用于组织和管理一组相关kobject的容器。kset是kobject的一种扩展,它提供了一种层次化的组织结构,可以将一组相关的kobject组织在一起。kset在内核里面用struct kset结构体来表示,定义在include/linux/kobject.h头文件中,如下所示:

struct kset {struct list_head list;spinlock_t list_lock;struct kobject kobj;const struct kset_uevent_ops *uevent_ops;ANDROID_KABI_RESERVE(1);ANDROID_KABI_RESERVE(2);ANDROID_KABI_RESERVE(3);ANDROID_KABI_RESERVE(4);
} __randomize_layout;

这是Linux内核中的struct kset结构体的定义。kset是一种用于组织和管理kobject的集合。

下面是一些主要字段的解释:

- struct list_head list:用于将kset链接到全局kset链表中,以便对kset进行遍历和管理。

- spinlock_t list_lock:用于保护对kset链表的并发访问,确保线程安全性。

- struct kobject kobj:作为kset的kobject表示,用于在/sys目录下创建对应的目录,并与kset关联。

- const struct kset_uevent_ops *uevent_ops:指向kset的uevent操作的结构体,用于处理与kset相关的uevent事件。

该结构体还包含了一些与特定配置相关的保留字段。kset通过包含一个kobject作为其成员,将kset本身表示为一个kobject,并使用kobj来管理和操作kset。通过list字段,kset可以链接到全局kset链表中,以便进行全局的遍历和管理。同时,list_lock字段用于保护对kset链表的并发访问。kset还可以定义自己的uevent操作,用于处理与kset相关的uevent事件,例如在添加或删除kobject时发送相应的uevent通知。

这些字段共同构成了kset的基本属性和关系,用于在内核中组织和管理一组相关的kobject。kset提供了一种层次化的组织结构,并与sysfs目录相对应,方便对kobject进行管理和操作。


85.4 kset和kobject的关系

 在Linux内核中,kset和kobject是相关联的两个概念,它们之间存在一种层次化的关系,

如下图所示:

图 85-4

1. kset是kobject的一种扩展:kset可以被看作是kobject的一种特殊形式,它扩展了kobject并提供了一些额外的功能。kset可以包含多个kobject,形成一个层次化的组织结构。

2. kobject属于一个kset:每个kobject都属于一个kset。kobject结构体中的struct kset *kset字段指向所属的kset。这个关联关系表示了kobject所在的集合或组织。

通过kset和kobject之间的关系,可以实现对内核对象的层次化管理和操作。kset提供了对kobject的集合管理接口,可以通过kset来迭代、查找、添加或删除kobject。同时,kset也提供了特定于集合的功能,例如在集合级别处理uevent事件。

总结起来,kset和kobject之间的关系是:一个kset可以包含多个kobject,而一个kobject只能属于一个kset。kset提供了对kobject的集合管理和操作接口,用于组织和管理具有相似特性或关系的kobject。这种关系使得内核能够以一种统一的方式管理和操作不同类型的内核对象。


这篇关于RK3568驱动指南|第九篇 设备树模型-第85章设备模型基本框架-kobject和kset的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/549706

相关文章

MyBatis分页插件PageHelper深度解析与实践指南

《MyBatis分页插件PageHelper深度解析与实践指南》在数据库操作中,分页查询是最常见的需求之一,传统的分页方式通常有两种内存分页和SQL分页,MyBatis作为优秀的ORM框架,本身并未提... 目录1. 为什么需要分页插件?2. PageHelper简介3. PageHelper集成与配置3.

Java实现视频格式转换的完整指南

《Java实现视频格式转换的完整指南》在Java中实现视频格式的转换,通常需要借助第三方工具或库,因为视频的编解码操作复杂且性能需求较高,以下是实现视频格式转换的常用方法和步骤,需要的朋友可以参考下... 目录核心思路方法一:通过调用 FFmpeg 命令步骤示例代码说明优点方法二:使用 Jaffree(FF

Python日期和时间完全指南与实战

《Python日期和时间完全指南与实战》在软件开发领域,‌日期时间处理‌是贯穿系统设计全生命周期的重要基础能力,本文将深入解析Python日期时间的‌七大核心模块‌,通过‌企业级代码案例‌揭示最佳实践... 目录一、背景与核心价值二、核心模块详解与实战2.1 datetime模块四剑客2.2 时区处理黄金法

Spring Boot集成Logback终极指南之从基础到高级配置实战指南

《SpringBoot集成Logback终极指南之从基础到高级配置实战指南》Logback是一个可靠、通用且快速的Java日志框架,作为Log4j的继承者,由Log4j创始人设计,:本文主要介绍... 目录一、Logback简介与Spring Boot集成基础1.1 Logback是什么?1.2 Sprin

ubuntu如何部署Dify以及安装Docker? Dify安装部署指南

《ubuntu如何部署Dify以及安装Docker?Dify安装部署指南》Dify是一个开源的大模型应用开发平台,允许用户快速构建和部署基于大语言模型的应用,ubuntu如何部署Dify呢?详细请... Dify是个不错的开源LLM应用开发平台,提供从 Agent 构建到 AI workflow 编排、RA

ubuntu系统使用官方操作命令升级Dify指南

《ubuntu系统使用官方操作命令升级Dify指南》Dify支持自动化执行、日志记录和结果管理,适用于数据处理、模型训练和部署等场景,今天我们就来看看ubuntu系统中使用官方操作命令升级Dify的方... Dify 是一个基于 docker 的工作流管理工具,旨在简化机器学习和数据科学领域的多步骤工作流。

如何在Ubuntu上安装NVIDIA显卡驱动? Ubuntu安装英伟达显卡驱动教程

《如何在Ubuntu上安装NVIDIA显卡驱动?Ubuntu安装英伟达显卡驱动教程》Windows系统不同,Linux系统通常不会自动安装专有显卡驱动,今天我们就来看看Ubuntu系统安装英伟达显卡... 对于使用NVIDIA显卡的Ubuntu用户来说,正确安装显卡驱动是获得最佳图形性能的关键。与Windo

C++迭代器失效的避坑指南

《C++迭代器失效的避坑指南》在C++中,迭代器(iterator)是一种类似指针的对象,用于遍历STL容器(如vector、list、map等),迭代器失效是指在对容器进行某些操作后... 目录1. 什么是迭代器失效?2. 哪些操作会导致迭代器失效?2.1 vector 的插入操作(push_back,

Java使用WebView实现桌面程序的技术指南

《Java使用WebView实现桌面程序的技术指南》在现代软件开发中,许多应用需要在桌面程序中嵌入Web页面,例如,你可能需要在Java桌面应用中嵌入一部分Web前端,或者加载一个HTML5界面以增强... 目录1、简述2、WebView 特点3、搭建 WebView 示例3.1 添加 JavaFX 依赖3

Linux高并发场景下的网络参数调优实战指南

《Linux高并发场景下的网络参数调优实战指南》在高并发网络服务场景中,Linux内核的默认网络参数往往无法满足需求,导致性能瓶颈、连接超时甚至服务崩溃,本文基于真实案例分析,从参数解读、问题诊断到优... 目录一、问题背景:当并发连接遇上性能瓶颈1.1 案例环境1.2 初始参数分析二、深度诊断:连接状态与