-->

什么内存地址空间有哪些?(What memory address spaces are there?

2019-07-17 17:21发布

什么内存地址空间的形式已经被使用?

如今,大型平面虚拟地址空间是常见的。 从历史上看,更复杂的地址空间已被使用,诸如一对的基址的和偏移,一对段号和一个偏移量,一个字地址加上一些指数为一个字节或其他子对象,等。

不时地,各种各样的回答和评论断言,C / C ++的指针本质上是整数。 这是C / C ++的型号不正确,因为各种各样的地址空间的无疑是一些关于指针操作的C规则的原因。 例如,并非限定指针算法超出数组简化了在碱和偏移模型指针支持。 在指针转换限制简化地址加额外的数据模型的支持。

该定期断言促使这个问题。 我要寻找有关各种地址空间的信息,以说明将要支持的C / C ++指针不一定是简单的整数和上指针操作的C / C ++的限制是合理的给出的各种机器。

有用的信息可能包括:

  • 计算机体系结构的各种地址空间和这些空间的描述的示例。
  • 不同地址空间的例子仍然在使用的机器正在生产。
  • 引用文档或解释,尤其是网址。
  • 精对地址空间如何激励C / C ++指针的规则。

这是一个很宽泛的问题,所以我愿意在IT管理的建议。 我很乐意看到一个普遍包容答案协作编辑。 然而,实至名归,可能无法奖的声誉。 我建议了投票权多有益的贡献。

Answer 1:

几乎任何你能想象可能已被使用。 第一个主要的分裂是字节寻址(所有现代建筑)与字之间的寻址(前IBM 360 / PDP-11,但我认为现代Unisys的大型机仍字解决)。 在字寻址, char*void*往往会比一个大int* ; 即使他们没有更大的“字节选择”将在高位,这都必须为0,或比其他字节任何将被忽略。 (在PDP-10,例如,如果p是一个char*(int)p < (int)(p+1)常常是假的,即使intchar*具有相同大小)。

在字节寻址的机器,主要的变体分割和非分割的架构。 无论是现在仍然广泛流传的,尽管在英特尔32位(一个分段结构具有48个地址)的情况下,一些更广泛使用的操作系统(Windows和Linux)的人为限制用户进程到单个段,模拟平寻址。

虽然我没有最近的经验,我希望在嵌入式处理器更是五花八门。 特别是,在过去,这是常见的嵌入式处理器采用了哈佛架构,其中的代码和数据都在独立的地址空间(这样的函数指针和数据指针,转换为一个足够大的整数类型,可以比较平等)。



Answer 2:

我会说你是问错了问题,除了历史的好奇心。

即使您的系统碰巧使用平面地址空间 - 事实上,即使从现在开始每一个系统,直到时间的尽头采用平面地址空间 - 你仍然不能把指针为整数。

C和C ++标准留下各种指针运算的“不确定”。 那现在可以影响你,在任何系统上,因为编译器会认为你避免不确定的行为和相应的优化。

对于一个具体的例子,三个月前一个非常有趣的错误在Valgrind的止跌回升:

http://comments.gmane.org/gmane.comp.debugging.valgrind.devel/19698

(搜索“未定义的行为”。)

基本上,使用Valgrind的低于和大于上的指针来尝试确定是否自动变量是在一定范围内了。 因为在不同的聚合指针之间的比较是“未定义”,简单地锵优化掉所有的比较返回一个恒定真(或假;我忘了)。

这个错误本身产生了一个有趣的StackOverflow问题 。

因此,尽管原来的指针运算的定义可能都迎合了实机,这可能是为自己而有趣的,今天其实是无关紧要的编程。 今天有什么相关的是,你根本不能想当然地认为指针表现得像整数,期间,不管系统你碰巧使用。 “未定义行为”并不意味着“有趣的事情发生了”; 这意味着,编译器可以假设你没有在它参与。 当你这样做,你介绍一个矛盾到编译器的推理; 从一对矛盾,任何事情如下...这只是取决于你的编译器如何聪明的。

他们变得更聪明的所有时间。



文章来源: What memory address spaces are there?