prodigals 发表于 2012-4-21 22:42

关于未定义指令中断,大侠求教..

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"

);
}


引导内核最后一步,居然出现了未定义指令异常中断,看了半天,也没搞明白

xinzha 发表于 2012-4-22 21:11

首先你把在asm中所有c语言风格的注释去掉,虽然我不知道c内嵌汇编时是否允许这么做,但这不是个好习惯。然后你最好看一下反汇编以及出问题时的寄存器列表值,内核没有引导完还是单任务状态,按道理来说中断也没开,应该不难查。

airwill 发表于 2012-4-23 13:16

不知道是什么 CPU, 通常, 非法指令异常时, 堆栈中的 PC 会指向那天非法指令.
再分析一下, 启动代码里, 怎么会执行到那个非法地址去的?
页: [1]
查看完整版本: 关于未定义指令中断,大侠求教..