Linux源码阅读笔记17-资源分配及总线系统

简介: Linux源码阅读笔记17-资源分配及总线系统

资源分配

掌握用于管理资源的数据结构和函数

资源管理

数据结构分析

Linux提供通用框架,用于在内存中构建数据结构。这些结构描述了系统中可用的资源,使得内核代码能够管理和分配资源。其中关键的数据结构resource源码如下:

  • 用于连接parentchildsibling成员规则如下:
  • 每个子节点都只有一个父节点。
  • 一个父节点可以有任意数目的子节点。
  • 同一个父节点的所有子节点,都会连接到兄弟节点链表上面。
  • 在内存中表示数据结构时,我们必须要注意几个问题:
  • 尽管每个子节点都有一个指针指向父节点,但是父节点只有一个指针指向第一个子节点。所有其他子节点都通过兄弟节点链表访问。
  • 指向父节点的指针同样可以为NULL。
请求和释放资源

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

  • 请求资源:内核提供了__request_resource函数,用于请求一个资源区域。

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

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

  • 释放资源:调用release_resource函数释放使用中的资源源码如下:

I/O内存

资源管理还有一个很重要的方面是I/O内存的分配方式,因为在所有平台上这都是与外设通信的主要办法(IA-32除外,其中I/O端口更重要)。I/O内存不仅包括与扩展设备通信直接使用的内存区域,还包括系统中可用的物理内存和ROM存储器,以及包含在资源列表中的内存(可以使用proc文件系统中的iomem文件,显示所有的I/O内存)

I/O端口

I/O端口是一种与设备和总线通信的流行方法,特别是在IA-32平台上。类似于I/O内存,按良好范例编写的驱动程序在访问所需的区域之前,相应的区域必须已经注册。糟糕的额是,处理器无法检查注册是否已经完成。

kernel/resource.c中的ioport_resource充当资源树的根节点。proc文件系统中的ioports文件可以显示已经分配的端口地址。

总线系统

内核支持大量总线,可能设计多种硬件平台,也有可能只涉及一种平台。在Linux支持的大多数体系结构上都使用了PCI总线。

驱动程序模型

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

设备表示

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

通用驱动程序模型也为了设备驱动程序单独设计一种数据结构源码如下:

总线的表示

通用驱动程序模型不仅表示了设备,还用另外一个数据结构表示了总线,定义如下:

注册过程

为了说明表示总线、设备和设备驱动程序的各个数据结构之间彼此关联,了解各种类型数据结构的注册过程是很有用处的。

注册总线----->注册设备----->注册设备驱动程序

PCI总线

PCI(Peripheral Component Interconnect),是因特尔公司开发的一种标准总线,它迅速在系统组件和体系结构厂商中确立了自身的地位,成为一种非常流行的总线。其原因不在于市场策略方面的技巧,而是因为其技术水平。

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

  • 设计目标:支持高传输带宽,以适合具有大数据流的多媒体应用;简单且易于自动化配置外设;平台独立性,即不绑定到特定的处理器类型或系统平台。
  • PCI系统布局
  • 设备标识:系统某个PCI总线上的每个设备,都由一组3个标号标识;
  • 总线编号:设备所有总线的编号,编号从0开始,PCI规范准许每个系统最多255个总线;
  • 插槽编号:总线内核的一个唯一标识编号,一个总线最多能够附接32个设备;
  • 功能编号:用于在一个扩展卡上,实现包括多个扩展设备的设备。
  • 地址空间
  • 有三个地址空间支持与PCI设备的通信;
  • IO空间通过32个比特位描述。对用于与设备通信端口地址,提供了最大4GB的空间;
  • 取决于处理器类型,数据空间由32或64个比特位描述;
  • 配置空间包含各个设备的类型和特征的详细信息;
  • 内核提供几个数据结构类型来管理系统的PCI结构。
总线的表示

在内存中,每个PCI总线都通过pci_bus数据结构的一个实例,该结构体定义如下:

设备管理

struct pci_dev是一个关键的数据结构,用于表示系统中各个PCI设备。

驱动程序函数

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

USB

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

USB四种传输模式
  1. 控制传输
  2. 块传输
  3. 中断传输
  4. 同步传输
USB子系统的主要任务
  1. 注册和管理现存的设备驱动程序;
  2. 为USB设备查找适当的驱动程序,以及初始化和配置;
  3. 在内核内存中表示设备树;
  4. 与设备通信(交换数据)
