深入浅出:Linux下PCIe热插拔的实现与应用 (linux pcie hotplug)
PCIe(Peripheral Component Interconnect Express)是一种高速的串行I/O(interconnect)总线,用于连接服务器/台式机上的硬件组件,例如图形卡、网卡和RD卡等。
对于服务器和工作站,PCIe插槽通常是通过热插拔(hot-plug)技术实现的,以允许无需关闭或重启系统即可从系统中添加或删除PCIe设备。本文将介绍Linux下PCIe热插拔的实现方式和操作。
PCIe热插拔的原理
PCIe热插拔的特性可以归结为两个方面:硬件方面和软件方面。
硬件方面:在支持PCIe热插拔的系统中,每个设备插座都有多个物理引脚用于检测设备插入,通常称为插入检测器。插入检测器与插座地面之间的电阻变化将被检测到,并且在操作系统中触发中断(interrupt)信号,通知驱动程序有设备插入,然后启动相应的设备初始化程序。
在PCIe热插拔过程中,设备被拔出时系统必须能够正确地释放设备所占用的资源,例如DMA通道,I/O内存空间等。类似地,当设备插入时系统必须能够正确地探测并分配资源给设备,以确保它们能够正常工作。
软件方面:Linux内核已经支持PCIe hhot-plug,驱动程序可以通过调用PCIe总线驱动程序(如pciehp驱动)API接口进行注册和注销。一旦一个设备被检测到已经插入,内核会通知bus驱动程序并启动特定的设备驱动程序来配置设备。
PCIe设备驱动程序启动后,执行以下操作:
1.检查设备状态,例如确定设备是否支持热插拔并处理系统中断。
2.分配内存,例如分配EECP(config space)空间和适当的I/O端口。
3.设置总线标识信息,例如VID(vendor ID)和DID(device ID)。
4.初始化设备寄存器,例如初始化MSI/MSI-X中断消息,启用MSI/MSI-X中断,根据需要重定向中断或禁用中断。
5.检出系统中其他设备的信息,例如通过sysfs文件系统将设备位置通知系统管理程序。
6.通知用户应用程序有新设备已添加到系统中。
实际应用
此处以一部服务器为例,介绍了如何在Linux下添加和删除PCIe设备。
在服务器上确定当前系统是否支持PCIe热插拔。可以通过发出以下命令来检查是否已加载pciehp内核模块:
“`
$ lod | grep pciehp
“`
如果结果中列出了pciehp,说明内核已经加装了支持PCIe热插拔的驱动程序,可以继续。
然后,插入PCIe设备:
1.通过lssapce命令查找所有可用的PCIe插槽,并确定设备的PCIe位置。
“`
$ lspci –tv
“`
2.插入设备。插入设备后,可以通过以下命令检查系统是否检测到了新设备:
“`
$ dmesg | tl
“`
3.加载设备驱动程序:
“`
$ modprobe
“`
确定设备ID是什么以及驱动程序的名称并更改。
4.设置权限:
“`
$ chmod 666 /dev/
“`
确保驱动程序具有适当的访问权限。
删除PCIe设备:
1.卸载设备驱动程序:
“`
$ rmmod
“`
2.检查系统是否检测到设备的删除:
“`
$ dmesg | tl
“`
3.拔出设备。
注意:在删除设备之前,应确保任何正在使用设备的操作均已停止。
结论