付志鵬,馮 丹,陳 紅,張曉梨
(鵬城實驗室,廣東 深圳 518055)
隨著國內外環境的變化,建設自主可控的國產計算生態的必要性和緊迫性日益凸顯。作為計算生態核心的處理器和操作系統,除了Wintel(Windows+Intel)體系和Intel+IOS體系,AL(ARM[1]+Linux)體系由于其在移動端(手機、平板等)的優勢地位而成為在服務器和PC端具有全球發展潛力的另一種體系。隨著多年的發展,國內在AL體系已逐漸形成了以飛騰[2]+麒麟[3-6]為代表的PK(Phytium+Kylin)體系和以華為鯤鵬+歐拉為代表的鯤鵬體系。近幾年,飛騰服務器和鯤鵬服務器在國內市場飛速增長,基于國產飛騰服務器和鯤鵬服務器的生態適配顯得日益迫切,這為在關鍵領域加速完成國產化替代奠定基礎,具有廣闊的市場前景。
國產計算平臺的核心部件,主要包括處理器、整機、操作系統、中間件等。將這些核心部件有效集成起來,形成能夠支撐當前互聯網信息時代的基礎設施,進而建設國產計算生態,實現對國外生態的全面替代尤為重要。生態適配首先需要解決國產操作系統對國產服務器的適配。由于Intel服務器長期在國際國內的壟斷地位,國產操作系統主要基于Intel服務器開發和運行,無需進行適配。在AL生態蓬勃發展的當下,國產操作系統需要首先完成對飛騰服務器和華為鯤鵬服務器的適配,才能以此為基礎建設國產AL計算平臺,并在此平臺上發展AL應用生態。
國外關于操作系統對服務器適配的相關研究較少,主要原因在于Wintel體系和Intel+IOS體系在服務器和終端市場誕生的初期就天生結合在一起,Windows和IOS操作系統的開發和調試主要在Intel系列服務器或終端設備上進行,具有天生的適配能力。
在國內,前期國產操作系統主要以在Intel系列服務器上運行為主。國內外環境改變后,計算平臺國產化問題日益突出,國產操作系統在國產服務器上適配需求越來越迫切。在某些特殊領域,國產操作系統對處理器的適配已有相關研究。雷鳴等[7]針對在龍芯平臺上適配Android操作系統進行研究,通過編譯環境適配、Linux內核適配、文件系統適配等一系列改進,測試結果表明Android操作系統能夠適配龍芯處理器。任占廣等[8]針對國內高性能通信需求,采用銳華國產嵌入式操作系統在自主研制的高性能通信處理器“網芯一號”上進行適配,突破了操作系統在實時通信方面的不足,完成了銳華操作系統在“網芯一號”上的板級升級包和相關驅動上的適配。測試結果表明,銳華操作系統完全能夠滿足國內高性能通信需求,解決了通信領域大量使用國外軟硬件產品,存在安全隱患的矛盾。張靜等[9]針對銳華操作系統適配到國產飛騰1500A/4上的問題,給出了一個針對性的處理器支持包,該包支持銳華操作系統在飛騰1500A/4下的任務上下文切換、中斷處理、多核同步與互斥等功能,有力解決了飛騰1500A/4和銳華操作系統在國產通信領域的嵌入式應用障礙。針對航空航天領域軟硬件國產化的特殊需求,項濤等[10]將國產自研的天脈1機載嵌入式實時操作系統在國產自研飛騰2000A處理器上進行適配,測試結果表明天脈1嵌入式操作系統能在飛騰2000A上順利運行。劉幟琦等[11]將天脈1嵌入式操作系統適配到T2080處理器上,以滿足機載計算平臺對實時性的需求。基于PK體系,郭長國等[12]針對近幾年在國產辦公信息系統的研發、集成以及國產化推進、實施等方面進行總結梳理,提出了若干建設PK體系生態需要注意的問題及相應的應對策略,為下一步國產計算生態建設積累了經驗。針對5G時代下的物聯網對新型移動操作系統“低延時、高帶寬、大連接”需求,宋佳明等[13]提出分別從硬件適配能力、軟件兼容能力以及服務生態兼容性三個方面來構建新型操作系統適配驗證體系的思路。
通過這幾項相關研究,可以發現如下幾個特點:
(1)針對某些關鍵領域的國產化替代來進行,具有很強的針對性。
(2)操作系統對處理器的適配主要在嵌入式領域,在服務器和PC領域沒有涉及。
(3)適配的對象主要是處理器,而不涉及到整機、外設等。
(4)中國逐漸意識到生態建設的重要性并加大國產計算生態的建設力度。
針對國內通用ARM服務器領域的國產化替代來進行,適配內容除了處理器外,還包括固件、主板、外設等。其適配思路和方法,同樣可以推廣到國產ARM PC領域,具有一定的可推廣性。
操作系統的選型是國產計算平臺建設的基礎,是進行國產ARM服務器適配的第一步。目前主流的國產操作系統主要有銀河麒麟系列、歐拉系列以及統信操作系統。鑒于PK體系和鯤鵬歐拉體系在AL體系中的主流地位,采用銀河麒麟操作系統來進行適配。該適配思路和方法可以同樣擴展到歐拉或統信等其他操作系統上。
國產操作系統對國產ARM服務器的適配需要經過一系列流程。由于服務器主要由固件、CPU、主板、外設等幾個大模塊組成,因此相應的適配過程也主要分為如下四個步驟來進行:固件適配、處理器適配、主板適配、外設適配,其中每個步驟又可以細分為多個子步驟,適配整體方案如圖1所示。

