linux - 手动虚拟地址转换

标签 linux translation paging virtual-address-space

我已经看过几篇与此相关的不同文章,但没有一篇以我可以理解和复制的方式解释解决方案。我需要知道如何根据以下内容将物理地址转换为内存中的虚拟地址:

一个简单的虚拟内存系统有32KB的物理内存,有16位虚拟地址,其中12位用作偏移量。以下是其中一个进程的页表当前内容:

enter image description here

所以基本上我认为这个虚拟内存系统的页面大小是1024KB。我需要一个过程来找到VA B2A0对应的PA。如果你能给我我可以从那里开始的过程,你就不必给我最终的解决方案:)

提前谢谢大家。此外,如果您知道一篇文章已经做到了这一点,而我只是错过了它,请随时将我链接到那篇文章。

干杯。

最佳答案

32 KB 是 2^15。 所以每个物理地址有15位,其中低12位用作偏移量,高3位用作页框数。

0xb2a0 位于哪个虚拟页面?为了确定这一点,我们需要取地址中高于 2^12 的位。一个页的大小是2^12,即4096或0x1000,所以它是一个虚拟页号0xb = 11(floor of 0xb2a0/0x1000)。页面内的偏移量是 0xb2a0 模 0x1000,它是 0x2a0。

然后使用该表将虚拟页号 11 转换为物理页框。虚拟页面存在(1),它对应物理帧号高位111,即二进制111 + 12 0,=> 0x7000 - 它是物理帧的起始地址。

我们的物理地址位于偏移量 0x2a0 处,因此,寻求的物理地址是 0x7000 + 0x2a0 = 0x72a0。

请按照此流程进行操作,并为您说明清楚。如果您有任何疑问,请先阅读维基百科,如果仍有不清楚的地方,请提问 :)

关于linux - 手动虚拟地址转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13319569/

相关文章:

x86 - 多级分页如何节省内存?

php - 用 php 或 mysql 翻译网站?

linux - 对带有日期的变量进行操作会产生错误

MySQL数据库-备份数据库时出错

python - 如何使用升级的 python 在 ec2 centos 机器上获取 mysql

c - 将 C 程序翻译成 IA32 程序集(非常快)

java - Android 区域设置在运行时不会(完全)改变

memory-management - 如果我们有无限内存,那么我们还需要分页吗?

css - 如何每页只显示一次表格行?

linux - 使用查找结果作为另一个进程的命令行参数