216 次瀏覽

技嘉Z390主機板設定KALSR slide(重寫版)

前言:

2019/02/02
大約在去年九月間,我成功構建第八代黑蘋果主機,系統運行升級相當穩定,為了製作編輯影片需要,故在今年開始使用
技嘉Z390 AORUS PRO WIFI主機板,來構建第九代Hackintosh。當下製作CLOVER EFI 引導程序時遇到無法安裝上的問題,我爬文尋找的方法,終於在番茄網站構建Z390黑蘋果文章中,以OsxAptioFix2Drv-free2000.efi啟動模組,在引導參數中加入 slide=0 這樣的參數,順利安裝macOS。

在編譯300系列主機板引導程序時,應捨去原有APTIOMEMORYFIX-64.EFI 改換成 OSXAPTIOFIX2DRV-FREE2000.EFI。主要原因是APTIOMEMORYFIX容易導致300系主板安裝黑蘋果第一遍時候卡在最後2分鐘不能正常重啟進入下一步安裝,或者是導致關機變重啟。而OSXAPTIOFIX2DRV-FREE2000.EFI不存在以上的問題。

 
2019/04/05
正當升級到macOS 10.14.4的版本時(以上),無論在新安裝系統或是升級系統版本的過程當中,雖然在設定上之參數上沒啥問題,但發現某功能失常…。極有可能是BIOS出問題。但在windows上似乎看似正常。個人已察覺有這樣的問題,問題出在BIOS。每當我在安裝全新的系統時,理應該系統是最乾淨的狀態,在未開內顯時,則完全進入系統卻非常正常。

最常見的問題
當我把BIOS開啟內顯後,進入macOS系統時(-v),卻卡在++++++++++++++++++++之前。關閉內顯後則恢復系統正常運作。我個人花了許多的時間查出這個問題已久,確定為BIOS設計上的問題。然而我們都知主機板廠商製作的 BIOS 是針對winOS所設計的,無法從中變更BIOS設定值,當蘋果系統不支持Z390晶片時,意即不支持NVRAM,當下解決的方式只能透過第三方軟體來改變來修正,OsxAptioFix2Drv-free2000.efi是唯一的解決方案,要後續做系統上的調教。

2019/08/01
當OsxAptioFix2Drv-free2000之作者發佈了聲明,該OsxAptioFix2Drv-free2000.efi可能會造成硬體上破壞,建議用戶不要使用OsxAptioFix2Drv-free2000這個啟動模組。由於這樣的聲明,使用Z390、X99、X299主機板使用者,因為遇到 slide 值錯誤,想要了解和修復『無法分配運行時區域』,本文章大致說明如何解決Clover和OpenCore 引導程序的方案。

什麼叫做KASLR呢:

KASLR代表內核地址空間佈局隨機化,它用於安全為目的。具體來說,因為它在電腦和啟動之間始終是隨機的,讓Hack無法得知記憶體的位置所設計的機制。當引入的設備具有較小的記憶體映射或存在太多設備的情況時,就會發生問題。或許Kernel可能有運行的『空間』,但卻Kerml無法完全容納的可用空間。然而macOS在每次引導時無法選擇一個『隨機區域』來操作,但可以在系統在運行的當下,限制Kerml運行挪出512MB的空間,在引導參數中,加入slide=xxx,來重置KASDL的定義。

尚未定義slide=xxx的訊息
系統在引導時,因為沒有足夠空間容納Kernel的硬體的訊息,通常會遇到類似於以下錯誤:

Error allocating 0x11c61 pages at 0x00000000157e9000 alloc type 2
 Couldn't allocate runtime area

在運行macOS時崩潰的訊息:

panic(cpu 6 caller 0xffffff801fc057ba): a freed zone element has been modified in zone kalloc.4096: expected 0x3f00116dbe8a46f6 but found 0x3f00116d00000000

遇到這個狀況時,我發現關閉『內顯』時系統便成功的macOS系統。但過去構建黑蘋果者,採用技嘉主機板為首選的原因在於BIOS的架構:

  1. 2個128 Mbit flash
  2. 使用經授權AMI UEFI BIOS
  3. 支援DualBIOS™
  4. PnP 1.0a、DMI 2.7、WfM 2.0、SM BIOS 2.7、ACPI 5.0

