【发布时间】:2012-01-25 02:06:45
【问题描述】:
x86_64 架构上的 Linux 3.0 上的进程具有 64 位虚拟地址空间。
很明显,0 在这个地址空间中被保证是一个无效的内存地址[见下面的定义],因为它被用来指示一个NULL 指针。
还有哪些其他 64 位数字(如果有)可以保证永远不会是有效的内存地址,为什么?
例如,1 可以是有效地址吗? 2^64-1呢?
定义:“保证是无效的内存地址”是什么意思?
void deref_and_assign(uint64_t i)
{
char* p = (char*) i;
*p = 42;
}
就本问题而言,保证的无效内存引用意味着函数deref_and_assign 将始终引发SIGSEGV。
【问题讨论】:
-
出于好奇,您为什么要查找此信息?它可能不是您应该根据它编写代码的信息。对于研究,当然,任何事情都会发生。 ;)
-
好奇心是好的。我正在实现一个不可移植的动态类型(对于 Linux/x86_64 目标),并且我正在考虑我的选项,以重载前导 64 位值“代码单元”。一种方法是将代码单元划分为 (a) 立即值和 (b) 指向更多信息的指针。作为一个简单的例子,您可以如下表示一个动态数字/字符串类型: (0-4095) 它是一个立即表示为整数 0,1,2...4095 的数字; (4096-2^64) 它是一个指向以空字符结尾的字符串的指针。有关更真实的示例,请查看 rubys VALUE 类型的工作原理。 ruby.tgz 中的 ruby.h