热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

delphi子接口是否实现父接口_LINUX设备驱动模型分析之四设备模块相关(DEVICE)接口分析...

本系列前几篇文章链接如下:《LINUX设备驱动模型分析之一总体概念说明》《LINUX设备驱动模型分析之二总线(BUS)接口分析》《LINUX设备驱动模型分析之三驱动模

本系列前几篇文章链接如下:

《LINUX设备驱动模型分析之一 总体概念说明》

《LINUX设备驱动模型分析之二 总线(BUS)接口分析》

《LINUX设备驱动模型分析之三 驱动模块相关(DRIVER)接口分析》

本系列文章涉及sysfs文件系统的内容,如需要了解sysfs的内容,请参考之前写的sysfs相关的文档。

我们已经完成了总线、驱动模块相关接口的分析,本章我们主要对设备模块进行分析。在上面几章的分析中,我们知道注册在总线上的驱动模块对应的kobject是通过bus->p->drivers_kset汇聚至一起,且drivers_kset对应kobject是该总线上注册驱动模块的父kobject或者祖先kobject。而针对device-kobject而言,虽然其依附的bus变量定义device_kset变量(kset类型),但device_kset->kobject与device->kobject两者之间是通过链接方式,实现两者kobject之间的绑定操作。如下为device、bus模块间kobject变量的关联,这两者之间通过sysfs link模式实现kobject的关联。

与之前两章类似,本章也分别从相关数据结构、device模块初始化、device的注册与注销接口分析这三个部分分析device模块。

device模块相关数据结构体分析

Device相关的结构体包括struct device、struct device_private、struct device_type这三个结构体,我们接下来分析这三个结构体

struct device_private结构体分析

该结构体为device结构体的私有变量,该结构体定义如下,该结构体主要实现与bus、driver、父device、所有子device的关联。

b303b14949a0280ff03ff030247992c8.png
struct device_type结构体分析

该结构体为device类型相关的结构体,包含类型的名称、类型对应属性组、该类型的uevent接口、release接口、电源管理相关ops等。如iic_client类型设备,其type为i2c_client_type,而iic_adapter类型的设备,其type为i2c_adapter_type,还有usb_device_type等类型定义。该结构体标识一个设备的类型。

8fdd6e6200901eb7e71226b9aca67db2.png

struct device结构体分析

该结构体标识一个设备,其包括几方面的内容:

  1. 与device的关联(包括与父device、子device的关联,通过链表关联)
  2. 与class的关联(实现device与class的互相关联)
  3. 与bus的关联(实现device与bus的互相关联)
  4. 与driver的关联(实现device与driver的互相关联,包括两个结构体变量的关联以及两个结构体中kobject成员变量的关联)
  5. 与of模块的关联(主要是存储of的设备节点信息,用于设备树相关的内容)
  6. 存放platform相关的设备信息(主要供platform模块使用)
32ecc5473383c137d305f11566353491.png
device-bus-driver结构体间的关联

上面介绍了device项目的结构体,下面我们介绍这些结构体与bus、driver模块的关联,以下为device、bus、driver三个模块相关结构体之间的关联图,我们下面详细说明下这三个模块之间的关联情况。

  1. bus与device之间的关联包括两部分:
  2. bus、device通过klist_devices,实现两个结构体通过内嵌的链表变量实现关联
  3. bus、device对应的kobject之间互相建立sysfs的kobject的链接,实现kobject之间的关联
  4. device与driver的关联,device与driver通过内嵌的klist节点以及klist_devices链表,实现结构体间的关联。
9eda43927d0068d00b70c862545fb9ef.png
device间的关联

此处主要用于说明已创建的设备变量是如何关联的。它们之间通过链表进行链接这些设备通过device->p中的klist_children、knode_parent实现父子设备之间的关联操作。它们的关联图如下所示。

2e4783b58350eb6be9c1eb967fd9c6bc.png
device、xxx_device、kobject、sysfs之间的关联

在之前我们介绍driver模块的时候,我们也说过driver模块一般嵌入到更大的结构体中xxx_driver,实现具体类型驱动相关结构体的成员。针对device也是一样,一般也是嵌入到更大的结构体中(此处我们命名为xxx_device,如spi_device、pci_dev、i2c_client等)。

