Linux 内核源码分析---资源分配及系统总线

news2024/9/22 9:56:52

资源管理

Linux提供通用的构架,用于在内存中构建数据结构。这些结构描述了系统中可用的资源,使得内核代码能够管理和分配资源。
其中关键的数据结构resource如下:
在这里插入图片描述
在这里插入图片描述
用于连接parent, child, sibling成员规则如下:
1、每个子结点只有一个父结点;
2、一个父结点可以有任意数目的子结点;
3、同一个父结点的所有子结点,会连接到兄弟结点链表上面。

在内存中表示数据结构时,必须要注意几个问题:
1、尽管每个子结点都有一个指针指向父结点,但父结点只有一个指针指向第一个子结点所有其它子结点都通过兄弟结点链表访问
2、指向父结点的指针同样可以为NULL。

为确保可靠地配置资源(无论何种类型),内核必须提供一种机制来分配和释放资源。一旦资源已经分配,则不能由任何其他驱动程序使用。

请求资源:内核提供了__request_resource函数,用于请求一个资源区域。
在这里插入图片描述
该函数用于分配 reqeust 实例,在此函数当中也会进行检査(起始地址大于结束地址,请求无法使用),则放弃操作。
request_resource这个函数负责必要的锁操作,主要工作还是由 __request_resource。它连接地扫描现存的资源,将新资源添加到正确的位置,或发现与已经分配区域的冲突。完成所有操作之后,需要遍历兄弟结点的链表。如果所需的资源区域是空闲的,则插入新的 resource实例,这样就可以完成资源分析。如果区域不是空闲的,则分配失败。

在扫描特定父结点的子结点时,只会在一个层次上扫描兄弟结点链表。内核不会扫描更底层子结点的链表。

释放资源:调用release_resource函数释放使用中的资源。
在这里插入图片描述

在这里插入图片描述

I/O 内存

资源管理还有一个很重要的方面是 I/O 内存的分配方式,因为在所有平台上这都是与外设通信的主要方法( IA-32除外,其中 I/O 端口更为重要)。
所有分配的I/O内存地址,它们都要通过一棵资源树管理,树的根结点是全局内核变量iomem_resource
I/O 内存不仅包括与扩展设备通信直接使用的内存区域,还包括系统中可用的物理内存和 ROM 存储器,以及包含在资源列表中的内存(可以使用 proc 文件系统中的 iomem 文件,显示所有的 I/O 内存)。
在这里插入图片描述
使用 I/O 内存时,分配内存区域并不是所需唯一操作。主要取决于总线系统和处理器类型,可能必需将扩展设备的地址空间映射到内核地址空间之后,才可以访问此设备(称为软件 I/O 映射)。这是通过使用ioremap内核函数适当设备系统页表而实现的。同样也可以使用体系结构当中的iounmap函数解除映射操作。

将一个物理地址映射到处理器的虚拟地址空间中,使得内核可以使用该地址,就设备驱动程序而言,意味着扩展总线的地址空间映射到 CPU 的地址空间中,使得能够用普通内存访问函数来操作总线/设备。

I/O 端口

I/O 端口是一种与设备和总线通信的流行方法,特别是在IA-32平台上。类似于I/O内存,按良好范例编写的驱动程序在访问所需的区域之前,相应的区域必须已经注册。糟糕的是,处理器无法检查注册是否已经完成。
kernel/resource.c 中的 ioport_resource 充当资源树的根结点。 proc 文件系统中的 ioports 文件可以显示已经分配的端口地址。
在这里插入图片描述

总线系统

现代总线系统在布局和结构的细节上可能有所不同,但也有许多共同之处,内核的数据结构即反映了这个事实。结构中的许多成员用于所有的总线(以及相关设备的数据结构中)。
在内核版本2.6开发期间,一个通用驱动程序模型(设备模型, device model)并入内核,以防止不必要的复制。

所有总线共有的属性封装到特殊的、可以用通用方法处理的数据结构中,再关联到总线相关的成员。

设备的表示:驱动程序模型采用一种特殊数据结构来表示几乎所有总线类型通用的设备属性。 该结构直接嵌入到特定于总线的数据结构中,而不是通过指针引用。
在这里插入图片描述
在这里插入图片描述

通用驱动程序模型也为设备驱动程序单独设计一种数据结构:
在这里插入图片描述