所以,我可以任意更新BIOS版本時,在開啟『內顯』功能時有時能夠成功開啟,但並非是常態。我多次以相同的方式來確認原因後,故當下判定是技嘉主機板BIOS的問題,這也是我在社團常常發文有這樣的問題,導致我對該主機板有十足厭惡感(不敢向社團成員推薦的原因)。
備註:其實是技嘉主機板的BIOS採用KASLR的架構,以安全的目的所致。

如何解決:

Clover和OpenCore用戶的過程都是相同的,解決方法非常簡單:

  • CLOVER使用者:
    • AptioMemoryFix 不要Aptio修復混合在一起,或使用OsxAptioFixDrvX、AptioMemoryFix、OsxAptioFix3Drv.efi,目前我使用OsxAptioFix3Drv.efi,比較穩定。
    • Clover Shell(大多數用戶已經包含了它,通常稱為shell64.efi或某些變體值)
    • 關閉內顯。
    • MemoryAllocation.efi:這是建立一個固定512MB的記憶體訪問空間,好讓硬體訊息寫入在這裡。當slide值算好之後,再加入該模組,內顯重新開啟,即可順利進入系統。這是針對不支援NVRAM主板有效。
  • OpenCore用戶:
    • FwRuntimeServices
    • OpenCoreShell(需啟用該功能)Root->Misc->Tools
    • Config.plist設置:
      • PreventRuntimeDefrag:修復UEFI運行時服務,例如日期,時間,NVRAM等
      • DevirtualiseMmio:減少了被盜的內存佔用,因此我們為幻燈片值提供了更多選擇
      • DisableVariableWrite:將不支援NVRAM的主機板(B360,B365,H310,H370,Q370,Z390)的系統所需的NVRAM,重新轉寫到nvram.plist。部分主機板C612、X79、X99、X299系統也將需要此功能。
      • EnableSafeModeSlide:允許我們在安全模式下使用KALSR SLIDE,若遇到其他硬體設備問題時,也不會弄亂這個值。
      • EnableWriteUnprotector:允許我們寫入firmware(固件=韌體)鎖定的某些區域,特別是CR0寄存器。
      • ProvideCustomSlide:Kinda需要該KALSR才能執行任何實際工作。
      • SetupVirtualMap:在macOS和您的內存映射之間創建一個層,以提供更大的支持和更少的不安全寫訪問機會。
      • ShrinkMemoryMap:修復了無法容納的非常大的內存映射的問題,這對於Z390、X299平台非常有用。

重置記憶體訪問

我們需要重置記憶體訪問的原因,是因為啟動時記憶體訪問並不總是一致的,所以我們希望讓它更具確定性,讓每次啟動時變化時更少,故制定一個512MB記憶體空間。

準備:

  • 更新BIOS版本(由於早期所提供的BIOS版本,可能有記憶體訪問的問題,尤其是Z390主機板,這非常重要)
  • 清除CMOS
  • 開啟BIOS的設置值:
    • Above 4G Decoding注意:這使設備可以使用4GB以上的內存區域,這意味著macOS可以容納更多空間,在X99和X299上可能會出現問題,因此建議禁用它們。
    • Boot Options -> Windows8.1/10 mode:它僅設計用於引導Windows的較早版本,不適用other OS
    • 在BIOS中禁用盡可能多的不需要的設備(這意味著每次引導時映射中的變化較小,因此引導失敗的可能性較小)。常用設置:
    • CSM:對於舊版硬體的支持,添加了一些我們不想要的訊息。該功能需禁用。
    • Intel SGX:Software Guard Extensions,佔用大量空間,在macOS中不執行任何操作。
    • Parallel Port並列埠Parallel Port),又稱平行埠LPT(Line Printer Terminal),是電腦上資料以並列方式傳遞的,這裏選擇關閉。
    • Serial Port:主要用於序列式逐位資料傳輸。 常見的有一般電腦應用的RS-232(使用25 針或9 針連接器)和工業電腦應用的半雙工RS-485與全雙工RS-422。這裡選擇關閉。
    • iGPU:一種專門在個人電腦工作站遊戲機和一些行動裝置(如平板電腦智慧型手機等)上執行繪圖運算工作的微處理器。這裏我們俗稱『內顯』。依據使用者設定maOS SMBIOS 值,來決定是否開啟。
    • Thunderbolt:無需要雷電功能者,可選擇較低階主板來建構黑果。
    • LED lighting:對光害懼怕的朋友,可以關閉它。
    • Legacy USB:這是一定要開啟它。廢話。

