arm - MMU:AARCH64 中的长描述符页表大小
问题描述
我想了解,AARCH64 中每个级别的内存都被 4k 粒度的页表覆盖。
使用 47 位 VA,One 可以具有 0 级到 3 级。
在 0 级可能有一个表描述 512 个 1 级页表,现在每个 1 级页表可以描述 512 个 2 级页表,并且每个 2 级页表可以描述 512 个 3 级页表。
所以在级别 3 有 512 个大小为 4k 的页表,内存覆盖为 512*4k = 2MB ,这是只有一个级别 2 的页表可以覆盖的内容,如果我们在级别 2 有 512 个这样的级别页表,那么总内存覆盖的是 512*2MB = 1GB,对吧?
类似地,第 1 级的每个表都指向 512 个第 2 级页表(其中每个第 2 级页表覆盖 2MB)。
所以,512*2MB=1GB,如果我们有 512 个 1 级页表,总内存是 512GB,对吧?
类似地,0 级覆盖的总内存是 1024 GB,对吧?
解决方案
您似乎将单个页表条目与整个页表混合在一起,以某种方式丢失了一个级别并添加了一点而不是减去了它。
单页:4'096
3级表:4096*512 = 2'097'152 = 2MB
2级表:4096*512*512 = 1'073'741'824 = 1GB
1级表:4096*512*512* 512 = 549'755'813'888 = 512GB
0级表:4096*512*512*512*512 = 281'474'976'710'656 = 256TB
请注意,上述内容适用于48位地址。也就是说,从地址开始,12 位用于页偏移,4 乘以 9 位作为页表索引 (12 + 4*9 = 48)。
对于 47 位,0 级表中只有 256 个条目,因此最终得到 128TB 的可寻址内存。
推荐阅读
- batch-file - 无法替换包含运算符的字符串
- r - 使用 R 根据现有变量的顺序创建新变量
- javascript - 在 hapi.js 上添加 CSS 不起作用
- c# - 为什么数据记录被错误地读入列表
? - android - 如何在正常的改造调用中使用 RxJava?
- laravel - 如何在 Laravel 中输出数组 A 到数组 B 的值之间的差异?
- testing - 测试/TDD 私有方法
- arrays - 访问单个 JSON 数组项并动态用于博客文章
- excel - Excel VBA - 如何在一个工作簿的多个工作表中自动检查和选择多个列表中的重复项?
- python - 在 scikit-learn 中使用预训练的手套词嵌入