总线的表示:通用驱动程序模型不仅表示了设备,还用另一个数据结构表示了总线。
在这里插入图片描述

注册过程:注册总线 —> 注册设备 —> 注册设备驱动程序。

  • 注册总线
    在这里插入图片描述

  • 注册设备:初始化设备的数据结构,并将它加入到数据结构的网络当中。
    在这里插入图片描述

  • 注册设备驱动程序:在进行一些检查和初始化工作之后,driver_register 调用bus_add_driver将一个新驱动程序添加到一个总线来,驱动程序要有名字,然后注册到通用数据结构框架。
    在这里插入图片描述
    如果总线支持自动探测,调用driver_attach,该函数迭代总线上所有设备,使用驱动程序的match函数进行检测,确定是否有某些设备可使用该驱动程序管理。最后将该驱动程序添加到总线上注册的所有驱动程序的链表中。
    在这里插入图片描述

PCI 总线

PCI 是 peripheral component interconnect 的缩写,是英特尔公司开发的一种标准总线。

  • 设计目标
    1.支持高传输带宽,以适合具有大数据流的多媒体应用;
    2.简单且易于自动化配置外设;
    3.平台独立性,即不绑定到特定的处理器类型或系统平台,

  • PCI系统布局
    1.设备标识:系统某个 PCI 总线上的每个设备,都由一组 3 个编号标识;
    2.总线编号:设备所有总线的编号,编号从 0 开始,PCI 规范准许每个系统最多 255 个总线;
    3.插槽编号:总线内核的一个唯一标识编号,一个总线最多能够附接 32 个设备;
    4.功能编号:用于在一个扩展卡上,实现包括多个扩展设备的设备。

  • 地址空间
    有 3 个地址空间支持与 PCI 设备的通信;
    I/O 空间通过 32 个比特位描述。对用于与设备通信端口地址,提供了最大 4GB 空间;
    取决于处理器类型,数据空间由 32 或 64 个比特位描述;
    配置空间包含各个设备的类型和特征的详细信息;
    内核提供几个数据结构类型来管理系统的 PCI 结构。

Linux内核提供了几个数据结构来管理系统的PCI结构。这些结构声明在<pci.h>中,通过一个由指针构成的网络互相连接。

  • 总线的表示:在内存中,每个PCI总线都通过pci_bus数据结构的一个实例表示;在这里插入图片描述

  • 设备管理struct pci_dev 是一个关键的数据结构,用于表示系统中的各个PCI设备。
    在这里插入图片描述

  • 驱动程序函数:PCI 层中最后一个基本的数据结构是 pci_driver。它用于实现 PCI 驱动程序,表示了通用内核代码和设备的底层硬件驱动程序之间的接口
    在这里插入图片描述
    每个 PCI 驱动程序都必须将其函数填到该接口中,使得内核能够一致地控制可用的驱动程序。PCI 驱动程序通过 pci_register_driver 注册:
    在这里插入图片描述

USB 总线

USB( Universal Serial Bus,通用串行总线)是一种外部总线,用于满足不断发展的PC的需求,并用于建立针对新类型计算机的解决方案,如手持设备、PDA等。
作为一种通用的外部总线,在用于连接中低数据传输速率的设备时(如鼠标、网络摄像头、键盘),USB 很有优势。但带宽要求更高的设备如外部硬盘、光驱、 CD 刻录机也可以通过USB 总线运行。
USB 1.1的最大传输速率限于12 兆比特/秒,该标准的2.0版本最高速率提升到 480 兆比特/秒。

所有USB设备都划分到不同类型当中,在内核源代码中,我们可以看到这样划分,各个驱动程序源代码按照所属类型归纳到不同的目录:
在这里插入图片描述

USB标准定义 4 种不同传输模式:控制传输、块传输、中断传输及同步传输;

USB子系统有4种主要任务:
(1)注册和管理现存的设备驱动程序
(2)为USB设备查找适当的驱动程序,以及初始化和配置;
(3)在内核内存中表示设备树;
(4)与设备通信(交换数据);

usb_driver 是 USB 设备驱动程序和内核其余部分(特别是USB层)之间协作的起始点。

USB 驱动
在这里插入图片描述

设备树的表示:下面的数据结构描述USB设备树以及内核中各种设备的特征。
在这里插入图片描述

