3347 words
17 minutes
轉移到64位元 ARM 架構的五年,我學會了什麼

本文建議配合下面音樂閱讀,效果更好:

第一次聽到 ARM 這個詞,是幾年前在家裏一臺奔騰G2020的桌機上安裝 Android X86,爲了使其能夠執行手機上常見的應用,想盡一切辦法解決應用屢次停止運行的問題。幾經搜尋之後才發現 X86 Android 需要通過下載 native bridge 的 ARM 翻譯庫才可以執行爲手機編寫的 ARM 架構應用。也就是從那個時候,ARM 這個詞進入了我的腦海中,成爲了我最早接觸並瞭解的非X86架構。

前言#

自從了解過 Android X86 後,我對於 ARM 這一陌生的CPU架構不由自主地萌生了好奇心。我便從維基百科上搜尋關於它的內容,瞭解到了這是一種基於 RISC(精簡指令集)設計的指令集,相較於傳統X86之類的 CISC(複雜指令集)設計,ARM 架構更加注重性能,擁有更高的穩定性和效能。大多被應用在手機、平板電腦、嵌入式系統等消費者常見的設備上。我便檢索市面上是否有基於 ARM 架構的筆記本電腦。結果還真有:聯想的 YOGA C630、華爲的 Matebook E 2019 這些筆電、以高性能、長續航爲賣點進入了我的眼睛。但是家裏人肯定是不會同意給我買新電腦的,因爲當時的奔騰桌機和酷睿2的筆電已經夠用了!而且它們的價格也非常昂貴…很長一段時間內,我對於 ARM 筆電的興趣也逐漸消退了。慢慢也不再在乎架構之類的興趣。畢竟學生,學習才是正業嘛!XD

我與它的羈絆,從這裏開始#

上了初中,課業任務也就逐漸增加了,但是比起高中而言,初中還是有充足的自由的。至少不會週末違規補課,所以父母時常和我出門玩,偶爾還會去別的地方逛商場,那時候對於商店裏 Apple 的設備比較感興趣,尤其是 MacBook 系列。鋁合金一體成型的機身、高清的LCD熒幕,強大的處理器…怎麼看都要比我的華碩 K501E 酷睿2筆電好呀。但是高達2萬的價格讓我望而卻步。我的父親知道我想要 MacBook 後非常生氣,認爲我的虛榮心在作怪。從此商場也去的少了,我也不再講起這件事。

A MacBook running macOS Big Sur 後來,我認識並且開始嘗試用 Linux 取代 Windows 作業系統。我喜歡自由軟體精神,後來受到疫情影響在家學習,我又了解了 FSF 和 GNU哲學,也因此開始了我的自由軟體探索之路。因此時常會編譯一些常用的軟體,因爲有些軟體沒有針對我的發行版打包,便只能自行編譯。而這時,我的桌機和筆電便因爲過於老舊,使用逐漸力不從心。但是我又不敢開口要求父母買新筆電,就只好忍着。直到我初三,桌機的機械硬碟不知道爲什麼開始發生頻繁斷電現象,導致壞軌增多。檢視 SMART 數據發現硬盤的通電時間已有7年之久,壞軌數有四個…我決定趁機提出購買新的筆電的要求,沒想到父親居然同意,我便拉着他去看那臺採用 M1 晶片的 MacBook Air,在了解完筆電的性能後,父親便買下來了。就這樣,我與 ARM 這個CPU架構的羈絆正式開始。

My MacBook Air running Arch Linux ARM

有痛苦,亦有樂趣#

因爲 ARM 架構完全不相容傳統的 X86 架構指令集,因此作業系統和應用程式也必須更換爲支援 ARM 的版本。但是我只是一個使用者,而非開發者,所以只能完全把已有的經驗推翻重來。我開始學習 ARM 指令集,閱讀網路上關於 ARM 指令集的文章,也逐漸了解了什麼是 Thumb 擴展指令集、NEON 指令集等等。並發現我在 X86 架構上常用的 QEMU、GCC等工具同樣也有支援 ARM 架構。於是我開始了轉移到 ARM 架構的旅程。

