<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > Linux 2.6.10內核下PCI Express Native熱插拔框架的實(shí)現機制

Linux 2.6.10內核下PCI Express Native熱插拔框架的實(shí)現機制

作者: 時(shí)間:2008-07-22 來(lái)源:網(wǎng)絡(luò ) 收藏
熱插拔技術(shù),可以有效避免由更換外設引起的服務(wù)器系統停機,對于提高服務(wù)器系統可用性和可擴展性意義重大。本文討論了 熱插拔所涉及的軟件因素,并基于此,剖析了 插槽熱插拔子系統的關(guān)鍵。

一 相關(guān)技術(shù)與研究

1997年,PCI SIG制定了第一個(gè)PCI熱插拔規范,其中定義了支持熱插拔所必需的平臺、板卡和軟件元素。PCI SIG推出了標準熱插拔控制器規范(SHPC SPEC),其中明確了熱插拔的標準使用模式和嚴格的寄存器組要求,并且允許操作系統提供商在平臺特定的軟件之外提供熱插拔支持,逐步完成了熱插拔標準制定工作,進(jìn)入技術(shù)的全面推廣階段。 2002年以后,Intel把熱插拔作為一種天然屬性賦予新推出的PCI 規范,PCI Express熱插拔總結了五年來(lái)工業(yè)標準的經(jīng)驗,具有如下特點(diǎn):

  • 基于SHPC模式并對其進(jìn)行了功能擴展;
  • PCI Express從設計上就把熱插拔寄存器集成進(jìn)入了其標準的性能寄存器組(而在SHPC 1.0中,熱插拔寄存器是附加的);
  • 提供給操作系統一個(gè)統一的熱插拔硬件寄存器接口,賦予了操作系統進(jìn)行原生熱插拔(繞過(guò)了傳統基于BIOS的熱插拔方法)的能力;
  • 通過(guò)在基本的體系機構層次定義熱插拔必須的硬件要求,完善了一種標準的使用模式;
  • 提供了規格參數來(lái)保證OEM產(chǎn)品的低成本而高平臺可靠性。

具有完整功能的PCI Express熱插拔系統在平臺硬件和固件支持之外,還必須有操作系統以及設備驅動(dòng)程序的支持。

在各大芯片廠(chǎng)商紛紛推出支持PCI熱插拔的產(chǎn)品的同時(shí),Microsoft,Novell,SCO等公司在他們相關(guān)的操作系統中也都包括了支持熱插拔的技術(shù), Novell NetWare 4.115和SCO UnixWare 7以及更新版本支持完整PCI熱插拔(熱替換和熱添加)。Microsoft Windows NT 4.0利用Compaq 服務(wù)器支持盤(pán)(SSD) for NT 4.0,提供了PCI熱替換支持,進(jìn)入2000年后,Microsoft Windows 2000也內建了對PCI熱插拔技術(shù)的全面軟件支持。對于GNU/,從2001年1月份的2.4版本開(kāi)始,PCI 熱插拔開(kāi)始成為其標準特性之一,到2.6 版本,熱插拔功能已經(jīng)被整合進(jìn)入核心設備模型?,F在,幾乎所有的發(fā)行版本,包括RedHat, Debian和 United Linux,都對PCI 熱插拔提供了良好支持,并分別有所擴展。BSD分支在這方面起步較晚,OpenBSD在2004年三月份的3.6版本中才出現了不含設備驅動(dòng)的設備熱插拔參考,而FreeBSD 到5.3版本為止,尚未提供對PCI 熱插拔的支持。

作為2002年出現的規范,各個(gè)通用操作系統對PCI Express的支持才剛剛起步。在微軟公司的 Windows 2000, Windows XP, and Windows Server 2003中,PCI Express設備被當作PCI設備進(jìn)行熱插拔,其他PCI Express的高級功能可以由固件激活。在Windows Longhorn中,才提供對PCI Express高級特性的原生支持。GNU/Linux在版本2.6.9中開(kāi)始專(zhuān)門(mén)提供對于PCI Express 熱插拔的支持,中間歷經(jīng)軟件架構的改動(dòng),逐漸發(fā)展為以?xún)群税姹?a class="contentlabel" href="http://dyxdggzs.com/news/listbylabel/label/2.6.10">2.6.10以及內核版本2.6.12下兩種不同的PCI Express熱插拔驅動(dòng)架構。本文主要討論所采用的PCI Express熱插拔驅動(dòng)架構,并在最后給出2.6.12的新特性。

