我有一个简单的裸机应用程序,我在Qemu中通过下一个命令启动:
qemu-system-aarch64 -M virt \
-cpu cortex-a72 \
-bios "$(QEMU_PATH)/share/qemu/edk2-aarch64-code.fd" \
-m 128M \
-nographic \
-device loader,file=$(BUILD_DIR)/kernel.elf \
-device loader,addr=0x40100000,cpu-num=0
现在我尝试处理异常和中断,但不幸的是,我对这个主题读得越多,我就越不了解如何处理它们。aarch64
提供了四个级别:EL3 -> EL0。我已经检查了我的应用程序是在Qemu在EL 1级启动,好吧,操作系统级,一切都是正确的。
接下来,互联网上的各种教程向我们展示了如下内容:
.text
.global vector_table
.balign 2048
vector_table:
b .
.balign 0x80
b .
.balign 0x80
b .
.balign 0x80
b .
...
adr x0, vector_table
msr VBAR_EL2, x0
从这个清单中,我得到了我需要加载我的vector_table
到VBAR_EL1
寄存器地址(因为我的应用程序在EL 1级工作)。
据我所知,CPU将使用VBAR_EL1寄存器来找到合适的处理程序的地址并执行它。
很不幸,就这些!我的理解到此为止,接下来只有问题了……
1.为什么作者把table放在2048?
1.为什么他把入口点偏移了0x 80,尽管官方表格上有其他偏移量?
1.我应该在EL 1级别处理哪些异常和中断?
如果有人能用简单的话解释一下,我将非常感激。
1条答案
按热度按时间rta7y2nd1#
1.为什么作者把table放在2048?
因为手册上说低11位是
RES0
,所以表必须对齐到0x800字节:1.为什么他把入口点偏移了0x80,尽管官方表格上有其他偏移量?
因为0x80+0x80 = 0x100,0x80+0x80+0x80 = 0x180,等等。
1.我应该在EL1级别处理哪些异常和中断?
所有的人?
如果你不期望得到任何异常,你至少应该让所有异常处理程序调用某种“致命”的动作(内核恐慌,调试器陷阱,或者可能只是无限期地旋转),这样你就可以意识到违反的假设。只要你不主动使用中断、EL0、页面错误等,你就可以完全运行而不会引起异常。当你开始使用更多的CPU特性时,你必须一个接一个地添加异常处理程序。然后,您必须检查
ESR_EL1
以获取您想要处理的特定异常,并将它们分派给您的处理程序函数,但是一旦您到达那里,这些异常就变得显而易见了。