确定给定地址的页码和偏移量

Posted

技术标签:

【中文标题】确定给定地址的页码和偏移量【英文标题】:Determining page numbers and offsets for given addresses 【发布时间】:2013-07-12 21:00:53 【问题描述】:

考虑一个具有 32 位逻辑地址和 4KB 页面大小的计算机系统。系统支持高达 512MB 的物理内存。

传统的单级页表中有多少条目?

Conventional single-level page table: 2^32 / 2^12 (4000)  = 2^20 = 1,048,576

为什么我必须divide 2^32 / 2^12 才能得到答案?

倒排页表有多少个条目?

倒排页表需要与页框一样多的条目 在内存中。

Inverted page table: 2^29 (512mb)/ 2^12 (4000) = 2^17 = 131,072

为什么我必须divide 512mb / page size 才能获得倒排页表条目?

以下地址的页码和偏移量是多少 参考:a) 30000, b) 256, c) 0xbcf034

a) 30000(十六进制):x7530 页号:x7 = 7 偏移量:x530 = 1328

b) 256 in hex x100 页号:x0 = 0 偏移量:x100 = 256

c) 0xbcf034 页面#:xbcf = 3023 偏移量:x034 = 22

如何根据十六进制地址计算出这些页码和偏移量?

我知道答案,但我想了解为什么和如何。谁能详细解释一下:)

【问题讨论】:

在倒排页表中,所有的帧都被映射而不是页。因此,倒排页表中的条目由总帧数组成,这就是你正在计算的。 PS:4K 不是 4000 :-) 【参考方案1】:

2^12 => 4096 2^32/2^12 => 2^32/4096 => 有多少 4K 页 => 我们需要多少页表条目。

物理页表的类似计算,即倒排页表需要多少页表条目。

根据上述提示,试一试问题,让我们知道您的想法。一旦您在操作系统课程中学习了更多内容,您就会发现每种页表设计都各有利弊。

【讨论】:

为什么需要知道倒排页表的物理页表项? PS - 谢谢 为此,您需要学习一些关于倒排页表的理论......一个快速的答案是倒排页表的大小与系统中的物理页数成正比。正常(或逻辑)页表的大小适用于进程的整个虚拟地址空间,即进程中虚拟页数的大小。即倒置页表:一个物理页一个条目;逻辑或虚拟页表:一个虚拟页的一个条目。希望对您有所帮助。【参考方案2】:

给定页面大小和地址引用: 计算页码和偏移量的最佳方法, 假设页面大小为 1KB,地址引用为 256。


Page number = (address reference / page size) = 256/1024 = 0

Offset = (address reference % page size) = (256 % 2014) = 256 


对其余地址引用应用相同的过程。

【讨论】:

【参考方案3】:

为什么我必须除以 2^32 / 2^12 才能得到答案?

2^32 ==> 总虚拟内存大小

4KB=2^12 ==>单页大小

2^32 / 2^12 =2^20 ==> 虚拟内存总页数

所以页表将有 2^20 = 1M 个条目

倒排页表中有多少条目?

2^29=512MB ==> 总物理内存

2^12 = 页面大小 = 帧大小

2^29 / 2^12 =2^17 ==> 物理内存中的总帧数

所以倒排页表将有 2^17 = 128K 个条目

这个图。可能会清除您剩余的疑虑:

【讨论】:

怎么样:一个两级分层页表有多少个条目?【参考方案4】:

因为页面大小 = 帧大小 = 2^12 倒排页表中的条目数 = 帧数 所以我们正在计算帧数

【讨论】:

以上是关于确定给定地址的页码和偏移量的主要内容,如果未能解决你的问题,请参考以下文章

为啥 16 位地址和 12 位偏移量会导致 4KB 页面大小?

如何在 Codeigniter 分页中使用页码而不是偏移量?

给定 UTC 时间戳和 UTC 偏移量,是不是可以在 Python 中获取时区?

java中的偏移量和偏移地址是啥

什么是偏移量 怎么计算

如果 fseek 中的给定偏移量超出最后一个字符会发生啥