【linux】驱动-6-总线-设备-驱动

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

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

相关文章

接口测试学习笔记1

一、行业背景和测试分层 1、招聘需求 1&#xff09;手工测试&#xff1a;业务需求、业务逻辑 2&#xff09;自动化测试&#xff1a;业务逻辑 技术规范 功能自动化 QTP、Selenium 性能自动化 LoadRunner、JMeter 接口自动化 Postman、Fiddler、JMeter、SoapUI... …

值得一读!六本网络安全学习必备书籍推荐

在网络安全领域不断发展的今天&#xff0c;深入学习和掌握相关知识显得尤为重要。以下为大家推荐六本有助于提升网络安全技能的经典书籍。 一、《白帽子讲 Web 安全》 这本书由吴翰清撰写&#xff0c;涵盖了 Web 安全的诸多方面&#xff0c;包括常见的攻击手段、防御方法以及安…

XML 学习笔记

简介&#xff1a; &#xff08;1&#xff09;XML&#xff1a;可扩展性标记语言&#xff0c;用于传输和存储数据&#xff0c;而不是展示数据&#xff0c;是W3C 推举的数据传输格式。 XML的标签必须自定义&#xff0c;但是在写标签名的时候一定要有含义。 XML 只能有一个根节点…

微积分-微分应用7(优化问题)

解决优化问题的步骤&#xff1a; 理解问题 首先要仔细阅读问题&#xff0c;直到完全理解。问问自己&#xff1a;未知数是什么&#xff1f;已知量是什么&#xff1f;给定的条件是什么&#xff1f; 画图 在大多数问题中&#xff0c;画图并在图中标出给定和所需的量是有用的。 引…

用闲置的阿里云服务器使用 NPS 实现内网穿透

最近有个项目需要给外地的同事预览一下&#xff0c;但是公司没有可以公网访问的测试服务器&#xff0c;所以想到用内网穿透的方式让外地同事可以访问到我的本机。刚好我有一台阿里云的服务器&#xff0c;双十一打折买了3年&#xff0c;1000左右&#xff0c;2核8G&#xff0c;买…

24年税务师考试补报名即将开始啦

⏰税务师补报名重要时间节点 1⃣️补报名时间&#xff1a;8月6日10:00至8月16日17:00 2⃣️补报名缴费时间&#xff1a;8月6日10:00至8月18日24&#xff1a;00 3️⃣准考证打印时间&#xff1a;10月28日10:00至11月3日15:00 4⃣️考试时间&#xff1a;11月2日、3日 ✅税务…

c#中的BitConverter的java实现

最近在做c#项目的java迁移&#xff0c;发现部分C#方法java中没有对应实现如图&#xff1a; 且java中的数字类型都是有符号的所以转无符号的时候需要进行手动对符号位& 0xFFFF进行处理&#xff0c;目前只整理了项目中使用到的方法&#xff0c;后续有用到其他方法在进行追加如…

HarmonyOS 与 OpenHarmony 的区别详解

随着科技的不断进步&#xff0c;操作系统在我们日常生活中的重要性日益凸显。华为推出的 HarmonyOS 和 OpenHarmony 正是当前备受关注的两大操作系统。它们虽然紧密相关&#xff0c;但在理念、目标和应用场景上有显著的区别。本文将详细探讨这两者的不同之处。 一、概念解析 …

C++复习的长文指南(二)

C复习的长文指南&#xff08;二&#xff09; 一、面向对象基础知识5. 文件操作5.1文本文件5.1.1写文件5.1.2读文件 5.2 二进制文件5.2.1 二进制文件5.2.2 二进制读文件 6. c面向对象的个人心得开发流程6.16.26.36.46.5注意细节6.16.26.3 二、泛型编程1. 模板1.1 模板的概念1.2 …

GRFB UNet——基于多尺度注意网络盲道检测算法实现与模型C++部署

1. 概述 盲道是视障人士安全出行的重要辅助设施。识别盲道的形状和位置&#xff0c;对于增强视障人士的自主移动能力至关重要&#xff0c;而视觉分割技术正是应对这一挑战的有效工具。为了显著提升盲道分割的精确度和稳定性&#xff0c;本文提出了一种创新的分割方法&#xff…

OpenShift 4 - 用 oc-mirror 为离线 OpenShift 集群的 Mirror Registry 同步容器镜像

