打印

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

[复制链接]
1956|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
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

粉丝