gpt4 book ai didi

memory - 为什么内存地址打印的是{:p} much bigger than my RAM specs?

转载 作者:IT王子 更新时间:2023-10-28 23:36:50 24 4
gpt4 key购买 nike

我想打印一个变量的内存位置(地址):

let x = 1;
println!("{:p}", &x);

这将打印十六进制值 0x7fff51ef6380,十进制为 140734568031104

我的电脑有 16GB 的 RAM,为什么会有这么大的数字呢? x64 架构是否使用大间隔序列而不是简单的 1 增量来访问内存位置?

在 x86 中,通常第一个位置从 0 开始,然后是 1、2 等,因此您可以拥有的最高数约为 40 亿,因此地址数始终等于或小于 40 亿。

为什么 x64 不是这种情况?

最佳答案

您在此处看到的是 virtual memory 的效果.内存管理很难,当操作系统和数以百计的进程必须共享内存时,它变得更加困难。为了处理这种巨大的复杂性,使用了虚拟内存的概念。我将在这里简单地解释一下基础知识;该主题要复杂得多,您也应该在其他地方阅读它。

在大多数现代计算机上,每个进程都认为它拥有(几乎)完整的内存空间。但是进程从不处理物理地址,而是处理虚拟地址。每次进程实际从内存中读取时,这些虚拟地址都会映射到物理地址。这种地址转换由所谓的 MMU(内存管理单元)完成。如何映射地址的规则由操作系统设置。

当您启动 PC 时,操作系统会创建一个初始映射。每次启动进程时,操作系统都会为进程添加几片物理内存,并相应地修改映射。这样,进程就有了内存可以使用。

在 x86_64 上,地址空间是 64 位宽,因此每个进程都认为它拥有所有这 2^64 个地址。当然,这不是真的:

  1. 世界上没有一台电脑拥有如此大的内存。 (事实上​​,今天的大多数 CPU可以使用 280 TB 的 RAM,因为它们在内部只能使用 48 位来寻址物理内存。显然,即使现在这 280 TB 也足够了。)
  2. 即使您有这么多内存,也有其他进程使用部分内存。

那么当您尝试读取未映射的地址时会发生什么(在 64 位域中,绝大多数地址是该地址)? MMU 触发页面错误。这使得 CPU 通知操作系统来处理这个问题。

What I mean is that in x86, usually first location starts at 0, then 1, 2, etc. so the highest number you can have is around 4 billion.

确实如此,但如果您的 x86 系统的 RAM 少于 4GB,也同样如此。虚拟内存已经存在了相当长的一段时间。


这就是为什么您会看到如此大的地址的简短摘要。再次请注意,我在这里掩盖了许多细节。

关于memory - 为什么内存地址打印的是{:p} much bigger than my RAM specs?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46683073/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com