三 PCI Express 熱插拔的軟件支持

根據規范,一個(gè)完整的 PCI Express 熱插拔系統需要幾方面的相互配合,分別為硬件元素、固件元素和軟件元素。硬件元素是指主板總線(xiàn)系統的電氣特性方面的支持,包括熱插拔控制器(Hot-Plug Controller)、卡槽電源切換邏輯(Card Slot Power Switching Logic)、板卡重置邏輯(Card Reset Logic)、電源指示燈(Power Indicator)、提示按鈕(Attention Button)和板卡存在檢測引腳(Card Present Detect Pins)等等;固件元素是指主板BIOS必須對熱插拔提供的支持,要 PCI Express熱插拔,固件必須提供OSHP方法或ACPI _OSC方法之一;軟件元素是指操作系統操綜合使用PCI Express 熱插拔所必須提供的功能組件。

軟件元素

為了操縱平臺的硬件元素,提供PCI Express熱插拔服務(wù),我們必須表1所示的主要熱插拔軟件元素。



PCI Express服務(wù)模型

PCIE熱插拔(PCIEHP)子系統中的標準熱插拔系統驅動(dòng)程序通過(guò)檢查PCI Express性能數據結構中的插槽性能寄存器(Slot Capabilities register),來(lái)獲取硬件的熱插拔部件信息。這些寄存器所能反映的信息如下:

  1. 插槽是否支持熱插拔
  2. 設備是否支持不通知軟件的突然拔出操作
  3. 提示燈、控制器等硬件元素是否存在

一旦軟件完成了PCI Express設備熱插拔功能的開(kāi)啟和配置工作,熱插拔行為(例如移出或插入請求,電源故障)就可以向系統熱插拔處理提交系統中斷和電源管理事件。這種熱插拔處理由操作系統獨立提供,圖1展示了PCI Express 熱插拔的服務(wù)模型,并展示了它與傳統的基于A(yíng)CPI的模型之間的區別。


圖1 PCI Express熱插拔服務(wù)模型比較
圖1 PCI Express熱插拔服務(wù)模型比較

四Linux 2.6.10 PCIE 熱插拔子系統代碼分析

熱插拔

為了提供PCI Express熱插拔服務(wù),Linux 2.6.10 PCIE熱插拔(PCIEHP)子系統必須實(shí)現用戶(hù)操作界面、熱插拔服務(wù)程序和標準熱插拔系統驅動(dòng)等熱插拔軟件元素,并使軟件的行為符合熱插拔標準使用模式[4]。另外,一些特定的熱插拔功能必須與支持熱插拔的設備驅動(dòng)結合在一起發(fā)揮作用。

PCIEHP核內部分的主體是一個(gè)核心線(xiàn)程,其控制邏輯以模塊的方式加載入內核,負責監控PCI Express總線(xiàn)上的熱插拔事件,并做相關(guān)處理;核外部分是一個(gè)用戶(hù)空間的腳本,從內核中調用,并根據內核傳回的信息執行后續處理過(guò)程。

1 熱插拔驅動(dòng)程序生命周期

從PCIEHP子系統啟動(dòng),到子系統被卸載期間,PCIEHP完全接管系統中PCI Express插槽熱插拔事件。

PCIEHP子系統啟動(dòng)時(shí),首先要開(kāi)啟用戶(hù)態(tài)守護進(jìn)程。然后初始化通知機制,開(kāi)啟PCI Express熱插拔事件處理核心線(xiàn)程,為操作系統中各總線(xiàn)數據結構分別預初始化一個(gè)熱插拔插槽列表。接著(zhù),根據內核編譯時(shí)是否指定ACPI式資源管理,初始化設備資源管理方式。最后,根據設備標識,在系統中注冊PCI Express熱插拔驅動(dòng)程序,并將其綁定到總線(xiàn)上所有可能掛載熱插拔插槽的PCIE橋接設備,然后初始化對應的熱插拔控制器,分配資源,開(kāi)啟定時(shí)的中斷輪詢(xún)機制。

