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

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

资源管理

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-总线-设备-驱动

相关文章:

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

资源管理 Linux提供通用的构架&#xff0c;用于在内存中构建数据结构。这些结构描述了系统中可用的资源&#xff0c;使得内核代码能够管理和分配资源。 其中关键的数据结构resource如下&#xff1a; 用于连接parent, child, sibling成员规则如下&#xff1a; 1、每个子结点只…...

C# POST请求 各种实现方法梳理

目录 1.首先是基础的参数 2.使用RestClient 3.使用封装库 4.使用微软原生库进行请求 5.使用HttpClient进行请求 C#代码中&#xff0c;实现Http/Https 中的POST请求&#xff0c;可以有很多种方式&#xff0c;下面就梳理下我常用的几种方式&#xff0c;给大家借鉴 1.首先…...

《MySQL数据库》数据导入、导出、表处理—/—<4>

一、插入数据 1、可使用外部工具navicat导入数据的情况下 因为部分公司不允许使用外部工具去导入数据 对于大批量数据&#xff0c;除了上节课中使用导入向导插入数据&#xff0c;也可在vscode中打开csv文件&#xff0c;然后选中光标&#xff0c;长按shiftctrl&#xff0c;拖动…...

Java I/O (Input/Output)——文件字节流

博客主页&#xff1a;誓则盟约系列专栏&#xff1a;Java SE 专栏关注博主&#xff0c;后期持续更新系列文章如果有错误感谢请大家批评指出&#xff0c;及时修改感谢大家点赞&#x1f44d;收藏⭐评论✍ Java I/O 简介 Java I/O&#xff08;输入/输出&#xff09;是 Java 程序中…...

VisionPro二次开发学习笔记4-使用C#创建绘图图形

VisionPro提供了许多可以添加到CogDisplay的基本形状&#xff0c;例如CogCircle&#xff0c;CogRectangle&#xff0c;CogEllipse和CogRectangleAffine。这些形状可以是用户可以用鼠标操作的交互式图形&#xff0c;也可以是用户无法更改的静态形状。 若要在CogDisplay控件上绘…...

【langchain学习】使用JsonOutputParser让大模型生成结构化JSON数据

使用Langchain处理结构化数据&#xff0c;以JsonOutputParser为例。以下是具体步骤和代码示例&#xff1a; 导入所需库&#xff1a; from config import llm from langchain_core.output_parsers import JsonOutputParser from langchain_core.prompts import PromptTemplate f…...

【学习笔记】Matlab和python双语言的学习(最大最小化规划)

文章目录 前言一、最大最小化规划二、选址问题三、代码实现----Matlab1.Matlab 的 fminimax 函数2.Matlab 代码 四、代码实现----python总结 前言 通过模型算法&#xff0c;熟练对Matlab和python的应用。 学习视频链接&#xff1a; https://www.bilibili.com/video/BV1EK41187…...

基于SpringBoot的Redis开发实战教程

配置和集成缓存涉及多个步骤&#xff0c;从选择适当的缓存技术到实现缓存的存取操作。以下是具体的步骤和示例&#xff0c;假设我们使用Redis作为缓存工具&#xff0c;并基于Spring Boot进行开发。 1. 选择和配置缓存技术 a. 选择缓存工具 Redis 是一个流行的内存数据结构存…...

mysql 分区操作

1。新建分区 mysql 没有全局唯一索引&#xff0c;因此所有涉及唯一索引的都需要加上分区键&#xff0c;因此要做好权衡&#xff0c;键分区不一定能提高效率哦&#xff0c;建分区的主要目的是为了分区查询和删除数据 --将CREATE_TIME 加入主键 ALTER TABLE your_table DROP PR…...

[网鼎杯 2018]Comment

使用环境为https://adworld.xctf.org.cn/challenges&#xff0c;搜索题目[网鼎杯 2018]Comment。 进入环境&#xff0c;发现为一个留言板&#xff0c;点击发帖试试。 尝试发帖 跳转到登录页面&#xff0c;根据提示使用burp进行暴力破解。 发现payload为666时状态码不同。 尝试…...

LVS详解

目录 一、LVS简介 LVS 官网: 二、LVS 负载均衡模式 2.1 LVS-NAT模式&#xff1a; 2.1.1 简介 2.1.2 工作流程图&#xff1a; 2.1.3 说明&#xff1a; 2.1.4 LVS-NAT的优缺点&#xff1a; 2.2 LVS-DR模式&#xff1a; 2.2.1 简介 2.2.2 工作原理&#xff1a; 2.2.3 工作…...

Yolo-World初步使用

Yolo v8目前已经支持Yolo-World&#xff0c;整理一下初步使用步骤。 使用步骤 1 先下载Yolo-World的pt文件&#xff0c;下载地址&#xff1a;GitHub - AILab-CVC/YOLO-World: [CVPR 2024] Real-Time Open-Vocabulary Object Detection 官网应该是点这里&#xff08;有个笑脸…...

Navicat Premium使用

文章目录 Navicat Premium 16的使用连接MySQL建立数据库并构建表导入数据 Navicat Premium 16是一款功能强大的数据库管理工具&#xff0c;它允许用户从单一应用程序中同时连接多种数据库&#xff0c;提供了极其便捷和高效的管理和开发环境&#xff0c;对于 MySQL 用户来说&…...

LLC数字控制TMS320F28034,4-DSP的epwm配置介绍

