我想创建一个数据中止和预取中止来测试是否正确调用了相同的异常处理程序。根据我的理解,取消对空指针的引用会导致数据中止。但我不知道如何为测试创建预取中止。我正在研究armv7a。我没有使用任何操作系统,正在研究引导代码。

最佳答案

这两个都是总线故障,跳转到未知代码将导致未定义的指令不是预取中止。我将重点放在未分配的访问上,用位1设置一个ldr,用位1设置一个bx(但没有设置位0),这是我开始的地方。如果这些不起作用,芯片内的测试夹具就不可能起作用。
可能有部分地址空间没有响应,这些应该只是挂起处理器,但你可能会幸运,内存控制器返回一个故障。
如果您的系统中有奇偶校验或ecc,这将是最好的方法,假设您有方法将错误注入这些内存以强制奇偶校验或ecc故障(也假设内存控制器,etc对于该设计(与您的问题相关的逻辑很少或根本不是ARM处理器的一部分)返回奇偶校验或ecc错误的错误。
cortex-m可能会在某些地址空间上出错,因为它们在某种程度上决定了你应该去哪里。
如果一个较新的内核可以使用mmus保护,我不知道它是否返回数据/预取错误,请设置mmu,使某些空间处于不同的访问级别,而不是您将要使用的代码,并看看您会得到什么错误。
编辑
必须查找armv7,但在armv6(例如pi 1)上,如果我在控制寄存器中启用对齐检查,并执行地址为0x1001的ldr(这是对齐错误),则它会给我一个数据中止。
保存一行代码并使用地址0x01

mrc p15, 0, r0, c1, c0, 0
orr r0,#2
mcr p15, 0, r0, c1, c0, 0
mov r0,#0x1
ldr r0,[r0]

跳转到无效指令会导致未定义的非预取中止,内存系统必须断言中止,因此您很可能会使用mmu执行此操作,
未定义的异常
.globl TEST
TEST:
    .word 0xFFFFFFFF
    bx lr

进行预取中止的最简单方法(如ARM中所述)。
.globl TEST
TEST:
    bkpt

10-02 02:02
查看更多