关于未定义指令中断,大侠求教..
voidcall_linux(long a0, long a1, long a2){
__asm__(
//"mov
r0, %0\n"
//"mov
r1, %1\n"
//"mov
r2, %2\n"
"mov
r0, a0\n"
"mov
r1, a1\n"
"mov
r2, a2\n"
"mov
ip, #0\n"
"mcr
p15, 0, ip, c13, c0, 0\n"
/* zero PID */
"mcr
p15, 0, ip, c7, c7, 0\n"
/* invalidate I,D caches */
"mcr
p15, 0, ip, c7, c10, 4\n"
/* drain write buffer */
"mcr
p15, 0, ip, c8, c7, 0\n"
/* invalidate I,D TLBs */
"mrc
p15, 0, ip, c1, c0, 0\n"
/* get control register */
"bic
ip, ip, #0x0001\n"
/* disable MMU */
"mcr
p15, 0, ip, c1, c0, 0\n"
/* write control register */
"mov
pc, r2\n"
"nop\n"
"nop\n"
: /* no outpus */
: "r" (a0), "r" (a1), "r" (a2)
: "r0","r1","r2","ip"
);
}
引导内核最后一步,居然出现了未定义指令异常中断,看了半天,也没搞明白 首先你把在asm中所有c语言风格的注释去掉,虽然我不知道c内嵌汇编时是否允许这么做,但这不是个好习惯。然后你最好看一下反汇编以及出问题时的寄存器列表值,内核没有引导完还是单任务状态,按道理来说中断也没开,应该不难查。 不知道是什么 CPU, 通常, 非法指令异常时, 堆栈中的 PC 会指向那天非法指令.
再分析一下, 启动代码里, 怎么会执行到那个非法地址去的?
页:
[1]