《OpenShift / RHEL / DevSecOps 汇总目录》 本文适合 OpenShift 4.11 及其以上版本。 文章目录 在离线环境中用 OpenShift 准备 Mirror Registry环境说明向隔离环境复制镜像准备节点环境bastion 节点操作support 节点操作 网络完全隔离环境-复制镜像bastion 节点操作support …

[图解]掉杠·above...duty -《分析模式》漫谈20

1 00:00:01,650 --> 00:00:05,120 今天我们来说一下《分析模式》和掉杠 1 00:00:00,480 --> 00:00:02,800 还是前言这里&#xff0c;有一句话 2 00:00:02,810 --> 00:00:04,850 I will mention 3 00:00:04,860 --> 00:00:05,250 that 4 00:00:05,680 --> 00…

【Golang 面试 - 进阶题】每日 3 题(十四)

✍个人博客&#xff1a;Pandaconda-CSDN博客 &#x1f4e3;专栏地址&#xff1a;http://t.csdnimg.cn/UWz06 &#x1f4da;专栏简介&#xff1a;在这个专栏中&#xff0c;我将会分享 Golang 面试中常见的面试题给大家~ ❤️如果有收获的话&#xff0c;欢迎点赞&#x1f44d;收藏…

实战:MySQL数据同步神器之Canal

1.概叙 场景一&#xff1a;数据增量实时同步 项目中业务数据量比较大&#xff0c;每类业务表都达到千万级别&#xff0c;虽然做了分库分表&#xff0c;每张表数据控制在300W以下&#xff0c;但是效率还是达不到要求&#xff0c;为了提高查询效率&#xff0c;打算使用ES进行数…

Java面试题--JVM大厂篇之破解Java性能瓶颈!深入理解Parallel GC并优化你的应用

目录 引言&#xff1a; 正文&#xff1a; 1. 理解Parallel GC的工作原理 2. 配置Parallel GC 3. 监控和分析GC日志 4. 常见调优技巧 5. 持续迭代和优化 结束语&#xff1a; 补充考虑 1. 综合考虑吞吐量与响应时间 2. 评估和优化垃圾回收频率 3. 动态调整与自适应策…

定期自动巡检,及时发现机房运维管理中的潜在问题

随着信息化技术的迅猛发展&#xff0c;机房作为企业数据处理与存储的核心场所&#xff0c;其运维管理的复杂性和挑战性也与日俱增。为确保机房设备的稳定运行和业务的连续性&#xff0c;运维团队必须定期进行全面的巡检。然而&#xff0c;传统的手工巡检方式不仅效率低下&#…

【卷积神经网络】基于CIFAR10数据集实现图像分类【构建、训练、预测】

文章目录 1、内容简介2、CIFAR10 数据集2.1、数据集概述2.2、代码使用2.2.1、查看数据集基本信息2.2.2、数据加载器2.2.3、完整代码 3、搭建图像分类网络&#x1f53a;3.1、网络结构⭐3.2、代码构建网络⭐ 4、编写训练函数4.1、多分类交叉熵损失函数&#x1f53a;4.2、Adam&…

泛微开发修炼之旅--41Ecology基于触发器实现增量数据同步(人员、部门、岗位、人员关系表、人岗关系表)

一、需求背景 我们在项目上遇到一个需求&#xff0c;需要将组织机构数据&#xff08;包含人员信息、部门信息、分部信息、人岗关系&#xff09;生成的增量数据&#xff0c;实时同步到三方的系统中&#xff0c;三方要求&#xff0c;只需要增量数据即可。 那么基于ecology系统&a…

【C++高阶】:C++11的深度解析上

✨ 心似白云常自在&#xff0c;意如流水任东西 &#x1f30f; &#x1f4c3;个人主页&#xff1a;island1314 &#x1f525;个人专栏&#xff1a;C学习 &#x1f680; 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f4…

数说故事|引爆社媒的森贝儿IP,品牌如何实现流量变现?

以可爱、雅痞、贱萌......的外表加魔性舞姿出圈的可爱小狗——森贝儿贵宾犬Milo&#xff0c;用“可爱微怒”的表情演绎着当代打工人的“疯态”&#xff0c;并迅速晋升成不少打工人高频使用的表情包。 最近几年&#xff0c;“萌系”爆款IP频出&#xff0c;用小动物的形象、可爱…