很长时刻没有写bolg了,看看各位同仁的博客,让我很羞愧,我决议从今日开端,尽力坚持写blog,加油~
今日在上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 这个地址去指令 还有咱们是不是有必要在整个程序的第二行开端写反常向量表呢, 恩,这个是规定好的,我见过的程序都是这样写的,别的arm 相关的手册上应该有相应的阐明内容。 这是一种和编译器的约好吗? |
经过我上面的答复,能够看出有时分详细的软件的code 是和硬件休戚相关的,哪个方位需求什么样的代码,都是规定好的,我觉得这是一个驱动软件和应用软件的差异。假如要做底层软件的话,也有必要了解硬件,由于有些代码或许看起来是没有逻辑的,可是这些代码的逻辑性确实是存在的,只不过这个观看代码的主体不是人,而是你的机器,你的硬件,你的网卡,你的SD host,太多了~