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

Posted

技术标签:

【中文标题】为啥 16 位地址和 12 位偏移量会导致 4KB 页面大小?【英文标题】:Why 16-bit address with 12-bit offset results in 4KB page size?为什么 16 位地址和 12 位偏移量会导致 4KB 页面大小? 【发布时间】:2011-04-11 06:21:20 【问题描述】:

我正在阅读“现代操作系统”一书。我对“页面大小”感到困惑。

作者在书中说,

传入的 16 位虚拟地址是 拆分为 4 位页码和 12 位偏移量。用 4 位 页码,我们可以有 16 页,并且 偏移量为 12 位,我们可以 寻址一个内的所有 4096 个字节 页面。

为什么是 4096 字节?使用 12 位,我们可以在一个页面内处理 4096 个条目,正确。但是,一个条目是一个地址(在这种情况下,地址大小 = 16 位)。所以我认为我们可以寻址 4096(entry) * 16(bit) = 4096(entry) * 2(byte) = 8KB,但是为什么书上说我们可以寻址 4096(bytes) 呢?

提前致谢! :)

【问题讨论】:

【参考方案1】:

这是假设字节寻址的内存(过去 30 年制造的几乎每台机器都使用它),所以每个地址指的是一个字节,而不是条目或地址或任何其他更大的值。要保存 16 位值,您需要两个连续的地址(两个字节)。

30 多年前,曾经有过文字寻址的机器,其工作方式与您猜想的一样。但这类机器在处理面向字节的数据(如 ASCII 字符)时遇到了困难,因此已经失宠。如今,字节可寻址性、8 位字节和二进制补码整数之类的东西几乎只是假设。

【讨论】:

我在 70 年代和 80 年代的大型大型机上工作过,它是文字寻址的。他们提供了一个选项,可以添加允许您直接寻址字节或 BCD 字符的硬件。 非常感谢。这个答案消除了我在作业中的很多不确定性。 目前有一些处理器使用字寻址,但它们都倾向于专门的嵌入式类型,如数字信号处理器 (DSP)。我曾经参与过一个最小可寻址单元是 16 位的项目。在那台机器上 sizeof(char) == sizeof(int) == 1。这对字符串来说是浪费的,但是这个应用程序只使用了非常少的 8 位数据,所以浪费不是问题。【参考方案2】:

12 位是页内的偏移量。偏移量以字节为单位,而不是地址。 2^12 是 4096。

【讨论】:

【参考方案3】:

您计算的是页面大小,即内存中页表中页面的大小。由于我们使用 12 位作为偏移量,因此物理内存中的每一帧为 2^12=4096K。但是,页表中的每一页在内存中占用 2^12 个条目 x 2 字节 = 8K。

【讨论】:

【参考方案4】:

好的,所以你有 16 位虚拟地址,让我们看看这是什么意思。这意味着你有 2**16 =65536 字节。

4 位页码,表示有 16 页,2^4=16 现在您将页面命名为 page1,page2...page16。

现在我们剩下 12 位,让我们看看 12 位可以代表多少个地址 2**12=4096 字节

65536 字节也可以通过将其分成 16 个页面来实现,每个页面包含 4096 个字节,即 4096*16=65536

【讨论】:

【参考方案5】:

因为使用 12 位,我们可以寻址 2^12=4096 插槽。每个插槽代表一个地址,在字节可寻址存储器中大小为 1 个字节。因此总大小为4096*1=4096 bytes = 4KB.

【讨论】:

以上是关于为啥 16 位地址和 12 位偏移量会导致 4KB 页面大小?的主要内容,如果未能解决你的问题,请参考以下文章

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

Cache组织方式

单片机的ROM的容量为4KB。这里的是4KB等于多少bit?

汇编语言程序设计中,段寄存器的内容和偏移量合起来是内存地址,

为啥 MYSQL 更高的 LIMIT 偏移量会减慢查询速度?

KB和进制之间怎么换算?比如4kb换算成16进制是1000H