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提供通用的构架,用于在内存中构建数据结构。这些结构描述了系统中可用的资源,使得内核代码能够管理和分配资源。 其中关键的数据结构resource如下: 用于连接parent, child, sibling成员规则如下: 1、每个子结点只…...
C# POST请求 各种实现方法梳理
目录 1.首先是基础的参数 2.使用RestClient 3.使用封装库 4.使用微软原生库进行请求 5.使用HttpClient进行请求 C#代码中,实现Http/Https 中的POST请求,可以有很多种方式,下面就梳理下我常用的几种方式,给大家借鉴 1.首先…...

《MySQL数据库》数据导入、导出、表处理—/—<4>
一、插入数据 1、可使用外部工具navicat导入数据的情况下 因为部分公司不允许使用外部工具去导入数据 对于大批量数据,除了上节课中使用导入向导插入数据,也可在vscode中打开csv文件,然后选中光标,长按shiftctrl,拖动…...

Java I/O (Input/Output)——文件字节流
博客主页:誓则盟约系列专栏:Java SE 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ Java I/O 简介 Java I/O(输入/输出)是 Java 程序中…...
VisionPro二次开发学习笔记4-使用C#创建绘图图形
VisionPro提供了许多可以添加到CogDisplay的基本形状,例如CogCircle,CogRectangle,CogEllipse和CogRectangleAffine。这些形状可以是用户可以用鼠标操作的交互式图形,也可以是用户无法更改的静态形状。 若要在CogDisplay控件上绘…...
【langchain学习】使用JsonOutputParser让大模型生成结构化JSON数据
使用Langchain处理结构化数据,以JsonOutputParser为例。以下是具体步骤和代码示例: 导入所需库: 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总结 前言 通过模型算法,熟练对Matlab和python的应用。 学习视频链接: https://www.bilibili.com/video/BV1EK41187…...
基于SpringBoot的Redis开发实战教程
配置和集成缓存涉及多个步骤,从选择适当的缓存技术到实现缓存的存取操作。以下是具体的步骤和示例,假设我们使用Redis作为缓存工具,并基于Spring Boot进行开发。 1. 选择和配置缓存技术 a. 选择缓存工具 Redis 是一个流行的内存数据结构存…...
mysql 分区操作
1。新建分区 mysql 没有全局唯一索引,因此所有涉及唯一索引的都需要加上分区键,因此要做好权衡,键分区不一定能提高效率哦,建分区的主要目的是为了分区查询和删除数据 --将CREATE_TIME 加入主键 ALTER TABLE your_table DROP PR…...

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

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

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

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

LLC数字控制TMS320F28034,4-DSP的epwm配置介绍
LLC数字控制TMS320F28034,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 概述:与关系型数据库不同,MongoDB 的数据以类似于 JSON 格式的二进制文档存储,通常称这种格式为Bson,Bson不仅支持JSON中已有的数据类型,还增加了一些额外的数据类型,例如日期和二进制数据&a…...

vlunstack-2(复现红日安全-ATT CK实战)
环境搭建 配置信息 DC IP:10.10.10.10 OS:Windows 2012(64) 应用:AD域 WEB IP1:10.10.10.80 IP2:192.168.47.131 OS:Windows 2008(64) 应用:Weblogic 10.3.6MSSQL 2008 PC IP1:10.10…...

【生信入门】预览快速体验Linux-重生之小明闯Linux
生信少走弯路,快试试生信云专用服务器。新用户注册免费体验5小时。https://www.tebteb.cc 一.故事 小明的Linux冒险 在一片混沌的黑暗中,小明睁开了眼睛。他感到头痛欲裂,四周一片漆黑,只有一行闪烁的字符映入眼帘: [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的缩写,意为开放式系统互联。各个层次的划分遵循以下原则: 1. 同一层的各网络节点都有相同的层次结构,具有同样的功能; 2. 同一节点的内相邻层之间通过接口进行通信&…...

Error updating database. Cause: org.apache.shiro.UnavailableSecurity
mybtisplus查看MetaObjectHandler是否有自定义获取用户信息填充用户的方法...
后进先出(LIFO)详解
LIFO 是 Last In, First Out 的缩写,中文译为后进先出。这是一种数据结构的工作原则,类似于一摞盘子或一叠书本: 最后放进去的元素最先出来 -想象往筒状容器里放盘子: (1)你放进的最后一个盘子(…...

Ascend NPU上适配Step-Audio模型
1 概述 1.1 简述 Step-Audio 是业界首个集语音理解与生成控制一体化的产品级开源实时语音对话系统,支持多语言对话(如 中文,英文,日语),语音情感(如 开心,悲伤)&#x…...

Unsafe Fileupload篇补充-木马的详细教程与木马分享(中国蚁剑方式)
在之前的皮卡丘靶场第九期Unsafe Fileupload篇中我们学习了木马的原理并且学了一个简单的木马文件 本期内容是为了更好的为大家解释木马(服务器方面的)的原理,连接,以及各种木马及连接工具的分享 文件木马:https://w…...

安宝特方案丨船舶智造的“AR+AI+作业标准化管理解决方案”(装配)
船舶制造装配管理现状:装配工作依赖人工经验,装配工人凭借长期实践积累的操作技巧完成零部件组装。企业通常制定了装配作业指导书,但在实际执行中,工人对指导书的理解和遵循程度参差不齐。 船舶装配过程中的挑战与需求 挑战 (1…...

浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...

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

vulnyx Blogger writeup
信息收集 arp-scan nmap 获取userFlag 上web看看 一个默认的页面,gobuster扫一下目录 可以看到扫出的目录中得到了一个有价值的目录/wordpress,说明目标所使用的cms是wordpress,访问http://192.168.43.213/wordpress/然后查看源码能看到 这…...

Unity UGUI Button事件流程
场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...
嵌入式常见 CPU 架构
架构类型架构厂商芯片厂商典型芯片特点与应用场景PICRISC (8/16 位)MicrochipMicrochipPIC16F877A、PIC18F4550简化指令集,单周期执行;低功耗、CIP 独立外设;用于家电、小电机控制、安防面板等嵌入式场景8051CISC (8 位)Intel(原始…...
二维FDTD算法仿真
二维FDTD算法仿真,并带完全匹配层,输入波形为高斯波、平面波 FDTD_二维/FDTD.zip , 6075 FDTD_二维/FDTD_31.m , 1029 FDTD_二维/FDTD_32.m , 2806 FDTD_二维/FDTD_33.m , 3782 FDTD_二维/FDTD_34.m , 4182 FDTD_二维/FDTD_35.m , 4793...