进入向量表时,ARM是否使用物理地址或虚拟地址?

时间:2018-11-01 11:11:34

标签: arm paging mmu

启用分页并发生异常时,是否发生翻译表遍历以访问地址0x00000000的异常向量表?

  1. 如果仍启用分页,那么用户模式进程和向量表如何共享地址0x00000000-TTBR(转换表基址寄存器)不会在异常条目上更新,并且TTBR不是库寄存器(我们不是)这里谈论的是在安全和非安全世界之间切换。
  2. 如果否,那么我们必须使用物理寻址输入异常,在这种情况下,现在已禁用分页?

1 个答案:

答案 0 :(得分:2)

  

启用分页并发生异常时,是否发生翻译表遍历以访问地址0x00000000的异常向量表?

几乎所有ARM CPU都有一种配置异常表地址的方法。因此,在大多数系统中,例外向量表不在地址0x00000000处。但是,在发生异常时会启用MMU。 TLB (MMU /页表缓存)将包含向量表的物理地址。

在某些SOC中,引导向量表可能位于0x0,但这通常是由引导代码重新配置的。

  
      
  1. 如果仍启用分页,那么用户模式进程和向量表如何共享地址0x00000000-TTBR(转换表基址寄存器)不会在异常条目上更新,并且TTBR不是库寄存器(我们不是)这里谈论的是在安全和非安全世界之间切换。
  2.   

如果您希望向量表的地址为0x00000000,那么除非您禁止它,否则它将是用户空间看到的内容。禁止访问0x0可能是防止使用NULL指针的理想设计。许多操作系统没有从0x0开始运行的用户空间,而是从0x8000开始的地址。

基于参数的用户空间故障非常有用,因为您可以在开发进程时捕获NULL指针访问。我建议始终将其保留,但是有些人允许对生产代码进行NULL访问。

  
      
  1. 如果否,那么我们必须使用物理寻址输入异常,在这种情况下,现在已禁用分页?
  2.   

未启用分页,因为高速缓存可能也已启用。如果某些访问是物理访问而其他访问是虚拟访问,则CPU的加载/存储单元将更加复杂。尤其是当缓存由传统ARM CPU中的虚拟地址填充时。