圖1 國產操作系統對ARM服務器適配的整體方案
國產固件適配主要解決服務器加載并啟動操作系統的問題,國產處理器適配主要針對國產處理器內置SOC控制器,包括GPIO(General-Purpose Input/Output)、GIC(Generic Interrupt Controller)、內存地址隨機化部件等進行適配。外設適配主要針對網卡、顯卡、外部存儲和RTC(Real-Time Clock)等模塊,需要基于整體硬件平臺構建操作系統的驅動模塊,實現系統對硬件的無縫兼容。主板適配主要是指操作系統在主板上運行時可能會遇到各種各樣的問題,并針對這些問題進行排查、分析和解決。隨著操作系統和國產主板幾十年的發展,在主板適配上遇到的問題較少,因此這里主要闡述固件適配、處理器適配和外設適配。
固件是在啟動操作系統之前首先在計算機上運行的一種軟件,它的作用有兩個,一個是檢測并進行基本的硬件初始化,另外一個是加載操作系統,然后把控制權交給操作系統。
國產固件適配是指讓國產固件能夠成功啟動操作系統,目前主要支持兩種啟動方式:直接啟動(固件直接加載操作系統內核并啟動內核)和間接啟動(固件先加載grub等bootloader,然后通過bootloader啟動操作系統),啟動方式不同,其要做的工作也有所區別。固件適配要做的工作主要包括:
(1)約定好啟動操作系統要加載的內容。直接啟動,則要加載內核二進制文件、initrd文件及設備樹文件。間接啟動,則還要加載啟動加載器grub。
(2)約定好所加載內容的加載地址,包括內核二進制文件加載地址、initrd文件加載地址、設備樹文件加載地址等。
(3)約定好固件傳遞給內核的啟動參數。
當固件做完其硬件檢查和配置工作,需要啟動操作系統時,根據其啟動方式不同,分別做相應的操作。當為直接啟動時,使用約定的內核參數啟動內核,內核在啟動過程中需要解析設備樹,解壓并掛載initrd文件和文件系統進行內核和系統啟動工作。當為間接啟動時,通過已加載的grub參數加載指定的內核和設備樹,然后使用約定的內核參數啟動內核,內核在啟動過程中需要解析設備樹,解壓并掛載initrd文件和文件系統進行內核和系統啟動工作。
國產處理器適配主要從GPIO驅動模塊、GIC中斷驅動模塊以及內存地址隨機化模塊三個方面進行。
國產處理器集成了GPIO模塊[14],主要用來實現IO數據的傳輸。GPIO驅動模塊適配需要根據約定的硬件采樣機制,實現GPIO的接口操作封裝,同時對系統內核通用關機和重啟接口進行改造,實現系統下軟關機和軟重啟功能。
GPIO驅動模塊適配流程分為五個過程:(1)探測設備并對片內GPIO控制器寄存器進行初始化;(2)獲取設備樹定義的GPIO屬性配置信息進行GPIO設置;(3)構建GPIO控制器方法,包括定義GPIO方向輸入方法、GPIO值獲取方法、GPIO值設置方法并進行GPIO池的注冊;(4)為了方便GPIO驅動和應用接口的良好交互,構建sysfs文件系統框架,將GPIO的方向輸入接口、GPIO值設置和獲取接口提供給應用接口;(5)通過改造poweroff/reboot系統接口,按照約定的采樣機制構建GPIO設置執行流程,實現系統下通過GPIO接口的軟關機和軟重啟功能。
GIC中斷驅動模塊[15]適配,需要建立一個中斷和中斷源的映射關系,即一個設備發起一個中斷,能夠被系統及時察覺到并做相應的處理。如PCIe設備的MSI和MSI-X類型的中斷,系統需要在內存中建立相應的結構,用于存儲這種對應關系,從而確保這些中斷能夠及時被處理。適配完成后,所有外設觸發的中斷都能夠在系統下正常被處理器響應和執行。系統下打開/proc/interrupts可以查看系統中各設備對應的中斷關系,并查看這些中斷的數目的變化,變化的幅度在正常范圍內。
為了提供更安全的地址空間分配隨機化功能(地址分配隨機化增強功能),需要在32位系統達到28-30位時隨機化,即G bytes級別;在64位系統要達到≥40位時隨機化,即T bytes級別。飛騰FT1500A芯片是ARM64架構,要滿足40位以上的地址空間隨機化,需要通過mmap基地址(mmap_base)映射代碼段、數據段、堆段、棧段、mmap段和匿名mmap段、vdso段。內核在初始化mmap基地址的時候會判斷當前內核是否支持地址空間隨機化,若支持則會基于mmap_base 加上經過一定處理的隨機數rnd來保證后續每次訪存得到的地址空間都隨機變化,以達到提高系統安全性的目的。
適配完成的地址隨機化功能,通過終端命令“cat /proc/self/maps”,就可以查看系統下代碼段、數據段、堆段、棧段、mmap段和匿名mmap段、vdso段等地址空間信息。重復輸入該命令,對比可以發現同一地址空間(例如棧段)變動的位數,即當前系統實現的地址空間隨機化位數。
國產整機一般除了CPU上SOC集成的外設外,還會通過擴展總線(比如PCIe總線、USB總線)擴展其他外設,這些外設主要包括網卡、顯卡、存儲設備等。
網卡適配主要是適配對應網卡型號的網絡設備驅動,以及結合處理器和網卡驅動實現發送和接收環的定制操作。網卡驅動位于操作系統網絡協議棧的數據鏈路層,上層接收網絡協議中發出的數據,并傳遞給網卡硬件,下層從網卡接收數據,并傳遞給網絡協議棧。
網卡適配分為四個部分,注冊網卡驅動、網卡初始化、構建網卡基本操作接口和初始化發送/接收操作接口,如圖2所示。

圖2 網卡適配流程
首先調用PCIe設備驅動注冊函數注冊網卡驅動,在匹配設備ID后,調用驅動探針函數對網卡進行初始化,包括寄存器、DMA以及獲取EEPROM (Electrically Erasable Programmable Read Only Memory)等信息,接著構建網卡基本操作接口,接口包括open(命令ifup對應的內核接口),close(命令ifdown對應的內核接口)等;初始化發送/接收操作,包括發送接口函數的初始化以及napi的初始化(82574網卡接收采用的是napi機制)以及發送接收中斷等函數接口。
網卡驅動的發送和接收流程是網卡適配難點,需要結合處理器以及網卡驅動實現發送和接收環的定制操作。以接收流程為例,每個接收描述符環含有256(size)個描述符,一個頭指針Head,一個尾指針Tail,如圖3所示。

圖3 接受描述符環軟件結構
驅動初始化的時候Head和Tail指針都是指向Base,軟件控制Tail指針,初始化一個描述符,Tail指針往后移動一個單位,當Tail指針移動到Base+Size的時候重置為Base,當軟件發現Tail等于Head的時候,表示當前已經沒有數據可供處理,需要等待網卡接收新的數據報文。硬件控制Head指針,網卡設備接收到數據包的時候,硬件移動Head指針,當Head指針移動到Base+Size的時候重置為Base,當網卡設備發現Head等于Tail的時候,表示當前環的所有描述符都已經被填充,說明網卡接收速度快于驅動處理數據的速度,需要等待驅動處理數據并提供新的描述符。適配需要結合處理器以及網卡驅動實現發送和接收環的定制操作。
顯卡是顯示設備,為計算機提供圖形渲染與圖形顯示的功能。顯卡一般由GPU、顯示控制器和顯示接口等幾部分組成。目前主流的顯卡主要有兩家廠商,ATI的A系列顯卡和英偉達的N系列顯卡,而國產化的顯卡在圖形加速處理能力以及產品成熟度上跟主流商用顯卡存在一定差距,急需解決國產化顯卡在圖形加速處理方面不足的問題。
早期的3D加速處理,渲染緩沖模塊由一個屏幕前緩沖和一個屏幕后緩沖組成,所有的客戶端和服務器必須共享這個單一的緩沖區,應用程序將直接渲染到這個屏幕后緩沖里,然后通過等待垂直同步信號的到來再交換到屏幕前緩沖中,這種機制下在下一次渲染時需要等待當前渲染緩沖的釋放,會帶來阻塞開銷,同時往返等待服務器發送渲染緩沖區的過程也會帶來性能損失。
隨著單位幀內渲染場景的復雜度增加,對渲染緩沖區的需求加大,現階段3D處理提出了一種稱為動態多緩沖區的機制,這種機制使得每一個客戶端都使用自己私有的后緩沖,而不是使用單個共享的后緩沖。客戶端通過這個私有的后緩沖關聯自己的深度緩沖、模板緩沖、顏色緩沖,最后將渲染內容拷貝到屏幕。
該機制重新定義了一個與當前應用客戶端關聯的緩沖區池,當前應用需要緩沖區進行渲染時就會在該緩沖區池中獲取一個新的緩存,通過輪詢該緩沖區池中的每一個緩存,找到一個空閑的緩沖區。
動態多緩沖區機制的實現由原來一個緩沖增加到現在的一個緩沖池。一個渲染客戶端可以擁有一個或多個緩沖區,這些緩沖區的生命周期就是當前渲染上下文的生命周期。一旦當前渲染上下文銷毀后,該緩沖池中的每一個緩存將被釋放。
合理分配緩沖區池中緩存的數量,盡量避免3D引擎主動向服務器端輪詢消息事件,有效控制往返等待消息事件的時間,使得渲染過程不會因為申請緩存的時間開銷而增大渲染周期,給圖形渲染帶來性能損失。經過不同場景下對圖形性能的測試發現,緩沖池中的緩存數量保持在2~3個為最佳。
存儲設備是指存儲控制器,為計算機提供訪問外存的控制設備。存儲包括許多不同的種類,SATA(Serial Advanced Technology Attachment)控制器用于擴展SATA磁盤,RAID(Redundant Array of Independent Disk)控制器用來搭建RAID,光纖控制器用來擴展ISCSI(Internet Small Computer System Interface)磁盤陣列等。存儲設備驅動位于IO棧的底層,其上層是通用塊設備層,下層就是具體的存儲設備。存儲設備驅動接收來自通用塊設備層的IO請求,根據IO請求的內容和方向,發送數據給磁盤或從磁盤讀取數據傳遞給上層。
SCSI實現了一種客戶機/服務器風格的通信架構。發起者向目標設備發送命令請求,該目標處理此請求并向發起者返回響應。發起者可以是托管計算機中的一個SCSI設備,而SCSI目標則可以是一個磁盤、光盤和磁帶設備或特殊設備(比如箱體設備)。
目前,國產平臺選用的SATA控制器對命令的支持程度是有局限性的,有一些SCSI命令無法被硬件所識別并響應,特別是針對光驅的一些命令,如讀取光盤信息等,這就導致了刻錄光盤時無法得到空光盤的信息,進而無法刻錄等一系列問題。因此,存儲設備適配重點解決SATA控制器對SCSI命令無法被硬件識別的問題。為此,首先找到無法被識別的SCSI命令,并根據SCSI命令手冊找到這些命令的作用。然后,把無法識別的命令在驅動命令服務層中進行截流改造,如圖4所示,讓硬件可以正常返回。

