【81】linux下PCI 子系统

PCIe代码比较分散,X86下PCIe相关代码主要分散在下面目录(其他CPU架构下,大部分都差不多,主要是arch层不太一样)

driver/acpi/pci*

drivers/pci/*

arch/x86/pci/*

(1)Arch PCIe driver:放一些和架构强相关的PCIe的函数实现,X86 CPU对应arch/x86/pci /*.c

(2)ACPI PCIe driver: ACPI扫描时所涉及到的PCIe代码,包括host bridge的解析初始化,PCIe bus的创建,ecam的映射等, 对应drivers/acpi/pci*.c

(3)PCIe core driver: PCIe的子系统核心代码,包括PCIe的枚举流程,资源分配流程,中断流程等,主要对应drivers/pci/*.c

(4)PCIe port bus driver: 是PCIe portservice代码注册的框架代码, 在框架代码之上是四个service主要指的是PCIe dpc/pme/hotplug/aer,对应的是drivers/pci/pcie/*

(5)PCIe EP driver:是EP节点的设备驱动,比如GPU,网卡,NVMe、FC、SAS等。

root@switch2:/boot# ls -l

total 25992

-rw-r--r-- 1 root root  2685171 Sep 24  2020 System.map-3.16.0-5-amd64

-rw-r--r-- 1 root root   158141 Sep 24  2020 config-3.16.0-5-amd64

-rw-r--r-- 1 root root 20626396 Sep 24  2020 initrd.img-3.16.0-5-amd64

-rw-r--r-- 1 root root  3138896 Sep 24  2020 vmlinuz-3.16.0-5-amd64

root@switch2:/boot#

root@switch2:/boot# uname -a

Linux switch2 3.16.0-5-amd64 #1 SMP Debian 3.16.51-3+deb8u1 (2015-12-19) x86_64 GNU/Linux

加载顺序如下:

root@switch2:/boot#  cat System.map-3.16.0-5-amd64 | grep pci | grep initcall            

ffffffff81a0eab0 t __initcall_pcibus_class_init2

ffffffff81a0eab8 t __initcall_pci_driver_init2

ffffffff81a0eb48 t __initcall_acpi_pci_init3

ffffffff81a0eb68 t __initcall_register_xen_pci_notifier3

ffffffff81a0eb88 t __initcall_pci_arch_init3

ffffffff81a0ec90 t __initcall_pci_slot_init4

ffffffff81a0eca0 t __initcall_acpi_init4

ffffffff81a0ed40 t __initcall_pci_subsys_init4

ffffffff81a0eef8 t __initcall_pcibios_assign_resources5

ffffffff81a0ef28 t __initcall_pci_apply_final_quirks5s

ffffffff81a0ef40 t __initcall_pci_iommu_initrootfs

ffffffff81a0f2b8 t __initcall_pci_proc_init6

ffffffff81a0f2c0 t __initcall_pcie_portdrv_init6

ffffffff81a0f2d0 t __initcall_pcie_pme_service_init6

ffffffff81a0f2e0 t __initcall_pci_hotplug_init6

ffffffff81a0f2e8 t __initcall_pcied_init6

ffffffff81a0f360 t __initcall_platform_pci_module_init6

ffffffff81a0f390 t __initcall_serial_pci_driver_init6

ffffffff81a0f580 t __initcall_pci_resource_alignment_sysfs_init7

ffffffff81a0f588 t __initcall_pci_sysfs_init7

ffffffff81a0f5c8 t __initcall_pci_mmcfg_late_insert_resources7

1、pcibus_class_init

linux\drivers\pci\probe.c

主要目的是注册名字为”pci_bus”的class,并在sys文件系统创建节点

未完,不知道接下来什么时候有时间写了。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
PCI子系统的启动流程如下: 1. 电源接通后,计算机主板上的BIOS程序开始执行。 2. BIOS程序会扫描所有已经安装的PCI设备,读取每个设备的配置空间信息,包括设备的厂商ID、设备ID、IRQ、I/O地址、内存地址等信息。 3. BIOS程序会为每个PCI设备分配资源,包括IRQ、I/O地址、内存地址等。同时,它会将这些信息保存在系统的CMOS芯片中,以便于操作系统启动后使用。 4. BIOS程序会将所有的PCI设备初始化,包括设备的寄存器、状态和缓存等。 5. BIOS程序会尝试从硬盘、光盘、USB设备等介质中加载操作系统。如果成功,操作系统将开始启动。 6. 操作系统启动后,它会读取CMOS芯片中保存的PCI设备信息,将这些信息存储在系统的PCI子系统中。 7. 操作系统会为每个PCI设备加载适当的设备驱动程序,并将设备驱动程序与设备的IRQ、I/O地址、内存地址等资源进行绑定。 8. 操作系统会通过PCI总线与PCI设备进行通信,执行各种设备操作,如读取、写入、中断处理等。 9. 当需要对PCI设备进行配置更改时,操作系统会向PCI设备发送配置空间读写命令,以修改设备的配置信息。 10. 当需要卸载PCI设备时,操作系统会释放该设备占用的资源,并从PCI子系统中删除该设备的信息。 总之,PCI子系统的启动流程是一个自动化的过程,其中BIOS程序和操作系统都扮演着重要的角色,它们共同协作,为PCI设备的正确运行提供支持。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

linjiasen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值