​在開始重置記憶體訪問之前,我們需要做的就是觸發它,因此我們有一個乾淨的引導程序,(對於運行CLOVER EFI 而使用OsxAptioFree2000.efi需要的用戶而言,這很重要,記得刪除,改用AptioMemoryFix,否則可能會出現錯誤的情形發生)。有三種常見方式:

  • 啟用XMP:如果你是使用超頻記憶體,改為標準值DDR4 2666(macOS 標準配置),進行儲存或是禁用。
  • 關閉主機電源,拔掉電源線,讓CMS短路5~15秒,拆除主機板鋰電池,再依序放回,重置BIOS設定值。
  • 重置BIOS值。完整升級版本(這裡我用的是技嘉Z390主機板,BIOS版本為F12)。

查找KALSR值

我們把錯誤的訊息拍照下來,Error allocating 0x0x11c61 pages at 0x00000000157e9000 alloc type 2 注意0x11c61,因為每個人BIOS版本所生成的值都會不一樣唷。
透過CLOVER EFI引導程序到主介面,打開UEFI Shell 64並運行memmap -b,將會出現以下提供所有頁面及其大小的列表。好戲就上場了。

您將看到的範例:

TupeStartEND#PagesAttributes
Available00000000000010000000000000057FFF0000000000000057000000000000000F
Reserved00000000000580000000000000058FFF0000000000000001000000000000000F
Available0000000016C3B00000000082CAB7FFFF000000000015E7D000000000000000F

現在,我們要從這些值當中,挑選該列的最大的可用值,轉換為KALSR SLIDE。然而這些都是十六進制的,因此,如果有多個彼此靠近的值,則可能需要將它們轉換為十進制。
要計算KALSR值(macOS 內建的計算機,按⌘+ 3 啟用編程功能):首先從左邊上方Type欄位找到 Available 列值,找出Start欄位最大值。技嘉Z390主機板 BIOS:F12
Start0000000016C3B000

0000000016C3B000 = 0x16C3B000. 十六進制
套用公式:(HEX- 0x100000)/ 0x200000=十六進制:slide 值,計算出Slide值:16C3B000 / 200000 = 0(忽略小数點後面數字,四捨五入),0 + 1 = 1(16進制),轉換為10進制,得到的值 slide=1

電腦重啟後,開啟config.plist編譯,並將KALSR SLIDE與其餘的啟動參數一起添加。同時把MemoryAllocation.efi 放入在EFI/CLOVER/drivers/UEFI/ 裡面,進行緩存重啟,把內顯開啟,就可以順利的進入macOS系統了。

特別要注意,假設,你算出的 slide=xxx 遠高於256值!這是由包含無法使用的扇區的記憶體訪問引起的。所以需要繼續瀏覽列表,直到找到足夠小的值為止,依據Above 4G Decoding 0000000000100000的標準。

結論:

計算公式:(HEX- )/ =十六進制中的滑動值0x1000000x200000

0x100000+(十六進制中的KALSR SLIDE* )=您原始的十六進制值(如果沒有,則將+1加到您的幻燈片值中)0x200000

開啟config.plist並將KALSR SLIDE與其餘的啟動參數一起添加。如果該值仍然出現錯誤,則可以繼續使用第二大的值,依此類推。slide=00x100000Start

OpenCore部分:

在OC引導程序當中,有一個簡單的解決方案。
備註:OC引導程序這部分我還沒測試過。
在shell中運行後,運行:memmap

memmap > memmap.txt

這會將文件添加到OpenCore用戶的EFI根目錄中(例如您可能需要指定開機硬碟位置),然後可以繼續將其放入硬碟並且輸入。請注意,可能仍需要手動進行。memmap.txtfs0:$slide [insert a link to memmap.txt]

OpenCore 進階篇:開啟CFB