Try   HackMD

2019q1 Homework4 (smallsys)

contributed by < flawless0714 >

自我檢查清單

  • 你是否詳閱 手機裡頭的 ARM 處理器:系列講座 呢?請紀錄學習過程中遇到的問題
  • 請解釋 AArch64 個別通用暫存器的作用,依據 Linux on AArch64
    ARM 64-bit Architecture
    的描述,搭配實際的程式碼說明。提示: 簡報第 19 頁附有參考資訊
    • 回答
      • 暫存器
        • 共有31個大小為 64-bit 的通用暫存器(X0~X30);
        • X0 ~ X7 為 parameter/result 暫存器;
        • X8 (XR) 為 indirect result location 暫存器
          主要用於保存函數回傳大物件(e.g. 大結構體)時大物件的記憶體位置,以減少暫存器的使用量(一般函數回傳值僅用暫存器來保存)。
        • X9 ~ X15 為 temporary 暫存器
          通常用於保存區域變數。
        • X16 ~ X17 (跟別為 IP0, IP1)
          用於 intra-procedure-call (保存 Veneer code (詳見)與 PLT code 之位置),也可當作 temporary 暫存器用。
        • X18
          可作為 platform 暫存器用,也可作為 temp 暫存器。
        • X19 ~ X28
          Callee saved register。這幾個暫存器在 function call 或 context switch 時應由 callee 保存。
        • X29 (FP, Frame Pointer);
        • X30 (LR, Link Register)
          注意,在 AArch64 下切換 exception level 時不會用到此暫存器(僅用於一般 function call 等等),而是使用 ELR 暫存器。
        • 不同的 Exception Level 有個別的 SP (Stack Pointer);
        • ELR 暫存器
          AArch64 處理器有四個 privilege level (EL0~EL3)。而切換這些 privilege level 則是透過 exception 進行,每當發生切換 exception 時,return address 就會被保存到 ELR 暫存器。值得注意的是,EL0 是沒有 ELR 暫存器的,原因是其處於最低的 privilege level,而通常只會有 user mode (EL0) 需要執行 privilege instruction 時需要提昇更高權限的情況發生,提昇權限執行完後會需要 ELR 儲存的返回位置,不會有高權限的 code 執行到一半切到 user mode 後需要紀錄返回位置的情況。
        • low privilege level 使用的暫存器寬度不能較 high privilege level 時使用的
          E.g. 不能在 EL0 使用 64-bit 的暫存器而同時在 EL1 使用 32-bit 的暫存器。
  • AArch64 定義四種例外等級: EL0, EL1, EL2, EL3,請找出相關文件 (儘量是 Arm 公司的第一手材料) 並搭配 Linux 核心原始程式碼解說
  • linux-kernel-module-cheat 提及透過 GDB 對 QEMU 模擬的虛擬硬體之上的 Linux 核心進行追蹤和除錯,請解釋具體原理。提示: 應一併說明 GDB stub 和 QEMU/Debugging with QEMU 的運作機制

筆記

AArch64

AArch64 與 AArch32 間之切換

兩者透過 exception 進行切換。需注意 AArch64 無法與 AArch32 交流資訊,也就是說每次切換後處理器不該嘗試使用上個模式暫存器留下的資料等等。

暫存器

  • AArch64 的暫存器名為 Xn, 而 AArch32 為 Rn;

Veneer code

當 linker 發現現存指令(BL,最大可跳躍 32MB)無法跳躍到目標 .text section 時,linker 就會插入 Veneer code。Veneer 可想像是一個中繼點,用於幫助跳躍到目標 context 以繼續執行。值得注意的是 Veneer 又有分成三種,以下將簡單說明(詳見):

  • Inline veneer
    僅用於 state change (Thumb mode 與 ARM mode)。僅使用相對位置進行跳躍。
  • Short branch veneer
    用於 ARM-Thumb 兩個模式間的跳躍。可跳躍距離為 32MB,即為 BL (ARM instruction) 之距離。
  • Long branch veneer
    可任意跳躍。可穿梭於 ARM 與 Thumb 模式之間。可使用絕對位址與相對位址跳躍,須注意如此兩者實做即不同。

Kernel 編譯

第一次編譯

使用 5.0.7 版本的 kernel,buildroot 相關設定可參考 repo,以下為開機後的畫面截圖:

Image Not Showing Possible Reasons
  • The image file may be corrupted
  • The server hosting the image is unavailable
  • The image path is incorrect
  • The image format is not supported
Learn More →

參考資料

tags: linux2019