LLC数字控制TMS320F28034&#xff0c;4-DSP的epwm配置介绍 1 TMS320F280341.1 概述1.2 PWM详细介绍 2 TMS320F28034 PWM功能框图2.1 ePWM功能模块2.2 ePWM功能寄存器框图 3 TMS320F28034 PWM初始化流程4 结合项目设计5 代码设计5.1 PWM初始化程序5.2 工程代码 6 总结 配套代码示…...

MongoDB学习记录

1、初识Mongo 概述&#xff1a;与关系型数据库不同&#xff0c;MongoDB 的数据以类似于 JSON 格式的二进制文档存储&#xff0c;通常称这种格式为Bson&#xff0c;Bson不仅支持JSON中已有的数据类型&#xff0c;还增加了一些额外的数据类型&#xff0c;例如日期和二进制数据&a…...

vlunstack-2(复现红日安全-ATT CK实战)

环境搭建 配置信息 DC IP&#xff1a;10.10.10.10 OS&#xff1a;Windows 2012(64) 应用&#xff1a;AD域 WEB IP1&#xff1a;10.10.10.80 IP2&#xff1a;192.168.47.131 OS&#xff1a;Windows 2008(64) 应用&#xff1a;Weblogic 10.3.6MSSQL 2008 PC IP1&#xff1a;10.10…...

【生信入门】预览快速体验Linux-重生之小明闯Linux

生信少走弯路,快试试生信云专用服务器。新用户注册免费体验5小时。https://www.tebteb.cc 一.故事 小明的Linux冒险 在一片混沌的黑暗中&#xff0c;小明睁开了眼睛。他感到头痛欲裂&#xff0c;四周一片漆黑&#xff0c;只有一行闪烁的字符映入眼帘&#xff1a; [xiaomingu…...

用.net core简易搭建webapi托管到IIS

1、从官网下载.NET Core 托管捆绑包 https://learn.microsoft.com/zh-cn/aspnet/core/tutorials/publish-to-iis?viewaspnetcore-8.0&tabsvisual-studio 2、新建ASP.NET Core WEB API项目 新建控制器TestController并生成GetInfo方法 3、发布 目标路径选择 2)显示所有…...

【计算机网络---OSI七层模型】

一、OSI的基本概念及原则 OSI是Open System Interconnect的缩写&#xff0c;意为开放式系统互联。各个层次的划分遵循以下原则&#xff1a; 1. 同一层的各网络节点都有相同的层次结构&#xff0c;具有同样的功能&#xff1b; 2. 同一节点的内相邻层之间通过接口进行通信&…...

Error updating database. Cause: org.apache.shiro.UnavailableSecurity

mybtisplus查看MetaObjectHandler是否有自定义获取用户信息填充用户的方法...

python/java环境配置

环境变量放一起 python&#xff1a; 1.首先下载Python Python下载地址&#xff1a;Download Python | Python.org downloads ---windows -- 64 2.安装Python 下面两个&#xff0c;然后自定义&#xff0c;全选 可以把前4个选上 3.环境配置 1&#xff09;搜高级系统设置 2…...

线程同步:确保多线程程序的安全与高效!

全文目录&#xff1a; 开篇语前序前言第一部分&#xff1a;线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分&#xff1a;synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分&#xff…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

3-11单元格区域边界定位(End属性)学习笔记

返回一个Range 对象&#xff0c;只读。该对象代表包含源区域的区域上端下端左端右端的最后一个单元格。等同于按键 End 向上键(End(xlUp))、End向下键(End(xlDown))、End向左键(End(xlToLeft)End向右键(End(xlToRight)) 注意&#xff1a;它移动的位置必须是相连的有内容的单元格…...

面向无人机海岸带生态系统监测的语义分割基准数据集

描述&#xff1a;海岸带生态系统的监测是维护生态平衡和可持续发展的重要任务。语义分割技术在遥感影像中的应用为海岸带生态系统的精准监测提供了有效手段。然而&#xff0c;目前该领域仍面临一个挑战&#xff0c;即缺乏公开的专门面向海岸带生态系统的语义分割基准数据集。受…...

力扣热题100 k个一组反转链表题解

题目: 代码: func reverseKGroup(head *ListNode, k int) *ListNode {cur : headfor i : 0; i < k; i {if cur nil {return head}cur cur.Next}newHead : reverse(head, cur)head.Next reverseKGroup(cur, k)return newHead }func reverse(start, end *ListNode) *ListN…...

Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?

Pod IP 的本质与特性 Pod IP 的定位 纯端点地址&#xff1a;Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址&#xff08;如 10.244.1.2&#xff09;无特殊名称&#xff1a;在 Kubernetes 中&#xff0c;它通常被称为 “Pod IP” 或 “容器 IP”生命周期&#xff1a;与 Pod …...

论文阅读:LLM4Drive: A Survey of Large Language Models for Autonomous Driving

地址&#xff1a;LLM4Drive: A Survey of Large Language Models for Autonomous Driving 摘要翻译 自动驾驶技术作为推动交通和城市出行变革的催化剂&#xff0c;正从基于规则的系统向数据驱动策略转变。传统的模块化系统受限于级联模块间的累积误差和缺乏灵活性的预设规则。…...

深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向

在人工智能技术呈指数级发展的当下&#xff0c;大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性&#xff0c;吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型&#xff0c;成为释放其巨大潜力的关键所在&…...

k8s从入门到放弃之HPA控制器

k8s从入门到放弃之HPA控制器 Kubernetes中的Horizontal Pod Autoscaler (HPA)控制器是一种用于自动扩展部署、副本集或复制控制器中Pod数量的机制。它可以根据观察到的CPU利用率&#xff08;或其他自定义指标&#xff09;来调整这些对象的规模&#xff0c;从而帮助应用程序在负…...