使用OcQuirks 引導程序 來修護記憶體分配率的問題

Spread the love
前言:

任何電腦,內建的BIOS通常會把記憶體分成每一小塊,分配給電腦的各種設備以及作業系統的內核。然而在 winOS 環境下中,不僅充分的配合該機制,同時也會主動將系統的核心訪問在記憶體中。而 macOS 不僅需要更大的記憶體區塊,黑蘋果(Hackintosh) 設備的配置硬體數量,也比白果還要的多,所以我們在黑蘋果的引導程序 EFI 中,需要添加專門的驅動,為 macOS 內核預留記憶體所需的空間。

當我們構建黑蘋果的過程當中,無論是在啓動 macOS 或是透過 USB 安裝碟引導安裝時,在 -v 跑代碼中,出現以下提示錯誤,或者卡在一行 ++++++,這就是要告訴你要修復記憶體分配的問題。

ERROR!!! Load prelinked kernel with status 0x0000000000000123456
常見的修護記憶體分配的驅動
  • OsxLowMemFixDrv – 這是早期 Clover 團隊開發的記憶體分配驅動,已不再維護了。
  • OsxAptioFixDrv 、OsxAptioFix2Drv – 這是 Clover r4368 版本之前內建的記憶體分配驅動,但不支持 NVRAM。
  • OsxAptioFix2Drv-free2000 – 這個驅動只適用MSI主板所設計,該作者的 Reddit已聲明驅動可能會導致硬件損壞,故請使用者禁用。
  • OsxAptioFix3Drv – 這是 Clover r4369 版本之後內建的記憶體分配驅動,對 NVRAM 的支持。
  • AptioMemoryFixacidanthera 團隊開發的記憶體分配驅動,相比 Clover 團隊的 OsxAptioFix3Drv 有相當大的優勢。隨後將 AptioMemoryFix、 AptioInputFix、CleanNvram 三個驅動合併發佈為 AptioFixPkg,不久後又宣布停止開發 AptioFixPkg 。

這裡要特別說明的是,acidanthera是目前開發和維護 OpenCore、AppleALC、WhateverGreen、VoodooPS2、VirtualSMC 系列的團隊,雖然該團隊對外宣布停止開發 AptioFixPkg 驅動程序,但對長期使用CLOVER的用戶卻引起不少擔憂。然而 OpenCore 尚在測試階段,故將開發OpenCore 記憶體分配驅動部分組建,推出適合在CLOVER 引導程序 ㄧ OcQuirks

先決條件

OcQuirks是用於Clover的替代EFI驅動程序,可替代AptioMemoryFix和所有OsxAptioFix變體。它是針對OpenCore源代碼樹構建的,並支持OpenCore的Quirks。OcQuirks EFI驅動程序依賴於OpenRuntime.efi,並且必須將它們一起安裝在CLOVER EFI驅動程序目錄中。可以在發行版zip中找到OpenRuntime.efi,它與OcQuirks一起構建。

如何安裝OcQuirks呢?

要安裝OcQuirks,請下載最新版本或按照以下說明進行構建,然後將其安裝到EFI中,以替換任何現有的內存修復驅動程序。

  • 掛載您的EFI分區。
  • 將您的EFI檔備份到可啟動的USB安裝碟,並確認它是否可以正常運作。
  • 再把EFI檔上面的EFI/CLOVER/Drivers文件夾中,刪除AptioMemoryFix和所有OsxAptioFix變體。
  • 將OcQuirks.efi和FwRuntimeServices.efi添加到EFI卷上的Clover drivers文件夾中。
  • 重啟。
  • 如果您的系統無法啟動,請使用USB記憶棒啟動回macOS,然後通過相反的過程進行還原。檢查以下參數,並使用與您的系統更匹配的參數構建OcQuirks。

OcQuirks 這個程序內建值,默認設置基於AptioMemoryFix,並且在設計時考慮了Intel 100、200和Z370系統足以應付大部分的機器使用。至於其他主板(例如Z390可能需要DevirtualiseMmio + ProtectUefiServices),在OcQuirks.plist 需要自定義設置。同時也要卻確認 KASLR slide = X 是有效值。

OcQuirks 來自於 OpenCore 引導程序裡面的組件,相關的說明,請參考OpenCore PDF說明檔。以下是OcQuirks.plist 的默認值。

默認參數

