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

[复制链接]
 楼主| prodigals 发表于 2012-4-21 22:42 | 显示全部楼层 |阅读模式
void  call_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

主题

147

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部