windows查看pci设备命令_windows查看pci设备命令

windows查看pci设备命令_windows查看pci设备命令Linux下PCI设备驱动开发详解(二)Linux下PCI设备驱动开发详解(二)根据上一章的概念,PCI驱动包括PCI通用的驱动,以及根据实际需要设备本身的驱动。所谓的编写设备驱动,其实就是编写设备本身驱

Linux下PCI设备驱动开发详解(二)   Linux下PCI设备驱动开发详解(二)   根据上一章的概念,PCI驱动包括PCI通用的驱动,以及根据实际需要设备本身的驱动。   所谓的编写设备驱动,其实就是编写设备本身驱动,因为linux内核的PCI驱动是内核自带的。   为了更好的学习PCI设备驱动,我们需要明白内核具体做了什么,下面我们研究一下,linux PCI通用的驱动到底做了什么?   注:代码对应的 kernel-3.10.1   一、PCI 拓扑架构   1.1 PCI的系统拓扑   在分析PCIe初始化枚举流程之前,先描述下PCIe的拓扑结构。 如下图所示:
windows查看pci设备命令_windows查看pci设备命令
windows查看pci设备命令_windows查看pci设备命令   整个PCIe是一个树形的拓扑:   1.2 PCIe的软件框架   PCIe模块涉及到的代码文件很多,在分析PCIe的代码前,先对PCIe涉及的代码梳理如下: 这里以arm架构为例,PCIe代码主要分散在3个目录:   将PCIe代码按照如下层次划分:
windows查看pci设备命令_windows查看pci设备命令
windows查看pci设备命令_windows查看pci设备命令   arch PCIe driver:放一些和架构强相关的PCIe的函数实现,对应arch/arm/xxx/pci.c   acpi PCIe driver: acpi扫描时所涉及的PCIe代码,包括host bridge的解析初始化,PCIe bus的创建,ecam的映射等,对应drivers/acpi/pci*.c   PCIe core driver:PCIe的子系统代码,包括PCIe的枚举流程,资源分配流程,中断流程等,主要对应drivers/pci/*.c   PCIe port bus driver:PCIe port的四个service代码的整合,四个service主要是指PCIe dpc/pme/aer/hp,对应drivers/pci/pcie/*   PCIe ep driver:叶子节点的设备驱动,比如显卡、网卡、NVMe;   二、Linux内核实现   PCIe的代码文件这么多,初始化涉及的调用也很多,从哪里开始看呢?   1. PCIe初始化流程   内核通过initcore的level决定模块的启动顺序:   可以看出关键symbol的调用顺序如下:
windows查看pci设备命令_windows查看pci设备命令
windows查看pci设备命令_windows查看pci设备命令   pcibus_class_init:注册pci_bus_class,完成后创建了/sys/class/pci_bus目录;   pci_driver_init:注册pci_bus_type,完成后创建了/sys/bus/pci目录;   acpi_pci_init:注册acpi_pci_bus,并设置电源管理相应的操作;   acpi_init():acpi启动所涉及到的初始化流程,PCIe基于acpi的启动流程从该接口进入;   下面对acpi_init()流程展开,主要找和PCI初始化相关的调用:   mmcfg_late_init():acpi先扫描MCFG表,MCFG表定义了ecam的相关资源;   acpi_pci_root_init():定义pcie host bridge device的attach函数,ACPI的definition block中使用PNP0A03表示一个PCI host bridge;   acpi_pci_link_init():注册pci_link_handler,主要和PCIe IRQ相关;   acpi_bus_scan():会通过acpi_walk_namespace()遍历system中所有的device,并为这些acpi device创建数据结构,执行对应device的attach函数。根据ACPI spec定义,PCIe host bridge device定义在DSDT表中,acpi在扫描中扫描DSDT,如果发现了PCIe host bridge,就会执行device对应的attach函数,调用acpi_pci_root_add();   acpi_pci_root_add():   以上流程主要是PCI设备的bdf号;   1. PCIe枚举流程   我们先看内核代码:   这个函数主要是建立ecam映射,将ecam的空间进行映射,这样cpu就可以通过内存访问到相应设备的配置空间;   pci_create_root_bus():用来创建该{segment: busnr}下的根总线。传递的参数:   NULL:host bridge设备的parent节点;   busnum:总线号;   pci_root_ops:配置空间的操作接口;   resource:私有数据,用来保存总线号,IO空间,mem空间等信息;   以下依次函数调用是:   更详细的分析请参见后面的参考资料   总的来说,枚举流程分为3步:   3. PCIe的资源分配   PCIe设备枚举完成后,PCI总线号已经分配,PCIe ecam的映射、PCIe设备信息、bar的个数以及大小等已经ready,但是此时并没有给PCI device的bar、IO、mem分配资源。   这时就需要走到PCIe的资源分配流程,整个资源分配的过程就是从系统的总资源里给每个PCI device的bar分配资源。给每个PCI桥的base、limit的寄存器分配资源。   PCIe的资源分配流程整体比较复杂,主要介绍下总体的流程,对关键的函数再做展开。   PCIe资源分配的入口在pci_acpi_scan_root()->pci_bus_assign_resources(),详细代码如下:   其中pbus_assign_resources_sorted,这个函数先对当前总线下设备请求的资源进行排序。   总而言之,PCIe的资源枚举过程可以概括为如下:   四、总结   1. 枚举过程   主要是发现设备,主要流程如下:   2. 资源分配过程   主要是管理设备,方便我们使用设备,主要流程如下:   五、未完待续   Linux下PCI设备驱动开发详解(三),从内核角度来说,一切皆文件,下面从总线、设备、驱动的角度,详细看一下PCI设备如何变成文件的。   四、参考资料   https://blog.csdn.net/kunkliu/article/details/   https://pcisig.com/

2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/50951.html

(0)
上一篇 2024年 9月 3日 上午9:06
下一篇 2024年 9月 3日 上午9:10

相关推荐

关注微信