圖4 系統命令服務邏輯框架
國產平臺主要采用DS1339型號的RTC芯片[16],掛載在I2C0總線下,其作用是為操作系統提供可靠的時間,當系統處于關機的情況下,RTC記錄操作系統時間,并可在電池供電情況下繼續正常工作,當系統正常啟動后,系統可從RTC讀取時間信息,來確保關機到開機后時間運行連續性。
為了實現系統對RTC時間的讀寫操作,需要構建基于DS1339芯片的RTC驅動模型,并且實現對RTC接口的封裝以及文件系統下設備節點的創建。用戶可以通過操作系統中的設備節點來實現讀寫RTC時間,具體驅動設計框架如圖5所示。

圖5 RTC驅動設計框架
主要工作針對圖5中的內核空間部分展開。首先,進行設備驅動的注冊和初始化工作,包括根據數據手冊對DS1339芯片寄存器的初始化;其次,創建設備文件節點,通過class封裝函數分別在文件系統下創建sys文件節點,proc文件節點,dev設備節點;最后,針對設備文件節點的操作函數接口封裝,讓用戶通過操作相應的設備文件節點就可以完成對RTC的讀寫。
由于每次將時間寫入RTC芯片的過程中會產生一個時間延遲漂移,根據各芯片特性不同漂移系數會有差別,這是一個隱性問題,比較難以發現。在操作系統的關機過程中,會有一次將系統時間寫入RTC的操作,在系統開機加電時再將RTC時間讀出,寫入系統時間。故而在重啟一定次數后,系統時間將會產生比較大的誤差,原因是漂移延遲進行了累加。解決辦法是在寫入RTC過程中加上該芯片的漂移系數。
適配完成的RTC驅動,可以通過date命令設置當前系統時間,通過命令hwclock -w將系統時間寫入RTC芯片,通過命令hwclock -r讀取當前RTC時間,通過命令hwclock -s將RTC時間覆蓋系統時間,觀察是否正確。
為了對上述適配方案進行驗證,采用銀河麒麟操作系統在鯤鵬服務器上進行,其測試驗證平臺的軟硬件配置如表1所示。

