我qemu-system-aarch64用來在 x86 主機上模擬raspi3(ARM Cortex A-53)。這是我用來啟動裸機映像的命令:
$ qemu-system-aarch64 --version
QEMU emulator version 4.2.1 (Debian 1:4.2-3ubuntu6.18)
Copyright (c) 2003-2019 Fabrice Bellard and the QEMU Project developers
$ qemu-system-aarch64 -M raspi3 -kernel kernel8.img -serial null -serial stdio -display none
的代碼kernel8.img取自這里:https ://github.com/s-matyukevich/raspberry-pi-os/tree/master/src/lesson02/src 。以下函式用于獲取當前例外級別:
.globl get_el
get_el:
mrs x0, CurrentEL
lsr x0, x0, #2
ret
以下代碼嘗試在啟動時切換到 EL1,我不得不將其注釋掉,否則這段代碼將無限期掛起:
master:
ldr x0, =SCTLR_VALUE_MMU_DISABLED
msr sctlr_el1, x0
ldr x0, =HCR_VALUE
msr hcr_el2, x0
ldr x0, =SCR_VALUE
msr scr_el3, x0
ldr x0, =SPSR_VALUE
msr spsr_el3, x0
adr x0, el1_entry
msr elr_el3, x0
eret
在上面這段代碼被注釋之后,我的程式至少可以運行,但將例外級別列印為 2。
我有以下兩個問題:
- 根據相應的repo 檔案,當我們使用管理程式時,主機作業系統使用 EL2,因此來賓作業系統使用 EL1 或 EL0。但是為什么我的裸機客戶作業系統默認進入 EL2 呢?根據我的理解,它應該是 EL1。此外,SO 上的這篇較早的帖子也啟動了 EL1。不確定是否發生了變化,或者我是否遺漏了任何東西。
- 為什么切換到 EL1 的代碼掛在 line 上
msr scr_el3, x0?
uj5u.com熱心網友回復:
你在 EL2 上跑步。指令“msr scr_el3, x0”試圖寫入一個僅限 EL3 的暫存器,如果你從較低的 EL 嘗試它會導致 UNDEF 例外。換句話說,您嘗試使用的代碼片段是為在 EL3 上運行而撰寫的,如果您想在 EL2 上運行它,則需要進行更改。
您的代碼在 EL2 上運行的原因是因為您使用了 QEMU 的“-kernel”引數并傳遞給它一個二進制(非 ELF)檔案,它告訴 QEMU“您應該按照 Linux 內核啟動協議檔案的方式啟動我應該啟動 Linux 內核”。該協議說“從 EL2 或 EL1 開始,推薦使用 EL2”,這就是 QEMU 所做的。
有關 QEMU 為加載訪客代碼提供的各種選項的更多資訊,請參閱此答案。請注意,QEMU 不提供“以 Raspberry PI bootrom 代碼啟動它的方式啟動此映像或 ELF 檔案”:您可能需要稍微調整旨在在真實裸機板上運行的代碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/424432.html