QuirkDefault ValueDescription
AvoidRuntimeDefragTrue修復了許多韌體上的UEFI運行時服務支持
DevirtualiseMmioFalse減少內存映射中被盜的內存佔用,與某些系統不兼容
DisableSingleUserFalse忽略單用戶模式參數的安全選項。
DisableVariableWriteFalse一種安全選項,用於保護macOS NVRAM寫入訪問。
DiscardHibernateMapFalse用於解決有問題的內存映射的舊參數。從S4睡眠喚醒後,保留運行時內存的大小和位置。
EnableSafeModeSlideTrue修補引導加載程序以在安全模式下啟用KASLR。
EnableWriteUnprotectorTrue允許對UEFI運行時服務代碼進行寫訪問。
ForceExitBootServicesTrue即使使用了過期的MemoryMap密鑰,也可以確保對ExitBootServices的調用成功。
ProtectCsmRegionFalse防止CSM內存區域重定位或使用。
ProtectSecureBootFalse保護UEFI安全啟動變量不被寫入。
ProtectUefiServicesFalse保護UEFI服務不被韌體覆蓋。
ProvideCustomSlideTrue強制macOS在可用的幻燈片值中使用偽隨機值。
SetupVirtualMapTrue在SetVirtualAddress調用後訪問內存的某些固件中的解決方法問題通常會導致啟動崩潰。
ShrinkMemoryMapFalse在Haswell或更高版本上很少需要嘗試統一相似類型的連續插槽以防止引導失敗。
ProvideConsoleGopEnableTrue如果控制台句柄中缺少圖形輸出協議,請安裝。
SignalAppleOSFalseMac OS 韌體在不同的OS上具有不同的行為,因此該功能非常有用。

有關Quirks的更詳細說明,請查閱《OpenCore配置手冊》

如何編譯Z390主機板OcQuirks

以下為Z390主機板所設定的值,和OpenCore 0.5.7 相同設計。若是對OC引導有興趣者,也可以參考我目前所維護的OpenCore 中文編譯的文章。

QuirkDefault ValueDescription
AvoidRuntimeDefragTrue修復了許多韌體上的UEFI運行時服務支持
DevirtualiseMmioTrue減少內存映射中被盜的內存佔用,與某些系統不兼容
DisableSingleUserFalse忽略單用戶模式參數的安全選項。
DisableVariableWriteTrue一種安全選項,用於保護macOS NVRAM寫入訪問。
DiscardHibernateMapFalse用於解決有問題的內存映射的舊參數。從S4睡眠喚醒後,保留運行時內存的大小和位置。
EnableSafeModeSlideTrue修補引導加載程序以在安全模式下啟用KASLR。
EnableWriteUnprotectorTrue允許對UEFI運行時服務代碼進行寫訪問。
ForceExitBootServicesTrue即使使用了過期的MemoryMap密鑰,也可以確保對ExitBootServices的調用成功。
ProtectCsmRegionFalse防止CSM內存區域重定位或使用。
ProtectSecureBootTrue保護UEFI安全啟動變量不被寫入。
ProtectUefiServicesFalse保護UEFI服務不被韌體覆蓋。
ProvideCustomSlideTrue強制macOS在可用的幻燈片值中使用偽隨機值。
SetupVirtualMapTrue在SetVirtualAddress調用後訪問內存的某些固件中的解決方法問題通常會導致啟動崩潰。
ShrinkMemoryMapFalse在Haswell或更高版本上很少需要嘗試統一相似類型的連續插槽以防止引導失敗。
ProvideConsoleGopEnableTrue如果控制台句柄中缺少圖形輸出協議,請安裝。
SignalAppleOSFalseMac OS 韌體在不同的OS上具有不同的行為,因此該功能非常有用。

這裡要請大家留意:ProtectUefiServices

  1. 這是保護UEFI Service 不被韌體給覆蓋的功能。包括硬體和虛擬機(例如VMware)在內的某些現代韌體可能會在驅動程序加載和相關操作期間更新指向UEFI Service 。
  2. 這會直接破壞了影響內存管理的其他Quirks,例如DevirtualiseMmio,ProtectCsmRegion或ShrinkMemoryMap,並且還可能破壞其他Quirks,具體取決於這些Quirks。
  3. 當選擇 Yes 時,在boot-args 的參數 slide=x and UEFI /Drivers/MemoryAllocation.efi 二者刪除。
  4. 選擇No時,二者得保留。

参考文獻:
macOS Memory Allocation
OcQuirks @ GitHub

檔案下載:GitHub Release