告白网站怎么做,网站开发是怎么开发的,免费微信分销系统,wordpress经典主题选择资源管理
Linux提供通用的构架#xff0c;用于在内存中构建数据结构。这些结构描述了系统中可用的资源#xff0c;使得内核代码能够管理和分配资源。 其中关键的数据结构resource如下#xff1a; 用于连接parent, child, sibling成员规则如下#xff1a; 1、每个子结点只…资源管理
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-总线-设备-驱动