assembly 如何在aarch64中处理异常和中断?

t2a7ltrp  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(110)

我有一个简单的裸机应用程序,我在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_tableVBAR_EL1寄存器地址(因为我的应用程序在EL 1级工作)。
据我所知,CPU将使用VBAR_EL1寄存器来找到合适的处理程序的地址并执行它。
很不幸,就这些!我的理解到此为止,接下来只有问题了……
1.为什么作者把table放在2048?
1.为什么他把入口点偏移了0x 80,尽管官方表格上有其他偏移量?

1.我应该在EL 1级别处理哪些异常和中断?
如果有人能用简单的话解释一下,我将非常感激。

rta7y2nd

rta7y2nd1#

1.为什么作者把table放在2048?
因为手册上说低11位是RES0,所以表必须对齐到0x800字节:

1.为什么他把入口点偏移了0x80,尽管官方表格上有其他偏移量?
因为0x80+0x80 = 0x100,0x80+0x80+0x80 = 0x180,等等。
1.我应该在EL1级别处理哪些异常和中断?
所有的人?
如果你不期望得到任何异常,你至少应该让所有异常处理程序调用某种“致命”的动作(内核恐慌,调试器陷阱,或者可能只是无限期地旋转),这样你就可以意识到违反的假设。只要你不主动使用中断、EL0、页面错误等,你就可以完全运行而不会引起异常。当你开始使用更多的CPU特性时,你必须一个接一个地添加异常处理程序。然后,您必须检查ESR_EL1以获取您想要处理的特定异常,并将它们分派给您的处理程序函数,但是一旦您到达那里,这些异常就变得显而易见了。

相关问题