卸載PCIEHP子系統,首先釋放熱插拔控制器全局列表中每個(gè)控制器所占用的資源,釋放熱插拔插槽全局列表中每個(gè)插槽所占用的資源,終止通知機制的運行,結束PCI Express熱插拔事件處理核心線(xiàn)程;接著(zhù),根據內核編譯時(shí)是否指定ACPI式資源管理,釋放相關(guān)設備占用的系統資源;然后,注銷(xiāo)PCI Express熱插拔驅動(dòng)程序;在處理完當前熱插拔事件后,終止核外守護進(jìn)程。

在PCIEHP加載后,為了在熱插拔執行過(guò)程中追蹤其狀態(tài)變化,我們把熱插拔插槽的狀態(tài)抽象如下:

  • 靜態(tài) (STATIC STATE ),
    正常工作或者空閑的時(shí)段,
  • 開(kāi)啟前閃爍提示態(tài)(BLINKINGON STATE)
    發(fā)出開(kāi)啟請求到確認之前的時(shí)段
  • 關(guān)閉前閃爍提示態(tài) (BLINKINGOFF STATE)
    發(fā)出關(guān)閉請求到確認之前的時(shí)段
  • 開(kāi)啟態(tài) (POWERON STATE)
    執行開(kāi)啟操作的時(shí)段
  • 關(guān)閉態(tài)(POWEROFF STATE)
    執行關(guān)閉操作的時(shí)段

各個(gè)插槽狀態(tài)之間的轉換關(guān)系如圖2所示:


圖2 插槽狀態(tài)轉換圖
圖2 插槽狀態(tài)轉換圖

2 用戶(hù)控制腳本/sbin/hotplug和核內外通信機制

在內核熱插拔處理完畢后,它會(huì )在核內調用一個(gè)用戶(hù)態(tài)腳本hotplug,這個(gè)腳本將根據內核提供的信息進(jìn)行后續處理工作。它是設備熱插拔通告的用戶(hù)空間部分,它接收內核傳出的熱插拔操作類(lèi)型和環(huán)境變量,處理設備掛載和卸載操作。通常,hotplug會(huì )根據設備類(lèi)型調用一個(gè)策略腳本,針對設備和系統當前參數進(jìn)行后續的配置工作。例如,對于網(wǎng)卡,可能會(huì )調用腳本指定IP地址,網(wǎng)關(guān)和域名服務(wù)器等等,對于存儲設備,可能會(huì )調用mount命令來(lái)加載它到文件系統內。

內核傳送給hotplug的信息包含熱插拔操作類(lèi)型(例如PCI),并且在一個(gè)環(huán)境變量中提供本次操作相關(guān)信息:

  • 行為種類(lèi):添加或刪除
  • 對象設備所屬PCI 類(lèi)、子類(lèi)和編程接口
  • 對象制造商標志和設備標志
  • 對象總線(xiàn)地址、插槽地址和功能函數編號

核外的后續配置工作涉及如下文件:

/etc/hotplug/pci.rc/ect/hotplug/pci.Agent/etc/rc.d/init.d/hotplug

在內核中,由kernel/kmod.c中的函數

int call_usermodehelper (char *path, char **argv, char **envp, int wait)來(lái)開(kāi)啟用戶(hù)態(tài)腳本/sbin/hotplug。在參數表中,path表示了所啟動(dòng)的核外應用程序的路徑,argv是應用程序的參數表,envp是環(huán)境變量列表,wait則指出了是否同步等待應用程序執行完畢再返回執行結果的狀態(tài)。

3 PCIE 熱插拔模塊構成

為了使用PCI Express Native Hotplug,我們必須在編譯的時(shí)候開(kāi)啟對應的功能模塊。

在內核配置中,PCIE Hotplug對應的開(kāi)關(guān)為HOTPLUG_PCI_PCIE,它依賴(lài)于HOTPLUG_PCI。如果你的主板支持PCI Express Native Hotplug,可以選擇Y;如果你只是想把這個(gè)驅動(dòng)作為模塊來(lái)編譯,那么選擇M,此模塊叫做pciehp,在源代碼dirverpcihotplugKconfig文件中,你可以看到:

config HOTPLUG_PCI_PCIEtristate "PCI Express Hotplug driver"depends on HOTPLUG_PCI

