zoukankan      html  css  js  c++  java
  • TTBR0与TTBR1

    ARMv7-A架构中有两个协处理器寄存器用来存放一级页表基地址(PGD),TTBR0和TTBR1(Translation table base register: 页表基地址寄存器)。其中,TTBR0用于存放用户空间的一级页表基址,TTBR1存放内核空间的一级页表基址。

    以TTBR0为例,它的具体实现可以参阅<ARM Architecture Reference Manual(ARMv7-AR)> Page1709:

    如果页表按照4K对齐,那么X=12

     寄存器的访问地址(以Cortex-A9为例)

    写入指令:

     mcr    p15, 0, r1, c2, c0, 0    @ TTB 0
     mcr    p15, 0, r7, c2, c0, 1    @ TTB 1

    读出指令

    mrc    p15, 0, r1, c2, c0, 0    @ TTB 0
    mrc    p15, 0, r7, c2, c0, 1    @ TTB 1

    Trace32写入指令

    per.s c15:0x2 %long 0x24178059  // TTB0
    per.s c15:0x102 %long 0x22304059  //TTB1

     所有的内核进程地址空间的页表是共用一套的,所以TTBR1的值不会改变,TTB1段(Bit[31:x])永远等于init_mm->pgd:

    (注意:init_mm->pgd存储的是虚拟地址,TTBR1需要存储物理地址,下图中两者的映射关系为(Phy:0x22300000)<-->(Vir:0xc0000000))

    TTBR0代表了当前用户进程的页表基地址,其值会随着用户进程的切换而改变。所以TTB0段(Bit[31:x])等于当前任务(task_struct)*->(mm)*->pgd,

    同样需要进行虚拟地址与物理地址关系的转换。

     

    ARMv7-A根据TTBCR寄存器的N位决定使用TTBR0还是TTBR1:

    N位在TTBCR寄存器的Bit[2:0],它也决定了TTBR寄存器的X(X=14-TTBCR.N)

     

    根据描述:

    如果 N==0,也就是 系统中没有配置 TTBCR的默认值,那么 ARM 总是使用 TTBR0来翻译虚拟地址 , 所以默认情况下,TTBR1是没有用的。
    如果 N==1, 那么当 ARM 遇到大于等于0x80000000的地址时,就 需要使 用 TTBR1寄存器指向的映射表来转换虚拟地址 ,相应地 落在[0x0000000, 0x8000000]范围内的虚拟地址需要使用TTBR0映射表来翻译。

    N=2, 临界地址是0x40000000,其余临界地址请参阅上图。

  • 相关阅读:
    pytroch resnet构建过程理解
    python 参数前星号(*)的用法
    Win10 + Visual Studio 2017 下 OpenCV无法显示图像的问题
    模板类中的友元函数
    caltech行人检测数据集上的论文
    (转)使用K-S检验一个数列是否服从正态分布、两个数列是否服从相同的分布
    matplotlib较好的博客
    Python 获取时间戳
    (转载)keras使用入门及3D卷积神经网络资源
    linux 下的字典安装
  • 原文地址:https://www.cnblogs.com/DF11G/p/14486558.html
Copyright © 2011-2022 走看看