前言
2023年來看處理器的發展,x86_64系統結構與ARM64系統結構是目前市場上的主流處理器系統結構,而RISC-V有可能成為第三大系統結構。在手機晶片和嵌入式晶片領域,ARM64系統結構的處理器占了90%以上的市佔率,而在個人電腦和伺服器領域,x86_64系統結構的處理器占了90%以上的市佔率。在這樣的背景下,越來越多的晶片公司基於ARM64系統結構來打造晶片。此外,蘋果公司也切換到ARM64系統結構上,在2020年年底發佈的基於ARM64系統結構的M1處理器晶片驚豔了全球。
基於ARM64系統結構處理器打造的產品越來越多,ARM64生態也越來越繁榮。面對幾千頁的英文原版ARM公司官方技術手冊,不少開發者感到力不從心。有不少開發者希望有一本快速入門的ARM64系統結構程式設計圖書,來幫助他們快速入門與提高。出於這個目的,本書集結了華文地區優秀的工程師,以社區合作的方式撰寫了本書,結合大專院校課程特色以及實際專案經驗,精心製作了幾十個有趣的實驗,讀者可以透過實驗來深入學習和理解ARM64系統結構與程式設計。
✤ 本書特色
本書有如下一些特色。
■ 強調動手實踐。學習任何一門新技術,動手實踐是非常有效的方法。本書基於樹莓派4B開發板展示了幾十個有趣的實驗。從撰寫第一行程式開始,透過慢慢深入ARM64系統結構的學習,我們最終可以撰寫一個能在樹莓派4B開發板上運行的簡易的小型OS(具有MMU以及處理程序排程等功能)。
■ 以問題為導向。有不少讀者面對8000多頁的官方ARMv8系統結構手冊感覺力不從心,問題導向式的學習方法有利於提高學習效率。本書在每章前面列舉了一些思考題,用於激發讀者探索未知知識的興趣。這些思考題也是各大公司的經典面試題,相信仔細解答這些問題對讀者的面試大有裨益。
■ 基於ARMv8.6系統結構。本書基於ARMv8.6系統結構,介紹了ARM64指令集、ARM64暫存器、頁表、記憶體管理、TLB、記憶體屏障指令等方面的知識。本書把ARMv8.6系統結構中難理解的部分透過通俗易懂的語言呈現給讀者,並透過有趣的案例分析加深讀者的理解。
■ 複習常見陷阱與專案經驗。本書複習了許多最前線工程師在實際專案中遇到的陷阱,例如使用指令集時的陷阱等,這些寶貴的專案經驗會對讀者有所幫助。
✤ 本書主要內容
本書主要介紹ARM64系統結構的相關內容。本書重點介紹ARM64指令集、GNU組譯器、連結器、ARM64記憶體管理、快取記憶體管理等。在每章開始之前會先列出一些思考題,讀者可以圍繞這些題目進行深入學習。
本書一共有23章,包含如下內容。
第1章--主要介紹ARMv8/ARMv9系統結構基礎知識以及Cortex-A72處理器等內容。
第2章--介紹樹莓派4B開發板的情況,以及如何利用樹莓派4B來架設一個實驗環境。
第3章--討論A64指令集中載入與儲存指令的使用以及常見陷阱。
第4章--介紹A64指令集中的算術與移位指令。
第5章--介紹A64指令集中的比較與跳轉指令。
第6章--介紹A64指令集中其他重要指令,例如PC相對位址載入指令、記憶體獨占存取指令、異常處理指示、系統暫存器存取指令、記憶體屏障指令等。
第7章--複習A64指令集常見的陷阱。
第8章--介紹GNU組譯器的語法、常見虛擬指令、AArch64依賴特性等內容。
第9章--介紹連結器的使用、連結指令稿以及重定位等內容。
第10章--介紹GCC內嵌組合語言程式碼的語法、內嵌組合語言巨集的使用以及常見錯誤等內容。
第11章--介紹ARM64系統結構異常處理的觸發與傳回、異常向量表、異常現場、同步異常的解析等相關內容。
第12章--介紹ARM64 系統結構中斷處理的基本概念和流程,包括樹莓派4B上的傳統中斷控制器、保存和恢復中斷現場的方法等。
第13章--介紹GIC-V2的相關內容,包括中斷來源分配、中斷路由、樹莓派4B上的GIC-400等。
第14章--介紹ARM64系統結構下的記憶體管理,包括ARM64的頁表、頁表項屬性、頁表遍歷過程、記憶體屬性以及恒等映射等相關內容。
第15章--介紹快取記憶體的基礎知識,包括快取記憶體的工作原理、映射方式,虛擬快取記憶體與物理快取記憶體,名稱重複與名稱相同問題,快取記憶體的共用屬性、維護指令等相關內容。
第16章--介紹快取一致性相關問題,包括快取一致性的分類、MESI協定、CCI與CCN快取一致性控制器、快取記憶體錯誤分享等內容。
第17章--介紹TLB基礎知識、TLB名稱重複與名稱相同問題、ASID、TLB管理指令等相關內容。
第18章--介紹記憶體屏障指令基礎知識,包括記憶體屏障指令產生的原因、ARM64中的記憶體屏障指令等相關內容。
第19章--介紹如何使用記憶體屏障指令。
第20章--介紹原子操作,包括原子操作基本概念、原子記憶體存取指令、獨占記憶體存取工作原理、原子記憶體存取操作指令等相關內容。
第21章--介紹與作業系統相關的內容,包括64位元程式設計下常見的C語言陷阱、ARM64函式呼叫標準、ARM64堆疊佈局、簡易處理程序排程器等內容。
第22章--介紹浮點運算以及NEON指令方面的相關內容。
第23章--介紹SVE以及SVE2指令,還結合3個實際案例分析如何使用SVE/SVE2指令來進行最佳化。
本書由奔跑吧Linux社區中許多工程師共同完成。奔跑吧Linux社區由一群熱愛開放原始碼的熱心工程師組成,參與撰寫本書的人有魏漢武、寇朝陽、王樂、王曉華、蔡琛、餘雲波、牛立群、代祥軍、何花、徐國棟、徐彥飛、鄭律、張馨雨、Xiao Guangrong、Gavin Guo、Horry Zheng、Cherry Chen、Peter Chen、賈獻華等。
在撰寫過程中,作者還獲得了大連理工大學軟體學院吳國偉老師、上海交通大學軟體學院古金宇老師以及南昌大學資訊工程學院陳悅老師的支持和幫助。感謝這些老師的幫助。感謝Linaro安排的徐國棟認真審閱了大部分書稿,提出了很多修改意見。另外,本書還得到安謀科技教育計畫的支持和幫助,特別感謝宋斌老師的無私幫助。
編者