PCIe总结--内核设备扫描

        前面讲完后,知道一个PCIe设备大概是怎么回事了,这篇文章讲下在OS下是如何扫描接入并使用这个PCIe设备的。以Linux系统为例。

        在主机上电的时候,看系统开机日志,我们可以看到很多pci的打印,这些打印其实就是内核在枚举系统PCIe设备,枚举采用的是深度优先算法,即从根端口开始,把这个根端口下的所有PCIe设备枚举完成后再枚举下一个根端口。枚举过程中前提是设备协商上,也就是前面说的进入L0状态,然后RC发送TLP包对设备进行读写配置,看到的日志中的打印是在给设备分配bus资源和memory资源。分配资源这一部分比较复杂,后面单独讲一下。

        资源分配好后,然后内核PCI子系统就会调用接口加载对应的设备驱动,驱动加载成功后,这个设备也可以说初始化成功了,可以给用户使用了。

        设备的驱动程序是在内核态的,驱动嵌入内核的时候会把驱动挂载到PCIe设备驱动链表上,在这个链表上的成员,基本实现了这么几个要素,设备的标识,可能是deviceID/vendorId,也可能是classcode,然后是probe函数,remove函数,shutdown函数,加载驱动调用的都是probe函数,卸载驱动调用的是remove函数,shutdown一般和remove函数一致,在系统shutdown的时候会调用。

        其实RootPort和PCIe switch也是有驱动的,内核里面叫port bus driver,用lspci命令查看具体的设备可以看到最后的kernel driver有,如果自己想控制PCIe switch,自己实现这一套就需要把内核的port bus driver关掉,默认是打开的,关闭的命令大概是pcie_ports=compat这个参数。

        现在的内核PCI子系统是比较庞大,功能非常完善的,包括基本的读写寄存器,设备枚举,hotplug service,aer driver等等。有兴趣的可以去看一下,目录在driver/pci下面。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值