但是一個頭疼的問題便出現了:許多日常生活中常用的軟體,大多數都無法執行。如果是有原始碼的軟體,我只能通過下載原始碼,然後在終端機執行 make 來手動編譯。要是封閉原始碼的軟體就沒有辦法了,只能等待官方更新。當然也可以用模擬X86的環境來執行,但是效果往往很差勁。有些內建反盜版檢測的程式,因爲檢測程式無法模擬運行,從而導致程式完全開不起來…絕大多數的人遇不到的錯誤,我全都經歷了,有時老師佈置的任務非常緊急,結果我的電腦因爲無法打開某些程式而無法及時完成任務,免不了要被老師責備。而且還不能據此給出一個完美的理由。
萬幸我的電腦是 MacBook,在 Apple 的督促下,過不了幾個月各大廠家就開始陸續上架常用軟體的 ARM 版本,要是 Windows 的話,不知道又要等到什麼時候呢。不過轉移的過程也會有樂趣在其中:我學會了如何從原始碼編譯程式,因爲大部分原始碼都會使用 GitHub 託管,所以我又學會了 Git 的一些用法;我也學會了抓取日誌和分析日誌,來除錯程式的問題,同時也撰寫了我的第一個 Bug 反饋。後來爲這臺 MacBook 安裝了 Asahi Linux,我的 ARM Linux 之旅也開始了。因爲 Apple M1的特殊性,其 Linux 核心默認採用 16 K 分頁地址,不同於一般 ARM 平臺的 4 K 分頁地址。因此部分應用程式會有相容性問題,比如 Electron 就開不起來。于是我又在網上搜尋教學,並學會了修補應用程式,用 git apply 打補丁。還利用 M1 晶片沒有封鎖的 KVM功能成功執行了 FreeBSD 的虛擬機。後來我才知道,ARM 平臺啓動 Linux 並不像 x86 那樣使用 ACPI,而是採用設備樹(Device Tree)來描述硬體,這顆看不見的「樹」用類似 C 的語法書寫——令當時對 C 幾乎零基礎的我,竟然也能讀懂其內容,這件事本身讓我非常驚喜。

小米平板5的開箱#

小米平板5於個人而言,也是一個意義重大的設備。在到手後一週就解鎖刷入了 Windows 11,當然,Windows 11 ARM 對我算不得什麼。我最喜歡的是它的 UEFI 引導程式,儘管高通在 Android 平臺對引導程式做了限制讓其只能引導 Linux 核心,但是開發 UEFI 的 Renegade 專案把UEFI僞造成 Linux 核心,藉由引導程式引導,多麼高明的手段!

Mi Pad 5 showing Project MU UEFI Firmware settings 後期我又根據個人需要把小米平板5的主線核心進行了自訂,刪除了無用的驅動程式,也就是在那時,我也第一次學習了編譯和定製 Linux 核心。還安裝了 Arch Linux ARM,並且使用了常用的軟體,得益於先前在 Mac 上的經歷,這次的轉移輕鬆了不少。

分享教程,教與學一並存在着#

隨着主線核心成功啓動、各種 Linux 發行版的移植成功,我也開始把我如何刷機、編譯主線核心的方式發佈到其他平臺上,比如 Youtube,起初只是單純地想記錄過程,沒想到這些影片竟吸引了越來越多觀眾。有人在留言區分享他們成功啓動系統的喜悅,也有人遇到問題時向我求助。看着他們因為我的影片而成功啓動 Linux、學會了新東西,那種成就感難以言喻。同時,爲了緊跟上游的最新變化,我也會學習相關知識,並用通俗易懂的方式放到影片中,“講”給觀衆們看。

