关于一个arm 异常向量表的问题的扩展
今天在上chinaunix 的时候,一个网友有关中断向量表的问题。
具体的链接http://bbs.chinaunix.net/thread-3620484-1-1.html,对于这个问题,我讲了我的一些看法,那个同学表示completely 明白了,我也觉的很高兴~
对于问题,我觉的牵扯的东西还是比较多,所以我今天就决定就这个问题,在简单的拓展一下~
对于一个特定(ARM)的机器而言,一般有3个软件的生命周期。
第一个 生命的周期称之为 rom boot(一级boot),这是有具体的芯片生产商来实现的。这个rom boot 十分重要,因为它跟你具体的产品量产,以及机器的启动方式有着很重要的关系.
三星 有个芯片叫 6410 ,它的启动方式有 nand flash 启动 和sd 启动,就是说你可以通过多个外部 IO 口的高低电平来确定是从SD 启动,还是从nand flash 启动.那么为什么会这样呀?
原因就是rom boot.比如说,如果6410 是从SD 启动,那么rom 会根据外部 IO 高低电平来得知这个信息,并从SD 卡的某个扇区读取数据(这个数据是用户自己的软件,对于6410来讲 是uboot),加载到ddr 中.
第二个 生命的周期是 boot loader (二级boot)
第三个生命的周期是 system
对于发帖的内容我是这个回应的,
就是在bootloader 和你的system 是运行在同一机器上两个不同的软件。
uboot 完成必要的操作后,就把控制权交给了system
这里面有两个阶段
阶段1 uboot 运行阶段,这时候如果出现异常,就会转到绝对地址(假设映射的是存储介质A)上去比如说 undefine,但是在udefine 处理中,是一个死循环,这个也是有道理的,因为在bootloader 中不允许出现异常,所以这时候你要检查你自己bootloader 中的代码。
阶段2 system运行阶段, 由于这个时候,已经进行了地址的remap ,所以绝对地址 映射的是不同的存储介质B。介质B中的undefine 中的处理就是system 软件定义的undefine ,和你uboot中的不是一回事。
从上面我的回应可以看出
我主要阐明的观点是
软件的生命周期 。发帖的同学其实是把软件的第二生命周期和第三生命周期混为一谈了。
接着读者又问
现在不解的问题是,是不是编译器把异常向量编译到特定的地址上,然后CPU发生异常才跳转呢? 不管你的代码怎么写的,只要发生(undefine)异常,cpu就会到0x00000004 这个地址去指令 其他的异常也是一样(这是一个硬件的行为)。具体你0x00000004 上是什么内容,那就是你软件的事情了(你写的代码和编译的事情了)。 还有我们是不是必须在整个程序的第二行开始写异常向量表呢, 恩,这个是规定好的,我见过的程序都是这样写的,另外arm 相关的手册上应该有相应的说明内容。 这是一种和编译器的约定吗? 这个是arm 硬件约定的,但是需要用编译的来实现,确定把处理异常的代码放在正确的位置(中断向量表) |
通过我上面的回答,可以看出有时候具体的软件的code 是和硬件息息相关的,哪个位置需要什么样的代码,都是规定好的,我觉得这是一个驱动软件和应用软件的区别。如果要做底层软件的话,也必须了解硬件,因为有些代码可能看起来是没有逻辑的,但是这些代码的逻辑性确实是存在的,只不过这个观看代码的主体不是人,而是你的机器,你的硬件,你的网卡,你的SD host,太多了~
arm异常向量 相关文章:
- ARM异常向量表初始化(11-10)
- ARM异常向量表中LDR指令、LDR伪指令的来龙去脉(11-10)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)
- openwebmailV1.60安装教学(11-12)