完整的pciehp模塊功能涉及到如下幾個(gè)文件pci_hotplug_core.c, pciehp_core.c,pciehp_ctrl.c,pciehp_pci.c pciehp_hpc.c,另外根據是否開(kāi)啟了ACPI,包含pciehprm_acpi.c 或者pciehprm_nonacpi.c,在源代碼dirverpcihotplugMakefile文件中,你可以看到:

pci_hotplug-objs	:=	pci_hotplug_core.opciehp-objs		:=	pciehp_core.o	pciehp_ctrl.o	pciehp_pci.o	pciehp_hpc.oifdef CONFIG_ACPI_BUSpciehp-objs += pciehprm_acpi.oelsepciehp-objs += pciehprm_nonacpi.oendif

代碼的主要任務(wù)就是在所有支持熱插拔的PCIE橋上加載熱插拔驅動(dòng)程序,監控熱插拔事件,并根據類(lèi)型,如是熱插入事件、熱拔出事件還是電源故障等分別予以處理。

熱插拔驅動(dòng)的加載

熱插拔驅動(dòng)程序的加載所進(jìn)行的主要工作是開(kāi)啟并初始化PCIE熱插拔的內核線(xiàn)程,這部分代碼位于/driver/pci/hotplug/pciehp_core.c中。入口函數為:

static int __init pcied_init(void)

#ifdef CONFIG_HOTPLUG_PCI_PCIE_POLL_EVENT_MODEpciehp_poll_mode = 1;#endifretval = pcie_start_thread();if (retval)goto error_hpc_init;retval = pciehprm_init(PCI);if (!retval) {retval = pci_register_driver(pcie_driver);dbg("pci_register_driver = %d", retval);info(DRIVER_DESC " version: " DRIVER_VERSION "");}

pcied_init中所涉及的關(guān)鍵函數分析如下:

retval = pcie_start_thread();

初始化并開(kāi)啟通知機制:

pciehp_event_start_thread()啟動(dòng)事件監控處理線(xiàn)程
然后初始化slot列表,系統中每個(gè)bus給一個(gè)slot列表。
struct pci_func *pciehp_slot_list[256]; 都設為NULL

retval = pciehprm_init(PCI);

原型:int pciehprm_init(enum php_ctlr_type ctlr_type)

初始化資源(區別兩種情況:acpi和非acpi的)在非acpi的初始化方式下,調用空函數legacy_pciehprm_init_pci();在pcihprm_nonacpi.h中,定義了irq_info,irq_routing_table兩個(gè)結構。在acpi初始化方式下,通過(guò)pciehprm_acpi_scan_pci()在acpi樹(shù)下遍歷搜尋PCI設備。不論acpi和非acpi的,都要求php_ctlr_type為PCI。

retval = pci_register_driver(pcie_driver);

注冊并初始化PCI橋熱插拔驅動(dòng)程序模塊。

把設備驅動(dòng)加入已注冊設備驅動(dòng)列表,即使在期間沒(méi)有相應設備出現驅動(dòng)程序仍然保持有效。

	int count = 0;/* initialize common driver fields */

用來(lái)泛化之,可以把drv->driver看作為drv的基類(lèi)信息

	drv->driver.name = drv->name;drv->driver.bus = pci_bus_type;drv->driver.probe = pci_device_probe;drv->driver.remove = pci_device_remove;drv->driver.kobj.ktype = pci_driver_kobj_type;pci_init_dynids(drv->dynids);count = driver_register(drv->driver);

注意:這里是如何從基類(lèi)drv->driver一般設備的驅動(dòng)向子類(lèi)drv這個(gè)pci設備的驅動(dòng)逆向關(guān)聯(lián)的--使用CONTAINER宏

