2014-11-06 34 views
1

如何确定L2页表的基地址? (使用ARM Cortex-A9)ARM MMU,处理L2页表

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

u32 *ptr; 
u32 small_page; 

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

现在有一两件事,我还是不明白。 如何确定L2页表基地址?我应该把表格放在L1页面之后吗?

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

另一个可以肯定的问题是,协处理器寄存器TTBR0和TTBR1都保存L1页的基地址。各自为政。 L1和TTBR1不是TTBR0,是吗?

+0

但是......在提出这个问题之前,您已经说过了答案 - L2页表的地址存储在相关L1表的条目中。至于他们实际存在的物理内存中的某处,可以将它们放在任何你想要的地方。 – Notlikethat 2014-11-06 18:00:48

+0

好吧,我现在看到我错了。我以为有一张L2页表。 – Olivier 2014-11-07 10:05:44

+0

这里有很多问题和答案可以提供这些信息。例如,[什么是更新MMU转换表的正确方法](http://stackoverflow.com/questions/16383007/what-is-the-right-way-to-update-mmu-translation-table)。你可以选择一个回答你的问题,然后点击**关闭**并选择该答案作为副本。请参阅:[arm + mmu search](http://stackoverflow.com/search?q= [arm] + mmu)获取可能的候选人。这将有助于未来的读者(如你)找到答案。请注意,所有表都有对齐限制。 – 2014-11-07 14:56:12

回答

0

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

需要的L2翻译表条目的地址是通过取2级翻译表的(1KB对齐的)基地址(由1级翻译表条目给出的)并使用8位虚拟地址(位[19:12])在L2转换表中256个条目内进行索引(因为每个索引4个字节,所以总字节数为256 * 4bytes = 1KB)。