表1 測試驗證環境配置
測試驗證的內容主要針對麒麟操作系統通過上面的適配方案在鯤鵬服務器上適配后,其固件、處理器、外設等是否適配成功,即相關的固件、處理器、外設是否能夠正常使用。
測試方法主要是輸入與適配部件相關的命令,如果能夠正常查看并使用相關部件,可以認為適配成功并能正常使用,相關測試內容及結果如表2所示。

表2 適配測試及結果
同時,通過表3所示的48小時穩定性測試,來檢驗適配后的服務器是否能穩定運行。

表3 穩定性測試結果
測試驗證結果表明,銀河麒麟服務器操作系統V10在TaiShan200-2280v2服務器上適配成功,能滿足正常使用需求。
建設國產計算平臺是信創建設的基礎,是實現國家關鍵領域國產化替代的關鍵環節,它首先需要解決國產操作系統在國產服務器上的適配。針對銀河麒麟在國產ARM服務器上的適配問題,該文從固件、處理器、網卡、顯卡、外部存儲、時鐘等方面詳細闡述,測試驗證結果表明,該適配方案能夠很好地滿足國產操作系統對國產ARM服務器的適配。
下一步將基于國產計算平臺建設基于AL平臺的國產計算生態,重點在數據庫、中間件、關鍵行業應用軟件等方面進行遷移適配。針對國產昇騰AI芯片,下一步也將做相應的適配,滿足國內日益增長的人工智能計算需求。通過一系列的數據庫、中間件、應用軟件適配,希望豐富壯大國產計算生態,有力解決當前關鍵技術受制于人的被動局面。