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是否有自定义获取用户信息填充用户的方法...

使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...

页面渲染流程与性能优化
页面渲染流程与性能优化详解(完整版) 一、现代浏览器渲染流程(详细说明) 1. 构建DOM树 浏览器接收到HTML文档后,会逐步解析并构建DOM(Document Object Model)树。具体过程如下: (…...
Python爬虫(二):爬虫完整流程
爬虫完整流程详解(7大核心步骤实战技巧) 一、爬虫完整工作流程 以下是爬虫开发的完整流程,我将结合具体技术点和实战经验展开说明: 1. 目标分析与前期准备 网站技术分析: 使用浏览器开发者工具(F12&…...

ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
高防服务器能够抵御哪些网络攻击呢?
高防服务器作为一种有着高度防御能力的服务器,可以帮助网站应对分布式拒绝服务攻击,有效识别和清理一些恶意的网络流量,为用户提供安全且稳定的网络环境,那么,高防服务器一般都可以抵御哪些网络攻击呢?下面…...

【JavaWeb】Docker项目部署
引言 之前学习了Linux操作系统的常见命令,在Linux上安装软件,以及如何在Linux上部署一个单体项目,大多数同学都会有相同的感受,那就是麻烦。 核心体现在三点: 命令太多了,记不住 软件安装包名字复杂&…...

Maven 概述、安装、配置、仓库、私服详解
目录 1、Maven 概述 1.1 Maven 的定义 1.2 Maven 解决的问题 1.3 Maven 的核心特性与优势 2、Maven 安装 2.1 下载 Maven 2.2 安装配置 Maven 2.3 测试安装 2.4 修改 Maven 本地仓库的默认路径 3、Maven 配置 3.1 配置本地仓库 3.2 配置 JDK 3.3 IDEA 配置本地 Ma…...

GC1808高性能24位立体声音频ADC芯片解析
1. 芯片概述 GC1808是一款24位立体声音频模数转换器(ADC),支持8kHz~96kHz采样率,集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器,适用于高保真音频采集场景。 2. 核心特性 高精度:24位分辨率,…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...