Apple Silicon 版 Linux 研發團隊 Asahi Linux 在 Twitter 上發布推文表示,其開發人員 @marcan42 目前已經成功將 Linux 系統導入 M1 Pro 芯片版本的 MacBook Pro 並成功啟動,但該開發人員也表示目前只是進入了啟動界面而已,離完全攻克還有很長的路要走。
當地時間 11 月 1 日 @marcan42 發布的圖片上顯示 M1 Pro 芯片版本 MacBook Pro 的屏幕上出現了 Linux 操作系統在啟動時出現的命令行,隨后在第二天他表示有信心將在第三天攻克 USB 啟動以及 Linux 對 PCIe 和 NVMe 的支持。而在當地時間 11 月 3 日 @marcan42 表示雖然還沒有獲取到 PCIe 的使用權限但系統已經可以從 USB 啟動並使用 shell。
@marcan42 表示,雖然目前距離最終目標還有很長一段路要走,但可以確定的是,目前 SMP 對稱多處理功能、IRQ / IPI 中斷、幀緩沖控制台、DART、USB 和 USB 供電、I2C、以及 GPIO 均可在 M1 Pro 芯片版本的 MacBook Pro 上使用,后續 Asahi Linux 團隊將會把精力放到 PCIe 上,並設法驅動電腦自帶的 SD 讀卡器以及 Wi-Fi 無線網卡。
經過長遠的發展,Linux如今的生態比以往豐富了很多。不少游戲有Linux版本,卻沒有macOS版本,前者的游戲生態要好上不少。
不過,技術大神想要在M1 Pro版MacBook Pro上使用Linux,更多是極客精神的探索,對普通人的意義沒那么大。買得起M1 Pro MacBook Pro的用戶,也不差錢再買一台容易裝Linux的電腦,即便是MacBook Pro無法滿足的游戲需求,索尼PS5,微軟Xbox等無疑是更好的選擇。
另外,新MacBook Pro的異形屏結構,Linux必然是沒有適配的。屆時,頂端兩邊不顯示,或者頂部中間的內容被“劉海”擋住,都是十分難受的體驗。許多程序的菜單欄都在頂部,選項很容易被劉海擋住,用戶只能非全屏運行,使用起來還得適應一下下。
Linux 5.13對蘋果M1芯片的初始支持已被合並到Linux SoC代碼樹中,預計 Linux Kernel 5.13 將帶來 M1 芯片支持。
從commit信息可以看到,在Linux內核實現對M1初始支持的開發者是Arnd Bergmann和Hector Martin. 他們的commit已在以下設備通過測試:
Mac mini (M1, 2020)
MacBook Pro (13-inch, M1, 2020)
MacBook Air (M1, 2020)
1.開始將 Linux 移植 M1
M1 的許多組件都是與蘋果的移動 SoC 共享的,因此可以從這個地方入手。但是,在編寫 Linux 驅動程序時發現, 實際上蘋果的 SoC 非常不標准。由於筆者的虛擬環境非常靈活,能夠適應多種模型,但在 Linux 上,64 位 ARM 主要依賴於一系列定義良好的組件和固件接口,但 M1 幾乎沒有使用任何這類的組件或固件接口。
首先,蘋果的 CPU 采用了不同的方式來引導操作系統內核。引導加載程序(稱為 iBoot)加載一個 Mach-O 格式的可執行目標文件,該文件支持壓縮,並封裝在一種經過 ASN.1 簽名的 IMG4 格式中。與之相比,正常的 64 位 ARM 上的 Linux 則由一個普通的二進制鏡像引導(支持壓縮,也支持幾種容器格式),或者在 UEFI 平台上由 Windows 風格的“PE”可執行文件引導。
CPU 核心啟動之后,真正的問題來了。在其他 64 位 ARM 系統上,這一步通常是通過 PSCI 接口調用固件(一些系統采用了輪詢表,但依然需要固件)。但在 M1 上,CPU 核心從一個 MMIO 寄存器指定的地址處開始(MMIO 寄存器由內核鏡像設置成某個特定的偏移量,然后由引導程序鎖定),然后直接開始運行內核。
除此之外,蘋果還設計了自己的中斷控制器 Apple Interrupt controller(簡稱 AIC),這個控制器與任何主流 ARM GIC 標准都不兼容。不僅如此,其定時器中斷並沒有像通常的 ARM 那樣連接到每個 CPU 中斷上,而是路由到 FIQ 上。FIQ 是一個很難理解的架構特性,在老式的 32 位 ARM 處理器上經常使用。很顯然,Linux 內核並不支持通過 FIQ 發送中斷,所以我們必須自己實現。
系統內的多個處理器互相通信需要一組處理器間中斷(IPI)。在舊的蘋果 SoC 上,這些中斷的處理方式與 IRQ 相似,即執行 MMIO 並訪問 AIC。但在新的處理器上,蘋果使用了一組處理器核心寄存器來分發並通知 IPI,而且也路由到了 FIQ 上。所以 FIQ 的支持非常重要。
在處理了一些其他的硬件特性之后,筆者團隊添加了一個預加載器,作為啟動處理器核心的跳板,這樣就可以設置幀緩沖區,並看到 Linux 啟動時的企鵝了。
2.需要更多輸入
不幸地是,筆者團隊並沒能用上 M1 Mac 上的 UART 線,所以只能通過其他方式來添加鍵盤(甚至鼠標)。M1 Mac Mini 有三種方式來實現這一點:M1 芯片上內置的 USB 宿主(提供 Thunderbolt/USB 接口),PCIe 上的 xHCI USB 宿主(提供 A 類接口),以及藍牙。
團隊並沒有打算深入研究蘋果的藍牙,但大家注意到它使用了一種非標准的 PCIe 協議,而且不僅需要使用 M1 芯片上的 PCIe 接口,還需要為該協議編寫自定義的內核驅動程序。這不是個理想的選擇。
也就是說,只能選擇 PCEe 並使用標准的內核 xHCI 驅動,或者使用內置的 USB 控制器。蘋果很早以前就在其芯片里使用了 Synopsys DWC3 雙角色 USB 控制器,而且該控制器有 Linux 內核驅動。不幸的是,蘋果又給該控制器添加了自定義的邏輯,所以這里也需要大量工作。
M1 的 PCIe 和內置的 DWC3 USB 控制器都使用 IOMMU,稱為 DART。蘋果一直在改進其 DART 設計,因此 IOMMU 的功能很齊全。最新版甚至支持子頁面內存保護,這是在其他控制器中從未有過的。
為了將 M1 中的 USB 端口連接到 Mac Mini 背后的 USB C 口連接器上,團隊需要使用 I2C 上的芯片(意味着需要提供 GPIO 和 I2C 驅動程序),這兩者都使用了自定義固件。
在研究了幾天 USB 后,大家終於能夠連接到外部的 USB 集線器上並成功地連上了鍵盤、鼠標和閃存盤,從此就可以運行正常的 Linux 桌面版了。
3.操作指南
3.1 下載 Ubuntu rootfs
在 Mac Mini M1 上引導 Linux 的第一步就是下載 Ubuntu POC 的 rootfs。
WX關注【優愛酷】查看完整文章獲取資源下載鏈接
我們采用了樹莓派的鏡像,因為它是 live 版本的 USB 啟動鏡像,所以只需要做出細微的修改即可。
3.2 解壓縮鏡像
你需要至少 16 G 的外置 USB。執行下列命令解壓縮鏡像:
tar-xjvfubuntu-20.10-preinstalled-desktop-arm64+ raspi.img.bz2
然后,使用磁盤工具找到外部 USB 的名稱。最后,執行下列命令將鏡像復制到 USB 上:
sudo dd if=ubuntu-20.10-preinstalled-desktop-arm64+raspi.img of=/dev/rYOURUSBDISK bs=1m
3.3 連接到 Mac
通過 USB C 口適配器,將 USB 插入 Mac Mini M1 上。目前不支持 A 口。
3.4 引導至 1TR
為了引導至 1TR(真正的恢復操作系統),請關閉 Mac Mini M1,然后按住電源鍵,直到看到“loading options”。加載完成之后,從頂端的菜單中選擇終端選項。
3.5 安裝自定義內核
下一步就是安裝自定義內核。筆者團隊編寫了一個腳本來減輕你的負擔。只需要運行:
/bin/bash -c "$(curl -fsSL https://downloads.corellium.info/linuxsetup.sh)"
該腳本會詢問用戶名和密碼。看到“Kernel installed”提示后就可以重啟了。
3.6 登錄
系統引導之后就會提示你登錄。用戶名為“pi”,密碼為“raspberry”。root密碼也是“raspberry”。
3.7 恢復 MacOS
如果想恢復至 MacOS,只需在 1TR 中打開終端,執行 bputil -n 即可。