我想编写我的代码来处理Microblaze上的TLB未命中,当然还有页面表等.这些都是在OVPsim上完成的.
在我学习的过程中,我编写了这个小程序集以引用未映射的位置(0x1000000) - 我将此作为特权代码运行,其中VM为:
ori r20, r0, 0 ori r12, r0, 0x1000000 /* next line should break it */ sw r20, r12, r0
(即,将内容写入r20 == 0
ORing形成的地址r12 == 0x1000000
,r0 == 0 => 0x1000000
显然.)
但是,GDB没有跳转到异常向量,而是报告"程序收到SIGSEV" - 我出错了什么?我没有在MSR中启用硬件异常位,但是手册说你无法在任何情况下掩盖这些异常,所以这不应该是问题.
进一步的信息我不能得到任何(例如,包括错位异常)要执行的异常处理代码,(除非我明确地调用它),无论我是否使用调试器.关闭调试器后,我从OVPsim得到这个输出(NB我只是改变了测试地址 - 上面的0xA000000和0x100000之间没有区别):
Processor Exception (PC_PRX) Processor 'platform/cpu0' 0x248: sw r20, r12, r0 Processor Exception (PC_WPX) No write access at 0xa000000
这是所有代码都以特权模式运行,所以除非我没有正确配置Microblaze ,否则我没有看到它没有调用处理程序的明显原因.我打开了这些:
icmAddStringAttr(cpu1_attr, "endian", "big"); icmAddDoubleAttr(cpu1_attr, "mips", 100.000000); icmAddStringAttr(cpu1_attr, "variant", "V8_20"); icmAddBoolAttr(cpu1_attr, "verbose", "true"); icmAddUns32Attr(cpu1_attr, "C_PVR", 2); icmAddUns32Attr(cpu1_attr, "C_USE_MMU", 3); icmAddStringAttr(cpu1_attr, "C_USE_BARREL", "1"); icmAddStringAttr(cpu1_attr, "C_USE_DIV", "1"); icmAddUns32Attr(cpu1_attr, "C_USE_INTERRUPT", 1); icmAddUns32Attr(cpu1_attr, "C_MMU_TLB_ACCESS", 3); icmAddUns32Attr(cpu1_attr, "C_UNALIGNED_EXCEPTIONS", 1); icmAddUns32Attr(cpu1_attr, "C_ILL_OPCODE_EXCEPTION", 1); icmAddUns32Attr(cpu1_attr, "C_DIV_ZERO_EXCEPTION", 1); icmAddUns32Attr(cpu1_attr, "C_OPCODE_0x0_ILLEGAL", 1); icmAddUns32Attr(cpu1_attr, "C_DEBUG_ENABLED", 1);
没有理由相信这不会起作用,因为OVPsim将在Microblaze上运行Linux.