驱动源码

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

设备树的表示

下面的数据结构描述USB设备书以及内核中各种设备特征


相关文章
|
5月前
|
Ubuntu Linux Anolis
Linux系统禁用swap
本文介绍了在新版本Linux系统(如Ubuntu 20.04+、CentOS Stream、openEuler等)中禁用swap的两种方法。传统通过注释/etc/fstab中swap行的方式已失效,现需使用systemd管理swap.target服务或在/etc/fstab中添加noauto参数实现禁用。方法1通过屏蔽swap.target适用于新版系统,方法2通过修改fstab挂载选项更通用,兼容所有系统。
456 3
Linux系统禁用swap
|
5月前
|
Linux
Linux系统修改网卡名为eth0、eth1
在Linux系统中,可通过修改GRUB配置和创建Udev规则或使用systemd链接文件,将网卡名改为`eth0`、`eth1`等传统命名方式,适用于多种发行版并支持多网卡配置。
971 3
|
6月前
|
Ubuntu Linux
计算机基础知识:linux系统怎么安装?
在虚拟机软件中创建一个新的虚拟机,并选择相应操作系统类型和硬盘空间大小等参数。将下载的 ISO 镜像文件加载到虚拟机中。启动虚拟机,进入安装界面,并按照步骤进行安装。安装完成后,可以在虚拟机中使用 Linux 系统。
|
6月前
|
存储 Ubuntu Linux
「正点原子Linux连载」第二章Ubuntu系统入门
在图2.8.2.4中,我们使用命令umount卸载了U盘,卸载以后当我们再去访问文件夹/mnt/tmp的时候发现里面没有任何文件了,说明我们卸载成功了。
|
Ubuntu Linux 网络安全
Linux系统初始化脚本
一款支持Rocky、CentOS、Ubuntu、Debian、openEuler等主流Linux发行版的系统初始化Shell脚本,涵盖网络配置、主机名设置、镜像源更换、安全加固等多项功能,适配单/双网卡环境,支持UEFI引导,提供多版本下载与持续更新。
558 0
Linux系统初始化脚本
|
6月前
|
运维 Linux 开发者
Linux系统中使用Python的ping3库进行网络连通性测试
以上步骤展示了如何利用 Python 的 `ping3` 库来检测网络连通性,并且提供了基本错误处理方法以确保程序能够优雅地处理各种意外情形。通过简洁明快、易读易懂、实操性强等特点使得该方法非常适合开发者或系统管理员快速集成至自动化工具链之内进行日常运维任务之需求满足。
406 18
|
5月前
|
安全 Linux Shell
Linux系统提权方式全面总结:从基础到高级攻防技术
本文全面总结Linux系统提权技术,涵盖权限体系、配置错误、漏洞利用、密码攻击等方法,帮助安全研究人员掌握攻防技术,提升系统防护能力。
505 1
|
5月前
|
监控 安全 Linux
Linux系统提权之计划任务(Cron Jobs)提权
在Linux系统中,计划任务(Cron Jobs)常用于定时执行脚本或命令。若配置不当,攻击者可利用其提权至root权限。常见漏洞包括可写的Cron脚本、目录、通配符注入及PATH变量劫持。攻击者通过修改脚本、创建恶意任务或注入命令实现提权。系统管理员应遵循最小权限原则、使用绝对路径、避免通配符、设置安全PATH并定期审计,以防范此类攻击。
1160 1
|
6月前
|
缓存 监控 Linux
Linux系统清理缓存(buff/cache)的有效方法。
总结而言,在大多数情形下你不必担心Linux中buffer与cache占用过多内存在影响到其他程序运行;因为当程序请求更多内存在没有足够可用资源时,Linux会自行调整其占有量。只有当你明确知道当前环境与需求并希望立即回收这部分资源给即将运行重负载任务之前才考虑上述方法去主动干预。
1916 10
|
6月前
|
安全 Linux 数据安全/隐私保护
为Linux系统的普通账户授予sudo访问权限的过程
完成上述步骤后,你提升的用户就能够使用 `sudo`命令来执行管理员级别的操作,而无需切换到root用户。这是一种更加安全和便捷的权限管理方式,因为它能够留下完整的权限使用记录,并以最小权限的方式工作。需要注意的是,随意授予sudo权限可能会使系统暴露在风险之中,尤其是在用户不了解其所执行命令可能带来的后果的情况下。所以在配置sudo权限时,必须谨慎行事。
995 0