Lab 1
boot 時在 .text.boot 中只讓 core 0 繼續跑,其他進入 wfe(wait for event)
通過 mpidr_el1 暫存器的值可以知道現在在執行的核心是那顆 ,mpidr_el1 是一個 64 bit 的暫存器,不同的區域分別表示了不同的資訊,根據以下表格可以得知想要知道在哪顆 core 要看 [15:8]。
[63:40] Reserved RES0 [39:32] Affinity Level 3 晚點補 [31] Reserved RES1 [30] U 表示是不是單處理器系統 [29:25] Reserved RES2 [24] MT 還沒看懂 [23:16] Affinity Level 2 表示是系統的第幾個 cluster [15:8] Affinity Level 1 表示是 cluster 的第幾個 core [7:0] Affinity Level 0 表示是 core 的第幾個 thread gpio
設置 GPIO Function Select Registers (GPFSELn),要將 GPIO 14 跟 15 的 pin 腳設置成 mini uart (alternate function 5) 要將 [17-15] 跟 [14-12] 設成 010。
31-18 17-15 14-12 11-0 0 010 010 0 對應的 16 進位便是 0x12000
mini uart
在使用字串時,編譯器會將字串放在 .rodata.str1.1 而不是 .rodata,導致 .text.boot 會被放置再不正確的位置導致無法啟動(通過 llvm-objdump -x 發現),因此將 linker 腳本的 .rodata 改成 .rodata* 。
非對齊存取很燥
Lab 2
Reboot / Simple Allocator
Reboot: 沒啥好寫,抄上去就會 reboot 了
Simple Allocator: 就很 Simple,所以也沒啥好寫
Rpi3 booting process → uart bootloader
rpi3 是採用 gpu bootloader 的方式,在啟動時主要由 gpu 負責初始化硬體並載入 start.elf,再跳至 0x80000 執行 kernel8.img 的內容,在這次的 lab 我們需要做的是通過手寫另外一個 kernel 並在裡面通過 uart 傳輸真的 kernel,其實也不算 bootloader,比較像 kernel loader,具體實作也不難,只須通過 uart 將實作好的 kernel image 放在特定位置,傳輸結束再 br 到相應的地址就好。
CPIO / Devicetree
這兩個內容整體來上差不多,gpu bootloader 會分別將 binary 放在特定位置,在 kernel load 的時候我們需要去 parse 裡面實際的內容,具體內容需要花一些時間看文檔,但都不會到太複雜,看文檔的時間應該比寫扣的時間還長了。
Lab 3
skip…
反正就一直用 lldb 看他有沒有跳到正確的位置XD,然後翻文件,然後就做完了。
Lab 4
待補 …