爲了讓內容更容易理解,我開始學會把複雜的概念拆解,用最直觀的比喻和圖像來說明。從 ARM 架構到設備樹,從 UEFI 到內核編譯,我努力讓這些艱澀的技術變得“有趣”。而在解釋給別人聽的同時,我自己也不斷加深理解。很多知識,都是在回答觀眾問題的過程中才真正搞懂的——教學不僅是分享,更是自我成長的過程。同時也不知不覺就學到了很多只有到了大學才能瞭解到或者講到的內容,有一些甚至是專業相關知識,比如 ARM 架構、JTAG、UEFI 和設備樹之類。可以說做教學真是好呀,在教學別人的時候自己也能學到很多知識。

同時也學會了很多瑣碎的知識…#

除了 Linux 之外,剩下的便是一些我目前不知道有什麼用的知識。這些東西大多與平臺高度相關,而且只能通過一些設備和隨附 BSP 才能學習。比如高通平臺的協處理器在主線核心的初始化是通過一個叫 remoteproc 的進程來掛載相關韌體來完成的,例如 Wi-Fi 的初始化就是如此(只需要一個對應的韌體就可以了,而下游 Android 核心還需要三個守護進程才可以);數據機必須先初始化才能使用 Wi-Fi、GPS等(不得不說,高通平臺的數據機隔離性非常糟糕!);高通的 ADSP 無法在 EL2 模式執行,會導致音訊、USB 不可用;展迅平臺解鎖需要給 U-Boot 打補丁;如何通過 slbounce 讓受支援的處理器啓用 EL2 ;以及 libcamera 框架的使用,了解了攝像頭在 Linux 下的驅動流程與媒體管線是如何協作的。還有硬體看門狗的作用…雖然這些知識暫時還沒有明確的用途,但我相信它們會在未來的某個時刻派上用場。

My Snaptop UEFI setting

五年後的今天,我學會了什麼?#

五年看似短暫,對計算機世界卻已足夠改變許多。在我與 ARM 架構相處的五年裏,它教會了我許多。ARM 是我進入嵌入式系統領域的入口,促使我掌握了日常使用與程式開發中不可或缺的技能。它也讓我明白,要務實地使用自由軟體。正是因爲架構的差異讓我有了對於自由軟體的選擇權,也讓我擁有了靈活的頭腦,面對各種情況是都能從從容容,遊刃有餘。同時也告訴我:遇到問題不要抱怨,把問題作爲出發點,分析問題產生的過程及原因,順着“日誌”找出解決之道,或者把日誌分享出來,大家一起討論,給出建議,一起成長。

回頭看,從舊桌機上的 Android X86,到如今能夠熟練的編譯、除錯程式,以及會用 C 語言寫一些簡單的程式,這一路走來,既有挫折,也有歡欣。每一段影片、每一個反饋、每一片日誌,都是我與 ARM 世界的對話,記錄着我的成長過程。我收獲的不僅是技術知識本身,也有面對未知時的勇氣,與解決問題的恆心。我從單純的“使用者”慢慢成爲“參與者”,閱讀專案原始碼、提交錯誤回報,這些讓我真正融入了以協作為核心的開源社群。開源不再只是個理念,而成爲我生活的一部分。“ARM 架構”只是一個冰冷的技術名詞,但對我來說,它就像電腦世界的一扇門,讓我看到它的另一面。也讓我看到了自己的潛力。從好奇到理解,從模仿到創造,從學習到分享,這條路還在延伸。但我知道,只要保持那份最初的熱情與好奇,我會一直走下去 — 因爲學習的終點,從來不是知識本身,而是成長
未來,我會繼續深入自由軟體與 ARM 領域的學習與研究。也許有一天,我能設計出屬於自己的 ARM 筆電,甚至將成果貢獻到主線核心中。而這一切的起點,只是那個讓 App「能正常跑起來」的單純念頭。正是這份念頭,讓我從使用者成為創造者;從學習者成為傳遞者;從行路者,成為鋪路者。