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设备书以及内核中各种设备特征


相关文章
|
22天前
|
Linux
Linux系统之expr命令的基本使用
【10月更文挑战第18天】Linux系统之expr命令的基本使用
69 4
|
11天前
|
Linux 应用服务中间件 Shell
linux系统服务二!
本文详细介绍了Linux系统的启动流程,包括CentOS 7的具体启动步骤,从BIOS自检到加载内核、启动systemd程序等。同时,文章还对比了CentOS 6和CentOS 7的启动流程,分析了启动过程中的耗时情况。接着,文章讲解了Linux的运行级别及其管理命令,systemd的基本概念、优势及常用命令,并提供了自定义systemd启动文件的示例。最后,文章介绍了单用户模式和救援模式的使用方法,包括如何找回忘记的密码和修复启动故障。
32 5
linux系统服务二!
|
11天前
|
Linux 应用服务中间件 Shell
linux系统服务!!!
本文详细介绍了Linux系统(以CentOS7为例)的启动流程,包括BIOS自检、读取MBR信息、加载Grub菜单、加载内核及驱动程序、启动systemd程序加载必要文件等五个主要步骤。同时,文章还对比了CentOS6和CentOS7的启动流程图,并分析了启动流程的耗时。此外,文中还讲解了Linux的运行级别、systemd的基本概念及其优势,以及如何使用systemd管理服务。最后,文章提供了单用户模式和救援模式的实战案例,帮助读者理解如何在系统启动出现问题时进行修复。
32 3
linux系统服务!!!
|
19天前
|
Web App开发 搜索推荐 Unix
Linux系统之MobaXterm远程连接centos的GNOME桌面环境
【10月更文挑战第21天】Linux系统之MobaXterm远程连接centos的GNOME桌面环境
159 4
Linux系统之MobaXterm远程连接centos的GNOME桌面环境
|
21天前
|
Linux 测试技术 网络安全
Linux系统之安装OneNav个人书签管理器
【10月更文挑战第19天】Linux系统之安装OneNav个人书签管理器
40 5
Linux系统之安装OneNav个人书签管理器
|
20天前
|
运维 监控 Linux
Linux系统之部署Linux管理面板1Panel
【10月更文挑战第20天】Linux系统之部署Linux管理面板1Panel
66 3
Linux系统之部署Linux管理面板1Panel
|
2天前
|
Linux
在 Linux 系统中,“cd”命令用于切换当前工作目录
在 Linux 系统中,“cd”命令用于切换当前工作目录。本文详细介绍了“cd”命令的基本用法和常见技巧,包括使用“.”、“..”、“~”、绝对路径和相对路径,以及快速切换到上一次工作目录等。此外,还探讨了高级技巧,如使用通配符、结合其他命令、在脚本中使用,以及实际应用案例,帮助读者提高工作效率。
10 3
|
2天前
|
安全 网络协议 Linux
本文详细介绍了 Linux 系统中 ping 命令的使用方法和技巧,涵盖基本用法、高级用法、实际应用案例及注意事项。
本文详细介绍了 Linux 系统中 ping 命令的使用方法和技巧,涵盖基本用法、高级用法、实际应用案例及注意事项。通过掌握 ping 命令,读者可以轻松测试网络连通性、诊断网络问题并提升网络管理能力。
9 3
|
5天前
|
安全 Linux 数据安全/隐私保护
在 Linux 系统中,查找文件所有者是系统管理和安全审计的重要技能。
在 Linux 系统中,查找文件所有者是系统管理和安全审计的重要技能。本文介绍了使用 `ls -l` 和 `stat` 命令查找文件所有者的基本方法,以及通过文件路径、通配符和结合其他命令的高级技巧。还提供了实际案例分析和注意事项,帮助读者更好地掌握这一操作。
15 6
|
2天前
|
监控 安全 Linux
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景
在 Linux 系统中,网络管理是重要任务。本文介绍了常用的网络命令及其适用场景,包括 ping(测试连通性)、traceroute(跟踪路由路径)、netstat(显示网络连接信息)、nmap(网络扫描)、ifconfig 和 ip(网络接口配置)。掌握这些命令有助于高效诊断和解决网络问题,保障网络稳定运行。
10 2