1

我们如何确定 L2 页表的基地址?(使用 ARM Cortex-A9)

例如,如果我有一个需要 7KB 数据空间并从地址 0x0 开始的程序,我需要两页 4KB。为此,我在 L1 页表中添加了一个指向 L2 页表基地址的条目。然后我像这样在 L2 页表中添加两个条目(第一页的 addr = 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 不是 TTBR0,L2 不是 TTBR1,是吗?

4

1 回答 1

0

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

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

于 2015-04-16T01:02:37.990 回答