在 64 位机器上,我们知道一个地址是 8 个字节。但是,我并不完全清楚一个地址中有多少字节的信息。虚拟内存中的每个字节都有地址吗?或者内存中的每 64 位都有一个地址?还是取决于架构?如果它取决于架构,那么我应该如何找出?
您的问题与 这个。
还是取决于架构?
是的。这取决于架构:
对于大多数 CPU,一个地址代表8 位。
内存中的每个字节都有一个单独的地址。
的TMS320 DSP为CPU,其中一个地址表示的示例的16位。
这意味着每个 16 位字 (uint16内存中的 ) 都有一个单独的地址。
还有一些计算机(其中许多是历史的),其中每个地址代表12、13、14、16、24或36 位(也许甚至更多)...
(不幸的是,我不知道使用 64 位地址而不使用每个地址 8 位的 CPU 的示例,但我很确定这样的 CPU 也存在。)
然后是不是所有地址的内存类型存在的。这可能如下所示:
可被 4 整除的地址代表32 位信息;不能使用其他地址 - 这意味着这些地址不代表任何信息。
所以地址的“平均值”是 8 位,但没有代表 8 位的地址。
通常,您会在安装了两种不同类型内存的计算机中看到这种行为,一种类型允许 8 位和 32 位访问,而另一种类型只允许 32 位访问。
外围设备的存储器通常就是这种情况——例如某些微控制器中以太网控制器的存储器。
据我记得正确,我见过一个用于 PC 的 PCI SCSI 控制器也显示出这种行为。将该 SCSI 控制器安装到您的 64 位计算机中,您的计算机包含一些地址范围,其中所有地址的 25% 代表 32 位数据,而所有地址的 75% 根本不代表任何数据。
我还见过由大学学生设计的 CPU,其中“商业原版”允许对内存进行 8 位和 32 位访问,但学生的复制品仅允许 32 位访问。在这种情况下,整个地址范围都显示了这种行为。
顺便一提:
在 64 位机器上,我们知道一个地址是 8 个字节。
甚至这也不一定是真的:
据我所知,x86-64 CPU 只使用 48 位地址。因此,编译器制造商可以将每个地址存储在仅 6 个字节的内存中。
当然,嵌入式设备的 CPU 内核可以设计为使用 x86-64 指令集的子集,但通常保存地址(例如rsp)的寄存器只有 48 位宽。
| 归档时间: |
|
| 查看次数: |
3200 次 |
| 最近记录: |