★ 基於樹莓派4B開發板,詳盡介紹ARM64系統結構 ★
☆ 結合QEMU實驗平台,整理各種實戰經驗 ☆
★ 深入淺出地介紹ARMv8和ARMv9系統結構,透過ARM64進行創新實驗 ★隨著手機晶片和嵌入式晶片領域的發展,ARM64系統結構的處理器占了90%以上的市佔率,與ARM64相關的生態社群也越來越繁榮。但當面對幾千頁的英文原版ARM公司官方技術手冊時,不少開發者往往感到力不從心。
全書共分23章,包含ARMv8/ARMv9系統結構基礎知識以及Cortex-A72處理器。並針對樹莓派4B開發板,用來架設實驗環境。內容涵蓋A64指令集中載入與儲存指令、算術與移位指令、比較與跳躍指令、PC相對位址載入指令、記憶體獨占存取指令、異常處理指示、系統暫存器存取指令、記憶體屏障指令等。
另外GNU組譯器的語法也是本書重點,還有連結器的使用、連結指令稿以及重定位。中間還有說明GCC內嵌組合語言程式碼語法、巨集、系統結構異常處理的觸發與返回、異常向量表、異常現場、同步異常的解析。
在硬體上面,則介紹了系統結構中斷處理的基本概念流程,樹莓派4B上的傳統中斷控制器、保存和恢復中斷現場。GIC部分,則介紹了中斷源分配、中斷路由、樹莓派4B上的GIC-400。
有關記憶體部分,則介紹記憶體管理,頁表、頁表項等。在快取記憶體上,包括了工作原理、映射方式,虛擬快取記憶體與物理快取記憶體,名稱重複與名稱相同、共用屬性、維護指令、一致性相關問題,MESI協定、CCI與CCN快取一致性控制器、快取記憶體錯誤分享。
本書最精華的地方則在於全書後段,介紹記憶體屏障指令基礎知識、原子操作基本概念、原子記憶體存取指令、獨占記憶體存取工作原理、原子記憶體存取操作指令等相關內容。
在作業系統方法,則有64位元程式設計下常見的C語言陷阱、ARM64函式呼叫標準、ARM64堆疊佈局、簡易處理程序排程器、浮點運算以及NEON指令、SVE以及SVE2指令,還結合3個實際案例分析如何使用SVE/SVE2指令來進行最佳化。
本書集結了華文地區優秀的工程師,以社區合作的方式撰寫了本書,結合大專院校課程特色以及實際專案經驗,精心製作了幾十個有趣的實驗,讀者可以透過實驗來深入學習和理解ARM64的系統結構與程式設計,相當推薦給需要使用ARM架構的硬體工程師或有志於此的從業人員。
※ 本書附程式碼,可至深智官網下載:https://deepmind.com.tw/
作者簡介:
奔跑吧Linux社區
「奔跑吧Linux社區」是由一群志同道合的工程師組成,致力於Linux等開源軟體與推廣,為廣大工程師和讀者提供深入的開源知識分享。
作者序
【前言】
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安排的徐國棟認真審閱了大部分書稿,提出了很多修改意見。另外,本書還得到安謀科技教育計畫的支持和幫助,特別感謝宋斌老師的無私幫助。
編者
【前言】
2023年來看處理器的發展,x86_64系統結構與ARM64系統結構是目前市場上的主流處理器系統結構,而RISC-V有可能成為第三大系統結構。在手機晶片和嵌入式晶片領域,ARM64系統結構的處理器占了90%以上的市佔率,而在個人電腦和伺服器領域,x86_64系統結構的處理器占了90%以上的市佔率。在這樣的背景下,越來越多的晶片公司基於ARM64系統結構來打造晶片。此外,蘋果公司也切換到ARM64系統結構上,在2020年年底發佈的基於ARM64系統結構的M1處理器晶片驚豔了全球。
基於ARM64系統結構處理器打造的產品越來越多,ARM64生態也越來越繁榮...
目錄
1 ARM64 系統結構基礎知識
1.1 ARM介紹
1.2 ARMv8系統結構基礎知識
1.3 ARMv8暫存器
1.4 Cortex-A72處理器介紹
1.5 ARMv9系統結構介紹
2 架設樹莓派實驗環境
2.1 樹莓派介紹
2.2 架設樹莓派實驗環境
2.3 BenOS基礎實驗程式解析
2.4 QEMU虛擬機器與ARM64實驗平臺
3 A64 指令集1——載入與儲存指令
3.1 A64指令集介紹
3.2 A64指令編碼格式
3.3 載入與儲存指令
3.4 載入與儲存指令的變種
3.5 存入堆疊與移出堆疊
3.6 MOV指令
3.7 陷阱:你用對載入與儲存指令了嗎
3.8 實驗
4 A64指令集2——算術與移位指令
4.1 條件操作碼
4.2 加法與減法指令
4.3 CMP指令
4.4 關於條件標識位元的範例
4.5 移位指令
4.6 位元操作指令
4.7 位元段操作指令
4.8 實驗
5 A64指令集3——比較指令與跳轉指令
5.1 比較指令
5.2 跳轉與傳回指令
5.3 陷阱:為什麼在RET指令之後系統就崩潰了
5.4 實驗
6 A64 指令集4——其他重要指令
6.1 PC相對位址載入指令
6.2 LDR和ADRP指令的區別
6.3 記憶體獨占存取指令
6.4 異常處理指示
6.5 系統暫存器存取指令
6.6 記憶體屏障指令
6.7 實驗
7 A64 指令集的陷阱
7.1 案例7-1:載入巨集標籤
7.2 案例7-2:載入字串
7.3 案例7-3:讀寫暫存器導致樹莓派4B當機
7.4 案例7-4:LDXR指令導致樹莓派4B當機
7.5 組合語言大作業7-1:在組合語言中實現序列埠輸出功能
7.6 組合語言大作業7-2:分析Linux 5.0的啟動組合語言程式碼
8 GNU組譯器
8.1 編譯流程與ELF檔案
8.2 一個簡單的組合語言程式
8.3 組合語言語法
8.4 常用的虛擬指令
8.5 AArch64依賴特性
8.6 實驗
9 連結器與連結指令稿
9.1 連結器介紹
9.2 連結指令稿
9.3 重定位
9.4 實驗
10 GCC內嵌組合語言程式碼
10.1 內嵌組合語言程式碼基本用法
10.2 案例分析
10.3 實驗
11 異常處理
11.1 異常處理的基本概念
11.2 異常處理與傳回
11.3 異常向量表
11.4 異常現場
11.5 同步異常的解析
11.6 案例分析
11.7 實驗
12 中斷處理
12.1 中斷處理背景知識
12.2 樹莓派4B上的傳統中斷控制器
12.3 ARM核心上的通用計時器
12.4 中斷現場
12.5 案例分析:在樹莓派4B上實現一個計時器
12.6 實驗
13 GIC-V2
13.1 GIC發展歷史
13.2 中斷狀態、中斷觸發方式和硬體中斷編號
13.3 GIC-V2
13.4 樹莓派4B上的GIC-400
13.5 實驗
14 記憶體管理
14.1 記憶體管理基礎知識
14.2 ARM64記憶體管理
14.3 硬體管理存取位元和污染位元
14.4 與位址轉換相關的控制暫存器
14.5 記憶體屬性
14.6 案例分析:在BenOS裡實現恆等映射
14.7 實驗
15 快取記憶體基礎知識
15.1 為什麼需要快取記憶體
15.2 快取記憶體的存取延遲時間
15.3 快取記憶體的工作原理
15.4 快取記憶體的映射方式
15.5 虛擬快取記憶體與物理快取記憶體
15.6 名稱重複和名稱相同問題
15.7 快取記憶體策略
15.8 快取記憶體的共用屬性
15.9 快取記憶體的維護指令
15.10 快取記憶體列舉
15.11 實驗
16 快取一致性
16.1 為什麼需要快取一致性
16.2 快取一致性的分類
16.3 快取一致性的解決方案
16.4 MESI協定
16.5 快取記憶體錯誤分享
16.6 CCI和CCN快取一致性控制器
16.7 案例分析16-1:錯誤分享的避免
16.8 案例分析16-2:DMA和快取記憶體的一致性
16.9 案例分析16-3:自我修改程式碼的一致性
16.10 實驗
17 TLB管理
17.1 TLB基礎知識
17.2 TLB名稱重複與名稱相同問題
17.3 ASID
17.4 TLB管理指令
17.5 TLB案例分析
18 記憶體屏障指令
18.1 記憶體屏障指令產生的原因
18.2 ARM64中的記憶體屏障指令
18.3 案例分析
19 合理使用記憶體屏障指令
19.1 儲存緩衝區與寫入記憶體屏障指令
19.2 無效佇列與讀取記憶體屏障指令
19.3 記憶體屏障指令複習
19.4 ARM64的記憶體屏障指令的區別
19.5 案例分析:Linux核心中的記憶體屏障指令
20 原子操作
20.1 原子操作介紹
20.2 獨占記憶體存取指令
20.3 獨占記憶體存取工作原理
20.4 原子記憶體存取操作指令
20.5 比較並交換指令
20.6 WFE 指令在自旋鎖中的應用
21 作業系統相關話題
21.1 C語言常見陷阱
21.2 函式呼叫標準
21.3 堆疊佈局
21.4 建立處理程序
21.5 簡易處理程序排程器
21.6 系統呼叫
21.7 系統啟動
21.8 實驗
22 浮點運算與NEON 指令
22.1 資料模型
22.2 浮點運算
22.3 NEON指令集
22.4 案例分析22-1:RGB24轉BGR24
22.5 案例分析22-2:4×4矩陣乘法運算
22.6 自動向量最佳化
22.7 實驗
23 可伸縮向量計算與最佳化
23.1 SVE指令介紹
23.2 架設SVE執行和偵錯環境
23.3 SVE特有的程式設計模式
23.4 SVE與SVE2指令集
23.5 案例分析23-1:使用SVE指令最佳化strcmp( )函數
23.6 案例分析23-2:RGB24轉BGR24
23.7 案例分析23-3:4×4矩陣乘法運算
23.8 實驗
1 ARM64 系統結構基礎知識
1.1 ARM介紹
1.2 ARMv8系統結構基礎知識
1.3 ARMv8暫存器
1.4 Cortex-A72處理器介紹
1.5 ARMv9系統結構介紹
2 架設樹莓派實驗環境
2.1 樹莓派介紹
2.2 架設樹莓派實驗環境
2.3 BenOS基礎實驗程式解析
2.4 QEMU虛擬機器與ARM64實驗平臺
3 A64 指令集1——載入與儲存指令
3.1 A64指令集介紹
3.2 A64指令編碼格式
3.3 載入與儲存指令
3.4 載入與儲存指令的變種
3.5 存入堆疊與移出堆疊
3.6 MOV指令
3.7 陷阱:你用對載入與儲存指令了嗎
3.8 實驗
4 A64指令集2——算術與移位指令
4.1 條...
購物須知
退換貨說明:
會員均享有10天的商品猶豫期(含例假日)。若您欲辦理退換貨,請於取得該商品10日內寄回。
辦理退換貨時,請保持商品全新狀態與完整包裝(商品本身、贈品、贈票、附件、內外包裝、保證書、隨貨文件等)一併寄回。若退回商品無法回復原狀者,可能影響退換貨權利之行使或須負擔部分費用。
訂購本商品前請務必詳閱退換貨原則。