免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3047 | 回复: 9
打印 上一主题 下一主题

求教异常向量调用的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-11-18 17:27 |只看该作者 |倒序浏览
在uboot的start.s里看到了如下代码:
.globl _start
_start: b       start_code
ldr     pc, _undefined_instruction
ldr     pc, _software_interrupt
ldr     pc, _prefetch_abort
ldr     pc, _data_abort
ldr     pc, _not_used
ldr     pc, _irq
ldr     pc, _fiq

_undefined_instruction: .word undefined_instruction
_software_interrupt:    .word software_interrupt
_prefetch_abort:        .word prefetch_abort
_data_abort:            .word data_abort
_not_used:              .word not_used
_irq:                   .word irq
_fiq:                   .word fiq



依照我的理解,异常向量是系统发生异常的时候,要跳转到的指令。可是这上来就是ldr     pc, _undefined_instruction这样的指令,岂不是把向量对应的代码挨个执行一遍,这也没有把向量放到某处啊。
很疑惑,麻烦大家指点下,谢谢了!

论坛徽章:
0
2 [报告]
发表于 2011-11-18 17:43 |只看该作者
还是说undefined_instruction这个函数负责把undefined这种异常对应要执行的代码拷贝到目的地?

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
3 [报告]
发表于 2011-11-19 12:04 |只看该作者
本帖最后由 linuxfellow 于 2011-11-19 12:09 编辑

这是系统异常向量表, 不是让你一条一条来顺序执行的。这是系统remap之前用的中断向量。除了reset vector 有意义外,其他基本上是死循环。
系统重启动时, 就走第一个向量 执行 b start_code, 跳到下面start_code下执行startup code.
如果系统出现问题,执行到一条不认识的指令时,这时系统异常中断发生,系统跳转到第二个向量, 执行ldr     pc, _undefined_instruction;这时pc被设置成undefined_instruction,CPU到_undefined_instruction地址去执行这一地址下的指令, 结果还是一个未定义指令,如此循环下去; 其他异常向量,原理类似。

论坛徽章:
0
4 [报告]
发表于 2011-11-19 16:40 |只看该作者
回复 3# linuxfellow
谢谢指点,我还有一点不太明白,我的确看到一些资料说最初的代码应该写中断向量,也知道中断向量是在一个确定的地址上顺序排列的。那是不是说我们在程序的最初写中断向量是和编译器的一个约定,编译器会把这些跳转指令编译到特定的地址上?另一个问题是,remap之后的中断向量在哪呢?貌似没发现。。谢谢指点!

论坛徽章:
1
拜羊年徽章
日期:2015-03-03 16:15:43
5 [报告]
发表于 2011-11-19 20:44 |只看该作者
中断信号,中断向量位置及其remap是由CPU内部硬件决定的,不是有编译器决定。你的程序必须按照CPU的要求把处理某个中断源的处理程序放在指定的地址。你可以读读CPU手册的中断处理这一章。你要的信息应该都在那里。

论坛徽章:
0
6 [报告]
发表于 2011-11-21 00:05 |只看该作者
回复 5# linuxfellow
谢谢指点!,但我还是略有疑问,我知道如果CPU出现异常,比如出现软件异常,CPU就会跳转到0xffff0008这个地址上,就是把pc赋值为0xffff0008,这个地址就应该是ldr     pc, _software_interrupt这条指令,但我不解的是,uboot先是
.globl _start
_start: b       start_code
然后是异常向量表,但这些异常向量是怎么到指定地址的,比如说ldr     pc, _software_interrupt怎么到0xffff0008这个地址上的,是不是arm编译器的设定,就是说第一条代码可以是b start_code这种跳转指令,但第二条就要开始写异常向量?然后编译器把这些异常响亮编译到CPU规范指定的地址上,cpu发生异常就会找到它?请问是这样的吗,还是另有玄机?再次表示感谢啊!!!!

论坛徽章:
0
7 [报告]
发表于 2011-11-21 09:47 |只看该作者
回复 1# 相逢的日子


    首先你要明确一点:
就是在bootloaer 和你的system 是运行在同一机器上两个不同的软件。
uboot 完成必要的操作后,就把控制权交给了system
这里面有两个阶段
阶段1 uboot 运行阶段,这时候如果出现异常,就会转到绝对地址(假设映射的是存储介质A)上去比如说 undefine,但是在udefine 处理中,是一个死循环,这个也是有道理的,因为在bootloader 中不允许出现异常,所以这时候你要检查你自己bootloader 中的代码。
阶段2 system运行阶段, 由于这个时候,已经进行了地址的remap ,所以绝对地址 映射的是不同的存储介质B。介质B中的undefine 中的处理就是system 软件定义的undefine ,和你uboot中的不是一回事。

评分

参与人数 1可用积分 +10 收起 理由
bitmilong + 10 感谢分享

查看全部评分

论坛徽章:
0
8 [报告]
发表于 2011-11-21 11:35 |只看该作者
回复 7# npuazm
谢谢指点!现在不解的问题是,是不是编译器把异常向量编译到特定的地址上,然后CPU发生异常才跳转呢?还有我们是不是必须在整个程序的第二行开始写异常向量表呢,这是一种和编译器的约定吗

论坛徽章:
0
9 [报告]
发表于 2011-11-21 11:56 |只看该作者
现在不解的问题是,是不是编译器把异常向量编译到特定的地址上,然后CPU发生异常才跳转呢?


不管你的代码怎么写的,只要发生(undefine)异常,cpu就会到0x00000004 这个地址去指令
其他的异常也是一样(这是一个硬件的行为)。具体你0x00000004 上是什么内容,那就是你软件的事情了(你写的代码和编译的事情了)。



还有我们是不是必须在整个程序的第二行开始写异常向量表呢,

恩,这个是规定好的,我见过的程序都是这样写的,另外arm 相关的手册上应该有相应的说明内容。

这是一种和编译器的约定吗?
这个是arm 硬件约定的,但是需要用编译的来实现,确定把处理异常的代码放在正确的位置(中断向量表)

论坛徽章:
0
10 [报告]
发表于 2011-11-21 12:00 |只看该作者
回复 9# npuazm
啊,谢谢了,这次完全懂了,十分感谢!!!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP