• 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,其余临界地址请参阅上图。

  • 相关阅读:
    HDU 3091 Necklace <<状压dp
    HDU 1074 Doing Homework<<状压dp
    单片机程序设计中的“分层思想”
    单片机的 FIFO循环队列实现
    串口多字节接收
    单片机多字节串口接收(转)
    SD卡应用总结(Fatfs)
    FATFS 初学之 磁盘 I/O接口
    FATFS 初学之 f_gets/ f_putc/ f_puts/ f_printf
    FATFS 初学之 f_chdir/ f_chdrive
  • 原文地址:https://www.cnblogs.com/DF11G/p/14486558.html
Copyright © 2020-2023  润新知