pcie_driver為PCIE驅動(dòng)程序對象,定義在 pciehp_core.c中

	static struct pci_driver pcie_driver = {//驅動(dòng)名稱(chēng)定義為"pciehp".name=	PCIE_MODULE_NAME, // id_table指定探測函數probe所應用的范圍,這里在表中指定為所有的PCI橋設備.id_table	=	pcied_pci_tbl, //probe為指定的設備探測函數.probe	=	pcie_probe, };static struct pci_device_id pcied_pci_tbl[] = {{//此處選擇所有PCI橋.class =        ((PCI_CLASS_BRIDGE_PCI  8) | 0x00),.class_mask =	~0,.vendor =       PCI_ANY_ID,.device =       PCI_ANY_ID,.subvendor =    PCI_ANY_ID,.subdevice =    PCI_ANY_ID,},

設備探測pcie_probe:

static int pcie_probe(struct pci_dev *pdev, const struct pci_device_id *ent)in pcie-core.c

已經(jīng)確定了pdev就是pcie_driver 所匹配的PCI橋設備,而且它在pcie_driver中所對應的設備特征號是*ent,就可以對其進(jìn)行進(jìn)一步的初始化和探測。

具體行為如下:

  • 綁定熱插拔插槽
  • 設置了控制器及其狀態(tài)
  • 注冊中斷處理函數
  • 讀寫(xiě)配置頭,然后分配資源,最后對插槽檢測,掛接

熱插拔事件的監控處理線(xiàn)程

熱插拔驅動(dòng)程序對于熱插拔事件的輪詢(xún)和通知采用異步機制,對熱插拔功能部件的操縱是通過(guò)讀寫(xiě)相關(guān)寄存器組進(jìn)行的。主要功能函數關(guān)系請參見(jiàn)圖3:


圖3 插槽熱插拔事件處理函數關(guān)系
圖3 插槽熱插拔事件處理函數關(guān)系

圖3中主要函數的功能介紹如下:

A插槽事件監控線(xiàn)程

作為熱插拔活動(dòng)最直接的信息,插槽事件由硬件操作并置位相關(guān)寄存器組,系統軟件可以通過(guò)定時(shí)輪詢(xún)或者中斷方式獲取事件信息,執行對應的事件預處理函數。插槽事件如下:

  • 熱插拔命令到達
  • 插槽鎖狀態(tài)改變
  • 適配卡存在狀態(tài)改變
  • 電源出現故障

php_ctlr->int_poll_timer.function = int_poll_timeout 其中php_ctlr是熱插拔控制器狀態(tài)php_ctlr_state_s類(lèi)型,它定義于pciehp_hpc.h中,記錄當前熱插拔控制器重要狀態(tài),被用作HPC(controller)的控制器句柄;熱插拔控制器controller位于文件pciehp.h中,描述了PCIE熱插拔控制器的特征;

定時(shí)輪詢(xún)函數原型如下:

static void int_poll_timeout(unsigned long lphp_ctlr)
其中調用pcie_isr( 0, (void *)php_ctlr, NULL );
當最后一個(gè)參數是NULL時(shí),采用polling機制。
static irqreturn_t pcie_isr(int IRQ, void *dev_id, struct pt_regs *regs);
輪詢(xún)機制通過(guò)定期(2second,使用一個(gè)計時(shí)器)讀取ctrller對應的狀態(tài)寄存器,來(lái)獲取事件,然后調用ctrl狀態(tài)參量對應的事件處理函數。也就是按鈕、電源、MRL等等事件處理函數,并分別調用event_semaphore來(lái)激活event_thread.

B事件預處理函數

在插槽事件監控線(xiàn)程截獲插槽事件后,它根據事件類(lèi)型調用這組處理函數,執行完畢后,填寫(xiě)對應控制器上所掛接的事件隊列,并激活睡眠等待的處理線(xiàn)程??梢约せ钏咧械奶幚砭€(xiàn)程的函數包括如下幾個(gè):

pciehp_handle_attention_button :處理按鈕事件
pciehp_handle_switch_change:處理開(kāi)關(guān)狀態(tài)改變事件
pciehp_handle_presence_change:處理存在性狀態(tài)變化事件
pciehp_handle_power_fault:處理電源故障事件
pushbutton_helper_thread:按鈕動(dòng)作處理線(xiàn)程

C熱插拔事件處理核心線(xiàn)程event_thread

event_thread的處理過(guò)程如下:
在一個(gè)無(wú)限循環(huán)中,阻塞等待插槽事件發(fā)生
當線(xiàn)程被某一事件喚醒后,
如果 熱插拔請求已通過(guò)延時(shí)確認
進(jìn)入熱插拔請求處理函數
否則
輪詢(xún)熱插拔控制器隊列:
把控制器作為參數傳給插槽事件處理函數
其中

if (pushbutton_pending)pciehp_pushbutton_thread(pushbutton_pending);else if (surprise_rm_pending)pciehp_surprise_rm_thread(surprise_rm_pending);

前一個(gè)處理按鈕事件,后一個(gè)處理突然拔出事件。

參數pushbutton_pending是由如下函數提供的:

static void pushbutton_helper_thread(unsigned long data){pushbutton_pending = data;up(event_semaphore);

而這個(gè)函數又被作為定時(shí)task事件的行動(dòng)部分,賦值給

static void interrupt_event_handler(struct controller *ctrl)中的
p_slot->task_event.function:
函數:
p_slot->task_event.function
= (void (*)(unsigned long)) pushbutton_helper_thread;
參數:
p_slot->task_event.data
= (unsigned long) p_slot;

D插槽事件處理函數interrupt_event_handler

根據控制器信息,獲取控制器對應插槽事件
尚有事件等待處理,則執行以下內容:

逐一查看控制器所掛接事件隊列的每個(gè)成員(根據事件類(lèi)型):

1. 請求取消
取消前五秒內觸發(fā)的一次熱插拔請求

2. 請求觸發(fā)
觸發(fā)一次熱插拔操作:導致一個(gè)五秒鐘的延時(shí),如果五秒內請求沒(méi)有被拒絕,則確認前一個(gè)熱插拔請求

3. 電源故障
彈出提示信息

4. 其他
讀取插槽的功能寄存器,更新?tīng)顟B(tài)信息。

E熱插拔請求處理函數pciehp_pushbutton_thread

一個(gè)定期運行的程序,處理當前插槽上阻塞的請求,根據請求類(lèi)型:對插槽中的設備進(jìn)行熱移出(F)或者熱添加操作(G)。

F插槽熱拔出設備pciehp_disable_slot

保證所除去的不是視頻控制器
卸載所除去的適配卡占用的系統資源,更新總線(xiàn)結構,關(guān)閉電源
通知用戶(hù)態(tài)守護進(jìn)程
更新插槽狀態(tài)

G插槽熱添加設備pciehp_enable_slot

1. 執行適配卡添加的一系列相關(guān)操作: 失敗恢復預處理,存在性檢驗、打開(kāi)電源,檢查link training狀態(tài),獲取設備基本信息,配置設備,為設備建立相關(guān)數據結構,掛接到上級總線(xiàn)等。

2. 為新添加的設備查找并掛接驅動(dòng)程序。

3. 特別地,對于橋接設備,把它掛接到上級總線(xiàn)后,還要繼續對其下級總線(xiàn)進(jìn)行掃描和掛接。

4. 通知用戶(hù)態(tài)守護進(jìn)程。

5. 更新插槽狀態(tài)。

五 PCIE板卡熱插拔的標準過(guò)程

熱插拔PCI板卡可以使用提示按鈕或用戶(hù)界面來(lái)進(jìn)行,下面我們介紹使用用戶(hù)界面來(lái)啟動(dòng)熱插入和熱拔出的操作過(guò)程,以及Fedora C4T2下所采用的方式。

設備的熱插入

1. 操作員安裝卡,閉合插槽保護鎖,保護鎖感應器通知熱插拔控制器把連接信號接通到插槽。

2. 然后,操作員通知熱插拔服務(wù)程序:卡已經(jīng)被安裝并可以激活。軟件提示用戶(hù)對此進(jìn)行確認。

3. 在操作員請求連接后,熱插拔服務(wù)程序向控制著(zhù)熱插拔控制器的熱插拔系統驅動(dòng)程序下達命令,閃爍插槽的電源指示燈,提示操作員此時(shí)不可以拔動(dòng)適配卡。

4. 在熱插拔軟件對此請求進(jìn)行確認期間內,電源指示燈繼續閃爍。注意此時(shí)軟件可能會(huì )拒絕這個(gè)安裝請求(例如,安全策略此刻禁止插槽被激活)。另外,如果請求沒(méi)有生效,軟件拒絕請求并對熱插拔控制器發(fā)出命令關(guān)閉電源指示燈。規范建議軟件通過(guò)一條消息通知操作員請求被拒絕的原因。

5. 如果請求被確認,熱插拔服務(wù)程序對熱插拔系統驅動(dòng)發(fā)出請求,為插槽加電。

6. 加電后,軟件發(fā)出命令完全打開(kāi)電源指示燈。

7. 當link training完成后,操作系統指示平臺配置程序賦予適配卡必需的資源,來(lái)配置適配卡的功能。

8. 操作系統為PCI Express設備中的功能尋找恰當的驅動(dòng)程序,并加載之。

9. 接著(zhù)系統調用驅動(dòng)程序的初始化入口,并執行驅動(dòng)的初始化代碼。這些代碼完成設備的設置,并填寫(xiě)設備的PCI 配置命令寄存器的相關(guān)標志位來(lái)激活設備。

熱移出設備

1. 操作員通過(guò)指定適配卡所在物理插槽號碼來(lái)初始化移出請求。

2. 軟件彈出窗口要求操作員確認請求。注意,此時(shí)電源指示燈保持開(kāi)啟狀態(tài)。

3. 操作員確認請求后,熱插拔服務(wù)程序向熱插拔系統驅動(dòng)發(fā)出請求,要求熱插拔控制器閃爍電源指示燈。注意此時(shí)軟件可能會(huì )拒絕這個(gè)移出請求(例如,適配卡目前正被關(guān)鍵系統功能所使用)。另外,如果請求沒(méi)有被確認,軟件將拒絕請求并對熱插拔控制器發(fā)出命令,重新開(kāi)啟電源指示燈。規范建議軟件通過(guò)一條消息通知操作員請求被拒絕的原因。

4. 如果請求被確認,熱插拔服務(wù)程序將命令適配卡的設備驅動(dòng)保持靜默,也就是說(shuō)驅動(dòng)一方面必須停止向適配卡發(fā)出請求,另一方面必須完成或者終止所有已經(jīng)發(fā)出的請求,并禁止適配卡產(chǎn)生新的事務(wù)(包括中斷)。

5. 軟件發(fā)出命令,通過(guò)在插槽所連接的根端口或交換端口中的鏈接控制寄存器禁掉適配卡的鏈接。這使得鏈接兩側的端口均被禁止。

6. 軟件指示熱插拔控制器禁掉插槽。

7. 成功切斷電源后,軟件發(fā)出關(guān)閉電源指示燈命令。指示燈熄滅后,操作員可以開(kāi)始安全地從插槽移出適配卡。打開(kāi)插槽安全鎖,熱插拔控制器從插槽上撤除所有的信號(例如SMBus 和Vaux),此時(shí)卡可以被移出。

8. 操作系統釋放內存空間,I/O空間,中斷線(xiàn)等曾經(jīng)屬于該設備的系統資源。

Fedora下所采用熱插拔實(shí)現的方式

如果在最近一次編譯中選擇了PCI Express 熱插拔功能,而且驅動(dòng)是以模塊方式存在,那么,可以在命令行下鍵入以下內容:

modprobe pciehp

如果驅動(dòng)成功,則可以在/sys/bus/pci/slots/下面發(fā)現以可熱插拔插槽編號命名的目錄,進(jìn)入相關(guān)目錄,可以進(jìn)行下一步操作。

echo 1 >power開(kāi)啟某個(gè)插槽上的電源 ,進(jìn)行熱插入

echo 0 >power關(guān)閉某個(gè)插槽上的電源,執行熱拔出

若不能加載pciehp驅動(dòng),一般是由于硬件不支持或者固件缺少OSHP方法或ACPI _OSC方法之一。

六 linux2.6.12中PCIE驅動(dòng)模型的變化

在linux2.6.10中,Linux驅動(dòng)程序模型要求物理設備被單獨的驅動(dòng)程序獨占訪(fǎng)問(wèn)。 PCI Express端口是一個(gè)擁有許多獨立功能的PCI-PCI橋設備,作為一個(gè)簡(jiǎn)潔的方案,每個(gè)功能要分別實(shí)現其自己的驅動(dòng)程序,但是這樣造成了多個(gè)驅動(dòng)程序在唯一的PCI-PCI橋設備中出現競爭的狀況。也就是說(shuō),雖然PCI Express提供了如Power Management (PME)、 Advanced Error Reporting (AER)、 Hot-Plug (HP) 和Virtual Channel (VC) access等多種功能,但是如果某個(gè)PCI Express端口的native hotplug 驅動(dòng)程序加載后,它就會(huì )獨占這個(gè)PCI-PCI橋的端口,內核就不能再于其上加載其他功能的驅動(dòng)程序了。為解決這個(gè)問(wèn)題,在Linux內核版本2.6.12中,PCI Express的熱插拔又有所改變,提出了PCI Express 端口總線(xiàn)驅動(dòng)程序(PCI Express Port Bus Driver)的概念。

在實(shí)現上,PCI Express 端口總線(xiàn)驅動(dòng)程序管理主板上的所有PCI Express 端口,并且把所有提供的服務(wù)請求發(fā)送到對應的服務(wù)驅動(dòng)程序上。其優(yōu)點(diǎn)概括如下:

  • 允許多個(gè)服務(wù)驅動(dòng)程序在一個(gè)PCI-PCI橋端口設備上同步運行。
  • 允許各個(gè)服務(wù)驅動(dòng)程序相互不受干擾地獨立實(shí)現。
  • 允許一個(gè)服務(wù)驅動(dòng)程序在多個(gè)PCI-PCI橋端口設備上運行。
  • 管理PCI-PCI橋端口設備資源并分發(fā)它們到發(fā)出請求的服務(wù)驅動(dòng)程序。

例如,在注冊熱插拔驅動(dòng)程序時(shí),不再使用pci_register_driver直接向系統注冊,而是使用int pcie_port_service_register(struct pcie_port_service_driver *new) 向端口總線(xiàn)驅動(dòng)程序注冊;在注銷(xiāo)熱插拔驅動(dòng)程序時(shí),不再使用pci_unregister_driver直接向系統注銷(xiāo),而是使用void pcie_port_service_unregister(struct pcie_port_service_driver *new)來(lái)向端口總線(xiàn)驅動(dòng)程序注銷(xiāo);而端口總線(xiàn)驅動(dòng)程序是直接注冊注銷(xiāo)到系統的。

目前,PCI Express 端口總線(xiàn)驅動(dòng)程序模型還在發(fā)展演變中。

七 評估與總結

根據可用性理論,系統的可用度可以使用下列公式來(lái)計算:



在高負荷運轉的服務(wù)器上,商用可靠性的元件的故障更換并非小概率事件,對于更換故障元件和升級配件這樣的事件,沒(méi)有熱插拔支持的系統必須停機斷電進(jìn)行處理,而具備熱插拔支持的系統則僅僅需要很少的軟件切換和拔插時(shí)間開(kāi)銷(xiāo)。從上面的公式我們可以看出,MTTR值越小,系統的可用性就越高。我們定義了一個(gè)比例因子V,V= MTTRnoHP/MTTRHP,根據業(yè)界經(jīng)驗,V的取值一般在10-100之間。描述可用性的一種常用的方法是使用"9"。如三個(gè) 9 表示 99.9% 的可用性,它表示一年大約有 8.5 小時(shí)的服務(wù)中斷期。四個(gè) 9 (99.99%) 是更高一級的可用性,表示一年大約有 1 小時(shí)的服務(wù)中斷期。根據可用度公式計算,在單個(gè)元件可靠度不變的情況下,Linux操作系統對PCI Express熱插拔的支持,可以使服務(wù)器系統的外設相關(guān)可用性躍升一個(gè)等級(1個(gè)9),同時(shí),PCI Express熱插拔技術(shù)使得在線(xiàn)更換和升級PCI Express外設板卡成為可能,這使系統獲得了良好的可擴展性。

綜上所述,本文討論了PCI Express熱插拔所涉及的軟件因素,分析了linux2.6.10的PCI Express插槽熱插拔功能PCIEHP子系統,并對熱插拔支持在提高服務(wù)器系統外設相關(guān)可用性的作用進(jìn)行了定量的分析。為了繼續提高操作系統可用性和可擴展性支持能力,Linux PCI Express hotplug以下方面還有待發(fā)展:繼續完善熱插拔架構的開(kāi)放性,以提供完整統一的接口供驅動(dòng)開(kāi)發(fā)人員編寫(xiě)其他設備的熱插拔支持模塊;在插槽熱插拔之外,提供對Server IO Module(SIOM)熱插拔的支持;完善熱替換和熱升級技術(shù)。這些問(wèn)題都是非常具有挑戰性的。

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)

linux相關(guān)文章:linux教程




評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>