Vir*_*mar 1 linux arm avr interrupt bootloader
我在网上的一些教程中读到,中断的分支地址已经硬连线.他们为什么需要在引导程序中创建IVT?
问题是您希望有不同的硬件检测事件或异常或中断,无论您想要调用它们.并且您希望有机会根据该事件运行单独的代码.硬件必须以某种方式将控制权移交给那些单独的例程.因此对于每个处理器架构都有一个解决方案.通常我们只是将它称为基于历史的中断向量表,但有些人可能称之为异常表,而在arm的情况下(大多数不是所有的武器)它真的是一个表,因为它不是地址列表而是实际指令?
代码执行的地址通常不是硬编码的,在ARM是的情况下,但通常中断向量表是地址列表,该表的位置和表中的每个条目是固定地址但在某种程度上软件人员在该表中填写代码地址.这些情况的硬件检测到事件,基于该事件从已知到所有位置的存储器读取,该位置包含地址并且它开始在该地址处获取/运行.要执行的硬编码地址最终会出现arm情况或类似情况,例如,重置为0x0000并且预取中止为0x1000,数据中止为0x2000等,这是没有意义的.您希望该表指令或地址为要好又紧.除非获得专利,否则您可以为几乎任何架构创建一个类似于表的臂,每个例外可能超过四个字节,但您仍然可以这样做.或者只是做地址的事情.
ARM已经切换到Cortex-M中的传统地址,但与传统的地址不同,有几十个可能有数百个单独的向量(在微控制器中!)每个小东西都有一个入口点.原因在于,如果你在他们的文档中读取或者在它们之间读取的是cortex-m被设计为不需要在C处理程序周围组装,使用传统处理器中断返回是特殊的并且需要特殊指令,例如,中断的输入通常涉及保存所有寄存器,其中该处理器的C调用约定可能没有保存所有内容.因此需要一些程序集和/或编译器特定的指令来让编译器为您完成.使用皮质m你可以有一个正常的,而不是特殊的C函数,只需将地址放在正确位置的巨大中断向量表中的那个C函数.
为什么在引导程序中.
因此,您通常会在该架构的向量表地址处及其周围划出一块地址空间,并将非易失性存储器放在那里.通常在附近但不需要你需要一块地址空间来为重置处理程序放置一个非易失性存储器,否则你根本无法启动处理器(如果处理器使用表中的地址来找到重置处理程序,一个典型的解决方案).
因为你已经在flash/rom中有一个矢量表项,所以你把剩下的就放在那里.并将整个事件称为引导程序.一旦启动,您可能希望将向量表设置为volatile,以便您可以在基于操作系统的处理程序中指向引导加载程序而不是非易失性指向引导加载程序处理程序或空间中的某些硬编码地址.并且有很多不同的方法可以解决这个问题,一般类别的内存控制器切换到ram(启动和运行后),让引导加载程序处理程序使用某种间接到某些ram位置,除了重置.你如何实现它等等各不相同.例如,在系统中使用MMU,您可以轻松地将矢量表重新映射到ram ...
在中断向量表岂止中断.它也称为异常表.有两种一般形式,
例如,在68K上,地址0x8处的值可以用作数据故障函数指针.在传统的ARM cpu上,数据错误异常会将程序计数器设置为地址0x8.中断处理程序可能位于偏移量0x10等处.该表处理的不仅仅是中断.在ARM上,
如您所见,有多个条目.通过使用表格,CPU硬件可以是最小的,只需要知道一个地址而不是七个或更多.在较旧的ARM系统中,矢量表可以根据供应商配置的方式为高或低(0xffff0000或0x0).在较新的(至少Cortex-A)中,您可以使用指定表地址VBAR.
那为什么我们需要在引导程序中创建IVT?
偏移量可以固定在芯片中.引导加载程序需要将代码放在那里,以便有一些东西可以处理它.
可以说我们家里有一个邮箱.邮递员把邮件放在盒子里.我们去包装盒并删除邮件.邮箱是矢量表位置.帖子是CPU.我们是向量表中的代码.邮箱和矢量表位置位于固定位置.
| 归档时间: |
|
| 查看次数: |
1568 次 |
| 最近记录: |