高云嶺++賀信++莊克良
摘 要針對目前Linux的內核的熱插拔特性以及ACPI里關于內存電源狀態表MPST的狀態定義,通過重新編譯Linux內核,開發專有的內存管理程序驅動和外部設置應用程序,來完成在大型復雜服務器系統上在關機的情況下,實現內存的動態熱插拔操作。同時,提供了在Linux平臺的測試程序,來驗證整個流程的可行性。
【關鍵詞】Linux內核 熱插拔特性 內存 內存電源狀態表
動態熱插拔技術的提出,基本上是為了在相關部件出現故障時,保證用戶能夠在系統正常運行的同時,進行在線維護。所謂熱插拔(hot-plugging或Hot Swap)功能就是允許用戶在不關閉系統,不切斷電源的情況下取出和更換損壞的內存、硬盤、電源或板卡等部件,從而極大地提高了系統對災難的及時恢復能力、擴展性和靈活性等,使復雜大型服務器系統的容錯能力大大上升,為用戶提供了最大限度的可用性。
本文針對內存熱插拔這一難題,實現了一種可操作性強、可行性的技術方案,并針對Linux操作系統之上進行原型的開發和驗證。
1 總體架構設計
總體架構設計有八部分組成,涉及從操作系統上層應用程序,中間層驅動設置程序,操作系統內核,底層硬件驅動,硬件和BIOS等,具體如圖1所示。
1.1 Linux內核修改
要實現內存的熱插拔,首先需要操作系統的深度支持。其主要完成的功能是,錯誤檢測和頁表遷移。當得到用戶設置指令或者根據自身RAS(Reliability Availability Serviceability)機制檢測到硬件錯誤的時候,操作系統要主動把支持熱插拔內存上正在運行的頁表和數據項遷移交換到其他物理內存條。頁表遷移主要任務包括在目的內存分配新的頁表,修改內核數據結構樹,移除老的頁表入口以及移動頁表內容。
1.2 驅動設置程序
驅動設置程序主要負責外部應用程序和Linux內核進行雙向通信,從而對硬件的設備驅動程序進行監控和設置。驅動設置程序架設起了內核態和用戶態進行雙向通信的安全橋梁。它的作用主要是,在內核態通過調用ACPICA(ACPI Component Architecture)接口讀取MPST(Memory Power State Table)表項中的內存節點,地址以及電源狀態列表,轉發給用戶態的應用程序;同時,接收用戶對內存遷移和插拔的輸入要求,命令操作系統內核完成頁表遷移工作,然后進行內存電源狀態控制,使其安全掉電,為手動的內存條熱插拔操作做好軟件和固件層面的準備工作。
1.3 應用程序
應用程序是用戶和計算機操作的用戶界面窗口。主要響應用戶指令,顯示內存電源狀態信息,執行內存電源狀態控制,以及提供內存分配遷移的壓力測試程序。
2 模塊功能詳細設計
2.1 Linux內核修改
Linux內核主要是確保在操作系統中將內存熱插拔特性打開,并確保ACPI表項定義include\linux\acpi中新加入的對MPST表的支持,為了明顯的看到整個內存的遷移過程的變化,可以修改mm\vmscan.c中的線程頁面守護神kswapd的源代碼。相關代碼路徑如下。
include\linux\acpi.h;mm\vmscan.c;include\acpi
Kswapd進程會被操作系統內核間歇性的喚醒,進行兩部分工作。第一部分是在發現物理頁面已經短缺的情況下,預先找出如果頁面,且將這些頁面的映射斷開,使這些物理頁面從活躍狀態轉入不活躍狀態,為頁面的換出作好準備。第二部分是每次都要執行的,把已經處于不活躍狀態的“”頁面寫入交換設備,使它們成為不活躍“干凈”頁面繼續緩沖,或進一步回收這樣的頁面成為空閑頁面。所以,可以在Kswapd中插入代碼,實現在內存熱插拔過程中,完成對內存遷移狀態的檢測。當內存不足的時候,Kswapd會自動喚醒沉睡過程中的內存,而在內存過剩,或者需要內存熱插拔的時候,完成頁表遷移整理工作。
在修改完Linux源代碼之后,就可以進行內核配置修改、操作系統新內核的編譯和加載工作了。
2.2 驅動設置程序設計
該驅動設置模塊被設計成一個字符型驅動,用于內核態和用戶態的數據通信。其主要功能如下:
(1)通過調用ACPICA架構提供的用戶接口,讀取內存MPST內容。
(2)提供可供用戶態應用程序調用的,物理內存條內電源控制模式。
(3)讀取物理內存條的狀態和屬性
(4)傳輸邏輯內存的使用狀態到Kswapd線程,為其進行內存遷移提供依據。
2.3 Hot-Plug模塊
當重新加載支持內存熱插拔的Linux內核后,可以在/sys/devices/system/memory下面看到按照內存塊ID區分的內存狀態信息。該系統有兩個內存memory0和memory1。在每個內存下面又包含著五個信息:phys_index、phys_device、state、removable、valid_zones。
phys_device是真正的物理內存序號,想要執行物理內存的熱插拔,就是操作這個屬性字段。State是內存電源狀態信息,操作系統層面只有兩種,在線和離線。而MPST中提供了物理內存的多種狀態的控制。想要做物理內存熱插拔,必須首先要設置該字段為offline。Removeable顯示該內存是否可被移除的,只有是removable的物理內存里面存放的頁表才可以被操作系統進行頁表遷移。
在操作系統層面對內存離線和在線的操作命令比較簡單,只需要對state進行設置即可。
% echo offline > /sys/devices/system/memory/memoryXXX/state
該Linux的hot-plug模塊只有和MPST相配合才能區分清楚物理內存和邏輯內存塊以及頁表的關系,進而做到真正的物理內存的熱插拔操作。
2.4 應用程序測試程序設計
應用程序運行在Linux shell環境中,主要負責和用戶進行交互。它一方面通過調用驅動配置程序拿到MPST表返回給用戶。用戶根據MPST的信息,區分清楚每個物理內存的狀態,地址和狀態。并找到該物理內存和Linux 系統中/sys/devices/system/memory/memoryXXX/的對應關系。然后,通過 % echo offline/online > /sys/devices/system/memory/memoryXXX/state系統內存的狀態控制,并通過配置驅動程序完成對真實物理內存的狀態控制,最后來實現內存的完全移除的目的。
測試程序可以通過在用戶空間不停的malloc()大量的內存來模擬急劇內存占用和釋放的壓力測試。隨著內存的占用到達一定閥值,越來越多的內存會由經過MPST的命令設置,變為上電狀態。當達到一定壓力,通過殺掉應用程序看操作系統清理整理內存的能力。而當一個物理內存中的所有邏輯內存塊全部被移除后,測試程序會調用MPST將該物理內存下電,在操作系統的資源管理器中,可以清楚地看到操作系統檢測到的物理內存大小的急劇變化。
3 結束語與展望
本文主要實現了Linux平臺上對物理內存熱插拔操作的程序設計和系統配置,綜合使用了ACPI MPST對物理內存狀態的檢測設置和操作系統內核自身的邏輯內存塊的在線離線操作,來達到物理內存和邏輯內存狀態控制的統一,最后在具有可移除屬性的物理內存上實現了內存熱插拔操作。該技術目前還處于研究的初級階段,還有的工作,比如解決邏輯內存塊在物理內存中的空洞問題,以及部分映射內核空間的物理內存的不可移除的問題。內存的熱插拔問題是一個涉及面非常廣泛的復雜性的綜合性的問題,該問題的初步解決對于復雜系統設備的開發、維護和調試,尤其是關鍵服務器的不間斷運行,具有非?,F實的積極意義。
參考文獻
[1]Robert Love.Linux kernel development.Novell Press,2005.
[2]Daniel P.Bovet,Marco Cesati. Understanding the Linux Kernel,3rd. Novell Press.OReilly,2007.
[3]Advanced Configuration and Power Interface Specification Version 6.0, Unified EFI,2008.
作者單位
海軍704廠 山東省青島市 266109