Linux 2.6.10内核下PCI Express Native热插拔框架的实现机制

Linux 2.6.10内核下PCI Express Native热插拔
架的实现机制
王兵 (bingwang_nudt@sina)国防科学技术大学计算机学院软件
2005 年 8 月 01 日
PCI热插拔技术,可以有效避免由更换外设引起的服务器系统停机,对于提高服务器系统可用性和可扩展性意义重大。本文讨论了PCI Express热插拔所涉及的软件因素,并基于此,剖析了Linux 2.6.10内核下PCI Express 插槽热插拔子系统的关键实现机制。
一相关技术与研究
1997年,PCI SIG制定了第一个PCI热插拔规范,其中定义了支持热插拔所必需的平台、板卡和软件元素。PCI SIG推出了标准热插拔控制器规范(SHPC SPEC),其中明确了热插拔的标准使用模式和严格的寄存器组要求,并且允许操作系统提供商在平台特定的软件之外提供热插拔支持,逐步完成了热插拔标准制定工作,进入技术的全面推广阶段。 2002年以后,Intel把热插拔作为一种天然属性赋予新推出的PCI Express规范,PCI Express热插拔总结了五年来工业标准的经验,具有如下特点:
党的奋斗目标
•基于SHPC模式并对其进行了功能扩展;
•PCI Express从设计上就把热插拔寄存器集成进入了其标准的性能寄存器组(而在SHPC 1.0中,热插拔寄存器是附加的);
•提供给操作系统一个统一的热插拔硬件寄存器接口,赋予了操作系统进行原生热插拔(绕过了传统基于BIOS的热插拔方法)的能力;
•通过在基本的体系机构层次定义热插拔必须的硬件要求,完善了一种标准的使用模式;
•提供了规格参数来保证OEM产品的低成本而高平台可靠性。
具有完整功能的PCI Express热插拔系统在平台硬件和固件支持之外,还必须有操作系统以及设备驱动程序的支持。
在各大芯片厂商纷纷推出支持PCI热插拔的产品的同时,Microsoft,Novell,SCO等公司在他们相关的操作系统中也都包括了支持热插拔的技术,Novell NetWare 4.11&5和SCO UnixWare 7以及更新版本支持完整PCI热插拔(热替换和热添加)。Microsoft Windows NT 4.0利用Compaq 服务器支持盘(SSD) for NT 4.0,提供了PCI热替换支持,进入2000年后,Microsoft Windows 2000也内建了对PCI热插拔技术的全面软件支持。对于GNU/Linux,从2001年1月份的内核2.4版本开始,PCI 热插拔开始成为其标准特性之一,到2.6 版本,热插拔功能已经被整合进入核心设备模型。现在,几乎所有的Lin
武汉科技大学职业技术学院ux发行版本,包括RedHat, Debian和 United Linux,都对PCI 热插拔提供了良好支持,并分别有所扩展。BSD分支在这方面起步较晚,OpenBSD在2004年三月份的3.6版本中才出现了不含设备驱动的设备热插拔参考框架,而FreeBSD 到5.3版本为止,尚未提供对PCI 热插拔的支持。
作为2002年出现的规范,各个通用操作系统对PCI Express的支持才刚刚起步。在微软公司的 Windows 2000, Windows XP, and Windows Server 2003中,PCI Express设备被当作PCI设备进行热插拔,其他PCI Express的高级功能可以由固件激活。在Windows Longhorn中,才提供对PCI Express高级特性的原生支持。GNU/Linux在内核版本2.6.9中开始专门提供对于PCI Express 热插拔的支持,中间历经软件架构的改动,逐渐发展为以内核版本2.6.10以及内核版本2.6.12下两种不同的PCI Express 热插拔驱动架构。本文主要讨论2.6.10所采用的PCI Express热插拔驱动架构,并在最后给出2.6.12的新特性。
三 PCI Express 热插拔的软件支持
根据规范,一个完整的Native PCI Express 热插拔系统需要几方面的相互配合,分别为硬件元素、固件元素和软件元素。硬件元素是指主板总线系统的电气特性方面的支持,包括热插拔控制器(Hot-Plug Controller)、卡槽电源切换逻辑(Card Slot Power Switching Logic)、板卡重置逻辑(Card Reset Logic)、电源指示灯(Power Indicator)、提示按钮(Attention Button)和板卡存在检测引脚
(Card Present Detect Pins)等等;固件元素是指主板BIOS必须对热插拔提供的支持,要实现Native PCI Express热插拔,固件必须提供OSHP方法或ACPI _OSC方法之一;软件元素是指操作系统操综合使用PCI Express 热插拔所必须提供的功能组件。
软件元素
为了操纵平台的硬件元素,提供PCI Express热插拔服务,我们必须实现表1所示的主要热插拔软件元素。
PCI Express服务模型
沥青混合料车辙试验PCIE热插拔(PCIEHP)子系统中的标准热插拔系统驱动程序通过检查PCI Express性能数据结构中的插槽性能寄存器(Slot Capabilities register),来获取硬件的热插拔部件信息。这些寄存器所能反映的信息如下:
1.插槽是否支持热插拔
2.设备是否支持不通知软件的突然拔出操作
3.提示灯、控制器等硬件元素是否存在
一旦软件完成了PCI Express设备热插拔功能的开启和配置工作,热插拔行为(例如移出或插入请求,电源故障)就可以向系统热插拔处理机制提交系统中断和电源管理事件。这种热插拔处理机制由操作系统独立提供,图1展示了PCI Express Native热插拔的服务模型,并展示了它与传统的基于ACPI的模型之间的区别。
图1 PCI Express热插拔服务模型比较
四Linux 2.6.10 PCIE 热插拔子系统代码分析
热插拔框架
为了提供PCI Express热插拔服务,Linux 2.6.10 PCIE热插拔(PCIEHP)子系统必须实现用户操作界
面、热插拔服务程序和标准热插拔系统驱动等热插拔软件元素,并使软件的行为符合热插拔标准使用模式[4]。另外,一些特定的热插拔功能必须与支持热插拔的设备驱动结合在一起发挥作用。
PCIEHP核内部分的主体是一个核心线程,其控制逻辑以模块的方式加载入内核,负责监控PCI Express 总线上的热插拔事件,并做相关处理;核外部分是一个用户空间的脚本,从内核中调用,并根据内核传回的信息执行后续处理过程。
1 热插拔驱动程序生命周期
从PCIEHP子系统启动,到子系统被卸载期间,PCIEHP完全接管系统中PCI Express插槽热插拔事件。PCIEHP子系统启动时,首先要开启用户态守护进程。然后初始化通知机制,开启PCI Express热插拔事件处理核心线程,为操作系统中各总线数据结构分别预初始化一个热插拔插槽列表。接着,根据内核编译时是否指定ACPI式资源管理,初始化设备资源管理方式。最后,根据设备标识,在系统中注册PCI Express 热插拔驱动程序,并将其绑定到总线上所有可能挂载热插拔插槽的PCIE桥接设备,然后初始化对应的热插拔控制器,分配资源,开启定时的中断轮询机制。
卸载PCIEHP子系统,首先释放热插拔控制器全局列表中每个控制器所占用的资源,释放热插拔插槽全局列表中每个插槽所占用的资源,终止通知机制的运行,结束PCI Express热插拔事件处理核心线程;接着,根据内核编译时是否指定ACPI式资源管理,释放相关设备占用的系统资源;然后,注销P
CI Express热插拔驱动程序;在处理完当前热插拔事件后,终止核外守护进程。
在PCIEHP加载后,为了在热插拔执行过程中追踪其状态变化,我们把热插拔插槽的状态抽象如下:
•静态(STATIC STATE ),
正常工作或者空闲的时段,
•开启前闪烁提示态(BLINKINGON STATE)
发出开启请求到确认之前的时段
•关闭前闪烁提示态(BLINKINGOFF STATE)
发出关闭请求到确认之前的时段
•开启态(POWERON STATE)
执行开启操作的时段
•关闭态(POWEROFF STATE)
执行关闭操作的时段
各个插槽状态之间的转换关系如图2所示:
图2 插槽状态转换图
2 用户控制脚本/sbin/hotplug和核内外通信机制
在内核热插拔处理完毕后,它会在核内调用一个用户态脚本hotplug,这个脚本将根据内核提供的信息进行后续处理工作。它是设备热插拔通告的用户空间部分,它接收内核传出的热插拔操作类型和环境变量,处理设备挂载和卸载操作。通常,hotplug会根据设备类型调用一个策略脚本,针对设备和系统当前参数进行后续的配置工作。例如,对于网卡,可能会调用脚本指定IP地址,网关和域名服务器等等,对于存储设备,可能会调用mount命令来加载它到文件系统内。
内核传送给hotplug的信息包含热插拔操作类型(例如PCI),并且在一个环境变量中提供本次操作相关信息:
•行为种类:添加或删除
•对象设备所属PCI 类、子类和编程接口
•对象制造商标志和设备标志
•对象总线地址、插槽地址和功能函数编号
核外的后续配置工作涉及如下文件:
/etc/
/ect/hotplug/pci.Agent
qq空间v8/etc/rc.d/init.d/hotplug
在内核中,由kernel/kmod.c中的函数
int call_usermodehelper (char *path, char **argv, char **envp, int wait)来开启用户态脚本
/sbin/hotplug。在参数表中,path表示了所启动的核外应用程序的路径,argv是应用程序的参数表,envp是环境变量列表,wait则指出了是否同步等待应用程序执行完毕再返回执行结果的状态。
3 PCIE 热插拔模块构成
为了使用PCI Express Native Hotplug,我们必须在编译的时候开启对应的功能模块。
在内核配置中,PCIE Hotplug对应的开关为HOTPLUG_PCI_PCIE,它依赖于HOTPLUG_PCI。如果你的主板支持PCI Express Native Hotplug,可以选择Y;如果你只是想把这个驱动作为模块来编译,那么选择M,此模块叫做pciehp,在源代码\dirver\pci\hotplug\Kconfig文件中,你可以看到:
config HOTPLUG_PCI_PCIE
tristate "PCI Express Hotplug driver"
depends on HOTPLUG_PCI
完整的pciehp模块功能涉及到如下几个文件pci_hotplug_core.c, pciehp_core.c,pciehp_ctrl.c,pciehp_pci.c pciehp_hpc.c,另外根据是否开启了ACPI,包含pciehprm_acpi.c 或者
pciehprm_nonacpi.c,在源代码\dirver\pci\hotplug\Makefile文件中,你可以看到:
pci_hotplug-objs := pci_hotplug_core.o
\
pciehp-objs  := pciehp_core.o
\
pciehp_ctrl.o
\
motorla
pciehp_pci.o
pciehp_hpc.o
ifdef CONFIG_ACPI_BUS
pciehp-objs += pciehprm_acpi.o
else
pciehp-objs += pciehprm_nonacpi.o
endif
代码的主要任务就是在所有支持热插拔的PCIE桥上加载热插拔驱动程序,监控热插拔事件,并根据类型,如是热插入事件、热拔出事件还是电源故障等分别予以处理。
热插拔驱动的加载
热插拔驱动程序的加载所进行的主要工作是开启并初始化PCIE热插拔的内核线程,这部分代码位于
/driver/pci/hotplug/pciehp_core.c中。入口函数为:
static int __init pcied_init(void)
#ifdef CONFIG_HOTPLUG_PCI_PCIE_POLL_EVENT_MODE
pciehp_poll_mode = 1;

本文发布于:2024-09-23 23:26:36,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/167010.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:热插拔   支持   设备   系统   软件
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议