【发布时间】:2015-07-23 12:08:47
【问题描述】:
我在看书:
32 位机器上进程的虚拟地址空间是 2^32,即 4Gb 的空间。程序中看到的每个地址都是虚拟地址。 4GB 空间进一步通过用户/内核拆分 3-1GB。
为了更好地理解这一点,我做了 5Gb 空间的 malloc() 并尝试打印所有地址。如果我打印地址,当它只有 3GB 的虚拟地址空间时,应用程序将如何打印整个 5Gb 地址?我在这里错过了什么吗?
【问题讨论】:
-
你真的 malloc 了所有内存吗?可以贴一下相关代码吗?
-
如果使用 32 位指针,则无法寻址 5GB,因此也无法打印所有地址。它将换行为零。
-
打印地址与该地址是否可用完全无关。并且 Linux 在您使用它之前实际上不会提交分配的内存。
-
AFAIK,即使您有超过 4GB 的 RAM,一个进程也不能在 32 位操作系统/CPU 上处理超过 4GB 的内存,因为 size_t 长度是 malloc 的参数并处理最大指针大小。因此,您必须创建单独的进程并分配尽可能多的内存,并将这些内存作为共享来处理。
-
这是一个很好的例子,切换所有编译器警告或忽略它们是有意义的。使用 size_t 参数并在那里写入 5GB 常量应该会导致警告(gcc 的“表达式中的整数溢出”)。但非常有趣的是,您能够使用指针在 32 位系统上运行超过 5GB。也忽略了很多警告?提示:阅读并理解编译器警告!
标签: c linux linux-kernel operating-system