如下图即为这几个模块间的结构体之间的关联。我们具体以几个方面说明:

  1. 通过全局变量devices_kset,将所有创建的device变量,通过其对应的kobject链接至devices_kset中;
  2. device对应的kobject通过sysfs_dirent结构体的关联,实现为该device在sysfs文件系统下创建对应的目录、子目录、子文件等内容,同时通过kobj_type实现对该device属性的读写操作(show/store)
  3. 通过指针实现xxx_device、device之间的关联。
f953397c3236748eee1d9f9f0525a82c.png

以上即是device模块内部结构体以及device、driver、bus、kobject、sysfs之间的关联。其实针对device相关的创建以及注册,也就是建立上述所说模块间的关联(上面没有说明与class模块的关联,另外此处没有说明sysfs系统中文件是如何访问的,感兴趣的可参考该文章LINUX SYSFS文件系统分析之四 文件处理及相关系统调用分析)。

device模块初始化

由之前的分析我们知道,所有注册的设备是汇聚至devices_kset变量的list链表下的,而devices_kset是一个全局变量,因此其应该是在设备模块初始化中进行创建。下面我们来分析下device模块的初始化接口,该接口名称为devices_init,该接口主要实现如下功能(流程图如下):

  1. 调用kset_create_and_add创建kset类型的全局变量devices_kset,并在sysfs文件系统的根目录下创建devices目录,并设置其kobj_type为kset_ktype;
  2. 调用kobject_create_and_add创建kobject类型的全局变量dev_kobj,并根据对应的kobject,在sysfs文件系统的根目录下创建dev目录;
  3. 调用kobject_create_and_add在dev_kobj下创建子kobject类型的全局变量sysfs_dev_block_kobj,并根据对应的kobject,在sysfs文件系统的dev/目录下block子目录
  4. 调用kobject_create_and_add在dev_kobj下创建子kobject类型的全局变量sysfs_dev_char_kobj,并根据对应的kobject,在sysfs文件系统的dev/目录下char子目录
d1fa297279632bdfe8eff0a3e94db7a2.png

以上内容即为device模块的初始化接口,其完成创建了devices_kset,以便链接所有device的kobject,同时在sysfs文件系统下完成/dev、/dev/block、/dev/char、/devices目录。其中/dev/block、/dev/char目录下主要用于创建链接目录的,其均是链接至/devices目录下相应device。

执行完devices_init接口后,dev_kobj、sysfs_dev_block_kobj、sysfs_dev_char_kobj

这三个变量的关联如下所示。

8786abe18de3dfba0540719799290a6a.png
device的注册与注销接口分析

以上我们完成了相关结构体的介绍以及结构体之间的关联介绍,此处我们介绍device的注册与注销接口。

device注册接口device_register分析

该接口主要通过调用device_initialize、device_add接口实现device的初始化以及device的添加操作,我们下面分析下这两个接口。这三个函数的调用关系如下,可以看到设备注册的主要工作由device_add接口实现。

df0c2bb1a172dc61e3bfd9526f2bad5e.png
device_add接口分析

device_add接口实现的功能即是上述结构体之间的关联,具体内容包括:

  1. 创建device的私有变量(即device_private类型的变量,用于与bus、driver等进行关联)
  2. 设置device的名称
  3. 调用kobject_add实现在sysfs的devices目录下创建该设备对应kobject对应的目录以及kobj_type的设置等;
  4. 为设备的属性,在sysfs中创建对应的文件(属性包括该设备私有属性,该设备所属class定义的通用设备默认属性、该设备所属bus定义的通用设备默认属性);
  5. 若该设备存在设备号,则在sysfs文件系统下的/dev目录下创建与该设备的链接,并调用devtmpfs_create_mknod,为该设备创建设备文件(若devtmpfs被编译进内核的情况)。若devtmpfs未被编译进内核,则在该接口调用kobject_uevent,将该设备对应kobject添加的事件发送给应用层后,应用层的udev/mdev接收后,则会根据该设备的设备id属性,为其创建设备文件(通过mknod系统调用)
  6. 若该设备属于某一个class,则完成class与设备间的kobject的链接操作;
  7. 调用bus_add_device接口,完成设备与总线间通过内嵌链表成员与链表头的关联,同时完成设备与总线的kobject互相链接。
  8. 调用bus_probe_device,为该添加的设备,在已注册的驱动链表中进行匹配与绑定操作,这一部分的操作与上一篇介绍的driver添加时的绑定类似(不同点为driver添加时,是遍历所有已注册的设备,而device添加时,是遍历所有已注册的驱动),本章不再赘述,读者可自行跟踪代码查看。
