Arm 臂MMU,手柄L2页表

Arm 臂MMU,手柄L2页表,arm,mmu,cortex-a,Arm,Mmu,Cortex A,如何确定L2页表的基址?(使用手臂皮质-A9) 例如,如果我有一个需要7KB数据空间并从地址0x0开始的程序,我需要两个4KB的页面。 为此,我在L1页表中添加了一个条目,该条目指向L2页表的基址。 然后我在L2页表中添加两个条目,如下所示(第一页的addr=0x0,第二页的addr=0x1000) 现在有一件事我仍然不明白。 如何确定L2页表的基址?我应该把表格放在第一页表格后面吗 我可以把地址存放在哪里?我知道L1页表的基址存储在协处理器寄存器中,但我没有找到任何寄存器来存储L2基址 另一个

如何确定L2页表的基址?(使用手臂皮质-A9)

例如,如果我有一个需要7KB数据空间并从地址0x0开始的程序,我需要两个4KB的页面。 为此,我在L1页表中添加了一个条目,该条目指向L2页表的基址。 然后我在L2页表中添加两个条目,如下所示(第一页的addr=0x0,第二页的addr=0x1000)

现在有一件事我仍然不明白。 如何确定L2页表的基址?我应该把表格放在第一页表格后面吗

我可以把地址存放在哪里?我知道L1页表的基址存储在协处理器寄存器中,但我没有找到任何寄存器来存储L2基址


另一个需要确定的问题是,协处理器寄存器TTBR0和TTBR1都保存L1页的基址。每个都有自己的。L1不是TTBR0,L2不是TTBR1,是吗?

我建议阅读Cortex-A系列程序员指南第9章内存管理单元。在这里,您可以找到关于基址存储的清晰解释。1级TTB的基址存储在两个基址寄存器之一(TTRB 0/1,取决于表中定位的是操作系统代码还是用户进程代码)。这两个基址寄存器在上下文切换时很有用


所需的二级翻译表项的地址是通过获取二级翻译表的(1KB对齐的)基址(由一级翻译表项给出)并使用虚拟地址的8位(位[19:12])在二级翻译表的256个项内建立索引来计算的(256,因为每个索引有4个字节,所以总字节数为256*4字节=1KB).

但是…在提问之前,您已经说明了答案-L2页表的地址存储在相关L1表的条目中。至于它们在物理内存中的实际位置,您可以将它们放在任何您想要的地方。好的,我现在知道我错在哪里了。我以为有一个L2页表的表。有很多问题此处的选项和答案将提供此信息。例如,。您可以选择一个回答您的问题的选项,然后单击“关闭”并选择该答案作为副本。请参阅:了解可能的候选人。这将帮助未来的读者(如您)找到答案。注意,所有表格都有对齐限制。
u32 *ptr;
u32 small_page;

small_page = addr / 0x1000;
ptr        = small_page + L2_table_base_addr;
*ptr       = (addr & 0xFFFFF) | attributes;