1 內存數據持久化
1.1 數據持久化
持久內存系統包含如下關鍵組件:微處理器、連接微處理器內存總線上的持久內存模組(Persistent MemoryModule,PMM)及持久內存上的非易失性存儲介質。
使用持久內存來實現數據的持久化,需要重點關注如下三方面的內容。
1.材料特性
數據在掉電后的保存通常通過非易失性存儲介質來實現。材料特效見專欄非易失存儲特性一文。
2.持久內存特性
如今的計算機系統都假設一旦數據完成從內存控制器(Memory Controller,MC)向外部內存總線的傳輸操作,持久化過程即告完成,停止對持久內存的外部供電。然而,此時持久內存內部還需要電量將數據寫入非易失性存儲介質。因此持久內存需要儲能器件提供電量,以保證在掉電后可以把緩沖區的數據寫到磁性介質中。
與SSD類似,持久內存的儲能也是依靠電容來實現的。由于系統掉電后持久內存模組的供電時間要長于它所在的計算機系統的供電時間,所以內存上還需要有供電隔離電路,以免內存上的電容反向向計算機系統進行供電。
3.數據完整性
微處理器在特定執行點保證數據的持久化。數據在微處理器內核和持久內存之間要經過一段很長的寫入路徑,為了保證數據的一致性和完整性,軟件開發人員需要從代碼層面明確控制數據到達寫入路徑的哪一環,以及何時可以認為持久化寫入已經完成。持久化域就是硬件平臺能力的抽象。當系統斷電時,持久化域內的數據可以保證得到持久化保存,而持久化域外的數據則無法保證。
計算機的緩存和內存系統可能支持三類持久化域。
第一類持久化域是內存本身,數據持久性由持久內存本身及所需平臺設計保障,對微處理器的依賴最低。
第二類持久化域是內存子系統,通過異步內存刷新(Asynchronous DRAM Refresh,ADR)技術保證WPQ內的數據得到保存。
第三類持久化域會擴展到緩存,通過增強異步內存刷新(Enhanced Asynchronous DRAM Refresh,eADR)技術保證緩存內的數據得到保存。
2 持久內存的安全考慮
持久內存的安全功能跨越多個層級,包括保護持久內存介質中存取的數據,以及保護持久內存的配置數據和控制機制。持久內存的安全模型采用了SSD和NVMe技術使用的ATA(Advanced Technology Attachment,高級技術附件)安全模型,寫入持久內存介質中的數據由每根持久內存控制器使用XTS-AES-256協議加密。
內存模式中的密鑰在每次斷電重啟后都會重新生成,因此先前的數據不再可用,稱為易失性,DRAM具有相同的特性。
在AD模式下運行時,可以通過設置用戶密碼來解鎖持久內存區域,并啟用對命名空間內數據的訪問來保證安全性。持久內存支持主密碼,主密碼用來啟動安全擦除功能,但是主密碼僅可以用于本地介質擦除,如果主密碼丟失,那么將無法解鎖持久內存并且無法再次使用。如果用戶密碼丟失,則可以使用主密碼來啟用安全擦除功能,以重置持久內存。持久內存支持從操作系統或UEFI下訪問的安全擦除功能,該功能可以強制重新生成密鑰,使持久化區域中的數據無法訪問。
2.1 威脅模型
威脅模型假定攻擊者獲得了包含持久內存的服務器的物理擁有權,該服務器包含敏感的或有價值的數據(或以前使用的獨立持久內存),并試圖非法恢復持久內存上的數據。在此威脅模型下,假定攻擊者可以物理訪問正在使用的服務器平臺(內存模式區域或未鎖定的AD模式區域),并且能夠獲取持久內存上的數據訪問權限
持久內存的攻擊場景包括:
- 從辦公室或數據中心盜取包含持久內存的服務器;
- 持久內存被有平臺訪問權限的攻擊者移除;
- 從持久內存上物理復制數據;
- 將攻擊數據粘貼到持久內存中;
- 窺探內存總線上的數據;
- 修改持久內存固件。
云計算的出現對多租戶虛擬化環境中的租戶隔離和靜態數據提出了更高的要求,運行時用戶隔離受虛擬化基礎架構虛擬機監視器的控制,企業級的存儲設備應支持將存儲介質劃分為“個體租戶”的邏輯分區(每個分區有獨立的密鑰管理),這種方法的好處是租戶的數據可以獨立鎖定和擦除。多租戶威脅模型假設租戶數據可能因為隔離機制的漏洞受到其他租戶的影響,因此能夠安全地擦除租戶數據是最小化暴露數據的有效方式。
2.2 安全目標
持久內存的安全分為三類:靜態數據安全、訪問控制和介質管理保護。
1.靜態數據安全
(1)機密性保護。
持久內存可以為存儲在設備上的所有用戶數據提供機密性保護,從而防止持久內存落入不法分子手中,包括防止冷啟動攻擊,這意味著要對介質中的易失性和持久化區域進行加密。AES-XTS-256是用于保護持久內存介質的算法,它同樣適用于塊模式數據的加密。
(2)持久內存數據的靜態保護。
靜態保護持久內存數據需要用到加密持久內存的加密密鑰,以加密鎖定的方式永久存儲用戶數據,它要求安全管理員可以隨時以加密方式擦除持久化域。安全擦除是一種安全管理員快速使設備上的數據無法恢復的方法。
鎖定:持久性內存區域可在特定系統電源事件(關機、重新啟動)期間“加密”鎖定,持久內存安全架構要求該區域處于鎖定狀態,以提供靜態數據保護。解鎖持久內存應使用用戶密碼進行外部身份驗證。
安全擦除:利用持久內存的安全擦除功能,能使設備上的數據無法恢復,以實現設備的安全退役或者設備的安全重置。安全擦除的作用域是全局的持久內存,而不是特定的持久內存或者塊模式區域,只有安全管理員可以調用安全擦除命令。在安全擦除之后,持久化數據可能仍然存在于微處理器的高速緩存中,為避免數據被損壞或被竊取,必須使用特定指令使微處理器的高速緩存無效。
(3)易失性內存數據的保護。
為了模擬易失性內存的行為,持久內存介質上易失性區域被加密,然后在某些系統狀態轉換時以加密方式擦除。在內存模式下,DRAM緩存是未加密的,此時易失性內存加密區域在重置事件、睡眠、斷電重啟、電源故障(ADR命令和電壓檢測)事件中將無法恢復。
2.訪問控制
持久內存為兩種模式定義了不同的訪問控制目標:AD模式訪問控制和內存模式訪問控制。
(1)AD模式訪問控制。
持久內存提供了一種機制,以頁面級粒度(由持久內存文件系統管理)強制應用程序訪問持久內存區域。持久內存文件系統(Persistent Memory File System,PMFS)每個區域的粒度提供具有R/W/D/E權限類型的POSIX訪問控制結構。作為開放區域的一部分,PMFS為請求的應用程序設置內存管理單元(Memory Management Unit,MMU)映射,持久內存訪問控制用于Linux和Windows的主機虛擬文件系統(Virtual File System,VFS),以實現本機內核文件訪問控制的功能。
(2)內存模式訪問控制。
內存模式的訪問控制與AD模式的工作方式類似,操作系統管理內存分配,并設置相應的頁表權限,同時使用微處理器的內存管理單元強制執行頁面級保護。
3.介質管理保護
持久內存介質管理算法通過反復均勻地寫入位置來防止持久內存過早的磨損。持久內存支持為介質管理提供保護,以防過早地磨損介質和其他介質管理相關的PDOS攻擊。
2.3 基于硬件的內存加密
持久內存使用AEP-XTS-256加密算法進行靜態數據保護。
在內存模式下,每次斷電重啟后,DRAM緩存會丟失數據,持久內存加密密鑰也會丟失,并在每次啟動時重新生成。
在AD模式下,使用模塊上的密鑰加密持久化介質,持久內存在掉電時會將數據鎖定,需要利用用戶密鑰解鎖。
以下是持久內存為了保障數據和密碼安全所采用的手段。
- 加密密鑰存儲在模塊上的元數據區域中,且只能被持久內存控制器訪問,打開密鑰需要輸入密碼;
- 安全加密擦除和重寫可以實現持久內存安全的再利用或丟棄;
- 固件身份驗證和完整性:支持使用固件的簽名版本,并提供修訂控制選項。
3 持久內存的可靠性、可用性和可維護性
3.1 可靠性、可用性和可維護性定義
3.2 硬件基礎
1.緩存行與糾錯碼
糾錯碼(Error Correcting Code,ECC)用來保護持久內存的數據正確性,涉及兩個緩存行,這也意味著讀操作會讀出兩個緩存行的數據。而對于寫操作,持久內存控制器會盡量同時處理兩個緩存行來優化性能。但是對于寫一個緩存行,持久內存會通過讀—修改—寫來完成操作(ECC重新計算)。
2.介質的組織
持久內存的介質被組織成ECC塊,每個ECC塊包括4個微處理器緩存行(每個64字節)、4個毒藥標志位(對應4個緩存行,存儲在元數據中)、其他元數據(每個緩存行的狀態)和ECC。
3.空閑塊管理
持久內存會預留出一定的空閑塊作為備份,空閑塊由持久內存的固件來實現。如果持久內存檢測到壞塊,那么它會放棄壞塊,選擇新的空閑塊。不能修復的數據會從壞塊寫到空閑塊中,正確的ECC值和毒藥標志位也會被寫入空閑塊。毒藥標志位表明新的緩存行已經沒有正確的數據了,軟件如果讀取新的緩存行,那么返回的數據將包括毒藥標志。
4.數據毒藥
數據毒藥是一種錯誤抑制的方式,它提供了一個有可能恢復介質里不可糾正數據的機制。當發生不可糾正錯誤(Uncorrectable Error,UCE)時,持久內存控制器會用毒藥標記錯誤數據,并將數據和毒藥傳給微處理器。
DRAM的毒藥機制可以在系統啟動時選擇啟用或者禁止,持久內存的毒藥是必需的。對微處理器來說,如果毒藥啟用了,流程和標準的DRAM毒藥一樣;如果毒藥沒有啟用,那么系統將產生嚴重的硬件錯誤異常。
毒藥的一個影響是它延時不可糾正數據的“判斷”。在傳統的系統硬件錯誤架構中,當毒藥機制被禁止時,不可糾正的數據是致命的錯誤,它會使系統立刻崩潰。但當毒藥機制被啟動時,不可糾正的數據則不是立刻致命的,取而代之的是數據被標記成毒藥。因此當不可糾正的數據被讀取時,進行讀數據操作的用戶可以決定如何處理被標記成毒藥的數據。例如,計算機顯卡完全可以忽略被標記成毒藥的數據,繼續工作,因為一個像素導致屏幕有一個覺察不到的閃光點是完全可以容忍的。如果是微處理器的某個進程或線程來讀取數據,硬件會判斷這個錯誤是不是可以恢復,如果硬件認為這個錯誤是可以恢復的,那么它會用特殊的記號來標記這個錯誤,這樣操作系統或者虛擬機管理進程可以決定是否恢復錯誤或者怎么恢復錯誤。
毒藥標志位被保存在持久內存介質的元數據里。在內存模式下,系統重啟會清除毒藥標記;在AD模式下,系統重啟不會清除毒藥標志位。值得注意的是:如果數據錯誤的類型是致命的,那么微處理器的上下文內容將被破壞且不能被信任,所以微處理器應該立刻重啟系統以恢復到正常狀態。
5.清除數據毒藥
數據塊上的毒藥可以通過MB命令來清除。
3.3 錯誤檢測和恢復
錯誤檢測和恢復是持久內存控制器用來防止持久內存介質的隨機比特位錯誤,目的是維護所傳輸數據的完整性。如果錯誤是可以糾正的,持久內存控制器就會糾正數據,這樣就可以防止可糾正的錯誤(Correctable Error,CE)因錯誤比特位的積累變成不可糾正的錯誤。下面是三種錯誤的處理方式。
(1)讀操作(可糾正錯誤)。
當讀數據的時候,通過ECC對數據進行校驗和糾正。如果從硬件上來說數據不能被糾正,持久內存控制器就會用毒藥標記錯誤,并且傳給主機內存控制器,之后系統或者BIOS可以通過軟件進行恢復(重試、丟棄或者忽略)。
(2)讀操作(不可糾正錯誤)。
當讀數據的時候,通過ECC對數據進行校驗和糾正。如果從硬件上來說數據不能被糾正,持久內存控制器就會用毒藥標記錯誤,并且傳給主機內存控制器,之后系統或者BIOS可以通過軟件進行恢復(重試、丟棄或者忽略)。
(3)寫操作(毒藥區域)。
在寫入新數據的時候,數據會被正常寫到持久內存介質的毒藥區域,同時毒藥會被清除。
3.4 單芯片數據糾正和雙芯片數據糾正
1.單芯片數據糾正
單芯片數據糾正(Single Device Data Correction,SDDC)用來糾正單個持久內存介質芯片上的比特位錯誤,延長系統的運行時間,防止數據被破壞。SDDC由持久內存控制器管理,不需要微處理器、BIOS或者操作系統的支持。
(1)可糾正錯誤。
- 持久內存會糾正數據,并且把糾正好的數據發給主機;
- 可糾正的數據不會被傳給微處理器。
(2)不可糾正錯誤。 - 持久內存控制器會把數據包括毒藥標記發給主機;
- 持久內存控制器會在介質里創建一個記錄,如果記錄被啟用,那么中斷就會傳給主機;
- 持久內存控制器會把出錯的數據移到新的數據塊,并且在介質里設置毒藥標志位。錯誤發生以后,雖然持久內存可以繼續工作,但是錯誤檢測能力會降低,所以性能會下降。
2.雙設備數據糾正
雙設備數據糾正(Double Device Data Correction,DDDC)用來處理兩個持久內存介質芯片上的比特位錯誤,延長系統的運行時間,防止數據被破壞。DDDC由持久內存控制器管理,不需要微處理器、BIOS或操作系統的支持。當第一個設備失效時,持久內存控制器會利用糾錯碼重建失效設備上的數據到另外一個空閑設備上,數據重建完成后,持久內存控制器的錯誤檢測和糾正的能力將恢復正常。在第二個設備失效后,雖然持久內存仍然可以通過糾錯編碼進行數據讀寫,但是數據糾正功能降低了,所以性能會下降。
3.5 巡檢
持久內存控制器內置了一個刷新引擎用來巡檢(PatrolScrub),持久內存的巡檢也被稱為順序刷新,和DRAM的巡檢是各自獨立運行的。該引擎會利用空閑的機會主動地搜索持久內存,可通過對持久內存的地址進行讀操作,也可利用ECC修復可以糾正的錯誤。用戶可以對刷新引擎的頻率值進行編程,刷新引擎會根據這個頻率對持久內存進行巡檢訪問,這樣就可以有效地防止可糾正錯誤由于錯誤比特位的累積變 成不可糾正錯誤。只要有足夠的時間,所有的持久內存的地址都會被訪問到。
持久內存的巡檢通常叫作“刷新”。
- 適用模式:內存模式和AD模式。
- 對于可糾正的錯誤,持久內存控制器會糾正數據并寫回數據。
- 對于不可糾正的錯誤,持久內存控制器會用毒藥在介質的元數據里標記錯誤,不可糾正錯誤會被記錄到持久內存的介質,然后持久內存控制器會把數據移到新的位置。如果系統設置了中斷,那么中斷會被發給主機。
- 如果數據已經被標記成毒藥,那么巡檢時錯誤不會被記錄和上傳給系統。
3.6 地址區間檢查
地址區間檢查(Address Range Scrub,ARS)是ACPI規范里定義的DSM。BIOS和持久內存驅動可以通過ARS獲取不可糾正錯誤的持久內存地址,以在持久內存被分配給應用程序使用之前獲取狀況良好的地址范圍。和巡檢相比,ARS檢查內存地址的頻率更高,但是更高的檢查頻率可能會影響持久內存硬件的服務質量,所以我們可以選擇上一次ARS的結果,有時候也叫作快速ARS。
操作系統可以對有問題的持久內存不作映射,也可以標記成不可用空間,這樣可以預防應用程序因為訪問有問題的持久內存地址而崩潰。
為什么需要ARS?其原因如下。
- 巡檢不會檢查已經被標記成毒藥的地址,但ARS可以有效地獲取所有有問題的地址;
- 如果操作系統不清楚有問題的地址,應用程序一旦被分配到有不可糾正錯誤的持久化內存地址空間,讀操作就會觸發硬件錯誤異常,輕則應用程序崩潰,重則操作系統崩潰;
- 如果操作系統不清楚有問題的地址,在系統重啟以后,操作系統很可能因為不可糾正錯誤而不停重啟。ARS只有在AD模式下才會生效。
ARS可以在系統啟動的時候自動啟動,也可以在系統運行的時候手動啟動。
3.7 病毒模式
系統發生不可恢復錯誤時,會采取多種措施減少錯誤的進一步擴散。大部分系統依賴毒藥機制確保錯誤數據的抑制,壞數據包被標記成毒藥并抑制其繼續傳輸。操作系統可以選擇終止可能使用錯誤數據的應用程序或虛擬機,來減少其擴散的機會。
對于毒藥機制不能抑制的致命錯誤,為了延緩宕機增加可用性,系統可以選擇更高級別的平臺級錯誤抑制機制——病毒(viral)。啟用病毒機制后,當發生致命錯誤時,病毒標志會擴散到UPI和PCIe接口。系統會在UPI數據包報頭里設置病毒標志,并且把病毒狀態擴散到其他的CPU。PCIe接口也進入病毒狀態,此時所有PCIe設備的對內對外傳輸都會被丟棄。這樣可以防止錯誤數據寫入非易失性的存儲設備或遠程的網絡設備。
持久內存也支持病毒機制,當持久內存控制器檢測到病毒標志后:
- 在AD模式下,持久內存的寫操作會被丟棄,讀操作不受影響;
- 內存模式的寫操作不受影響。病毒模式的退出:系統重啟會清除病毒模式。
病毒模式的退出:系統重啟會清除病毒模式。
3.8 錯誤報告和記錄
錯誤報告包括錯誤記錄和信號發送。從系統啟動到系統運行,我們可能碰到各種錯誤,其中可糾正的錯誤由持久內存控制器來處理,不會上傳給主機。如下幾種不可糾正錯誤會被報告和記錄:
- AD模式和內存模式下的數據事務錯誤;
- 持久內存控制器內部錯誤;
- 系統初始化和引導過程中的錯誤;
- 鏈路錯誤。
3.9 持久內存故障隔離
當系統發生可糾正錯誤或不可糾正錯誤時,必須把錯誤的信息發給用戶。這是服務器設計廠商必須支持的功能,只有這樣用戶才能根據錯誤的性質決定采取何種措施,如替換有問題的DRAM或持久內存。為了實現正確的故障隔離,錯誤記錄對于服務器系統設計有如下幾個要求:
- 系統必須支持BIOS和BMC的RAS功能;
- 系統必須能區分設備錯誤和鏈路錯誤;
- 系統必須能區分出錯的內存位置地址;
- 系統即使熱啟動也必須保證錯誤記錄不丟失。
當系統檢測到不可糾正錯誤時,錯誤的系統地址會被記錄在微處理器的寄存器里,BIOS會進行下面的處理: - 映射系統地址到現場可更換單元;
- 如果現場可更換單元是持久內存,BIOS會查詢持久內存的介質記錄,尋找不可糾正錯誤。如果找到記錄,BIOS會嘗試把系統物理地址映射到持久內存的物理地址。
3.10 錯誤注入
服務器設計廠商需要測試RAS處理的能力,所以需要一個健壯的錯誤注入機制。持久內存同時支持DRAM的錯誤注入機制和持久內存的錯誤注入機制。DRAM的錯誤注入機制是由內存控制器來實現的,而持久內存的錯誤注入機制是由持久內存控制器來實現的,因為可糾正錯誤不會被上傳給操作系統,所以錯誤注入機制只支持不可糾正錯誤的注入。