c46c94e90f17c44ce7e88f0b6e9d07f5.png

以上即是device_add、device_register这两个接口的主要内容(电源管理等一些内容此处未做深入说明)。

device注销接口device_unregister分析

device的注销过程即是device注册的反过程,执行的操作无非是删除创建的文件及目录、取消设备驱动的绑定、取消设备与总线的关联、取消设备与class的关联等,此处不再细说。

至此完成device相关接口的分析。



推荐阅读
  • RTThread线程间通信
    线程中通信在裸机编程中,经常会使用全局变量进行功能间的通信,如某些功能可能由于一些操作而改变全局变量的值,另一个功能对此全局变量进行读取& ... [详细]
  • oracle 对硬件环境要求,Oracle 10G数据库软硬件环境的要求 ... [详细]
  • 在Ubuntu 18.04上使用Nginx搭建RTMP流媒体服务器
    本文详细介绍了如何在Ubuntu 18.04上使用Nginx和nginx-rtmp-module模块搭建RTMP流媒体服务器,包括环境搭建、配置文件修改和推流拉流操作。适用于需要搭建流媒体服务器的技术人员。 ... [详细]
  • Linux环境下MySQL的安装与配置
    本文详细介绍了在Linux系统上安装和配置MySQL的步骤,包括安装前的准备工作、下载和解压安装包、初始化数据库、配置文件编辑、启动服务以及设置开机自启动等。 ... [详细]
  • CentOS7通过RealVNC实现多人使用服务器桌面
    背景:公司研发团队通过VNC登录到CentOS服务器的桌面实现软件开发工作为防止数据外泄,需要在RealVNC设置禁止传输文件、访问粘贴板等策略过程&# ... [详细]
  • 2023年最新Linux环境下Android开发环境搭建指南
    2023年最新Linux环境下Android开发环境搭建指南,帮助Android开发者在Linux系统上快速搭建开发环境,解决常见的配置问题。 ... [详细]
  • 大华股份2013届校园招聘软件算法类试题D卷
    一、填空题(共17题,每题3分,总共51分)1.设有inta5,*b,**c,执行语句c&b,b&a后,**c的值为________答:5 ... [详细]
  • 通过网上的资料我自己的实际内核编译,我把对Linux内核编译的过程写在这里,也许对其他的Linux爱好者的编译学习有些帮助,其中很大部分是 ... [详细]
  • 协程作为一种并发设计模式,能有效简化Android平台上的异步代码处理。自Kotlin 1.3版本引入协程以来,这一特性基于其他语言的成熟理念,为开发者提供了新的工具,以增强应用的响应性和效率。 ... [详细]
  • 在 Ubuntu 22.04 LTS 上部署 Jira 敏捷项目管理工具
    Jira 敏捷项目管理工具专为软件开发团队设计,旨在以高效、有序的方式管理项目、问题和任务。该工具提供了灵活且可定制的工作流程,能够根据项目需求进行调整。本文将详细介绍如何在 Ubuntu 22.04 LTS 上安装和配置 Jira。 ... [详细]
  • C#中调用OpenCTM打开.obj三维模型文件
    nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 本文介绍了如何使用 VBScript 脚本在 IE7 上安装 Windows 序列号的方法。对于使用超级解霸的用户,如果遇到 .vbs 文件无法正常运行的问题,文中也提供了相应的解决办法。 ... [详细]
  • 本文详细探讨了Spring框架中遇到的NoSuchBeanDefinitionException异常,具体涉及com.thinkplatform.dao.UserLogDao Bean未定义的问题,并提供了相应的解决方案。 ... [详细]
  • 深入解析Linux中的slabtop命令
    本文将详细介绍如何在Linux系统中使用slabtop命令,帮助读者更好地理解和监控内核slab缓存的使用情况。通过本文的学习,您将掌握slabtop命令的基本用法及其高级功能。 ... [详细]
  • Ubuntu 环境下配置 LAMP 服务器
    本文详细介绍了如何在 Ubuntu 系统上安装和配置 LAMP(Linux、Apache、MySQL 和 PHP)服务器。包括 Apache 的安装、PHP 的配置以及 MySQL 数据库的设置,确保读者能够顺利搭建完整的 Web 开发环境。 ... [详细]
author-avatar
鹏63213
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有