c - 有哪些内存地址空间?

标签 c cpu-architecture memory-address

使用了哪些形式的内存地址空间?

今天,大的平面虚拟地址空间很常见。从历史上看,已经使用了更复杂的地址空间,例如基地址和偏移量的对、段号和偏移量的对、字地址加上字节或其他子对象的一些索引等等.

不时地,各种答案和评论断言 C(或 C++)指针本质上是整数。这对于 C(或 C++)来说是一个不正确的模型,因为地址空间的多样性无疑是 C(或 C++)中一些关于指针操作的规则的原因。例如,不在数组之外定义指针算术简化了对基本和偏移模型中指针的支持。指针转换的限制简化了对地址加额外数据模型的支持。

这个反复出现的断言引发了这个问题。我正在寻找有关各种地址空间的信息,以说明 C 指针不一定是简单的整数,并且鉴于要支持的机器种类繁多,C 对指针操作的限制是明智的。

有用的信息可能包括:

  • 具有各种地址空间的计算机架构示例以及这些空间的描述。
  • 目前正在制造的机器中仍在使用的各种地址空间示例。
  • 对文档或解释的引用,尤其是 URL。
  • 详细说明地址空间如何激发 C 指针规则。

这是一个广泛的问题,因此我愿意接受有关管理它的建议。我很高兴看到对一个普遍包容的答案进行协作编辑。但是,这可能无法获得应得的声誉。我建议对多个有用的贡献进行投票。

最佳答案

几乎所有你能想象到的东西都可能被使用过。这 第一个主要划分是字节寻址(所有现代 架构)和字寻址(IBM 360/PDP-11 之前的版本,但 我认为现代 Unisys 大型机仍然是字地址的)。在 字寻址,char*void*通常会大于 一个 int* ;即使它们不是更大,“字节选择器” 将在高位,要求为 0,或 除了字节之外的任何内容都将被忽略。 (在 PDP-10 上, 例如,如果 pchar* , (int)p < (int)(p+1)将 经常是假的,即使 intchar*有同样的 大小。)

在字节寻址的机器中,主要的变体是分段的 和非分段架构。两者仍然广泛传播 今天,虽然在英特尔 32 位(分段 具有 48 位地址的体系结构),一些更广泛的 使用的操作系统(Windows 和 Linux)人为地限制用户 处理到单个段,模拟平面寻址。

虽然我没有最近的经验,但我会期待更多 各种嵌入式处理器。特别是,在过去,它 嵌入式处理器经常使用哈佛 架构,其中代码和数据位于独立地址中 空格(以便将函数指针和数据指针强制转换为 足够大的整数类型,可以比较相等)。

关于c - 有哪些内存地址空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14091855/

相关文章:

c - 如何清除位字段结构中的所有字段,除了一个?

c:这条线是做什么的?

assembly - 有什么理由在 MOV pc 上使用 BX R,R 除了拇指互通之前的 ARMv7 吗?

arrays - 为什么 C 数组元素(貌似)存储在 4 个 block 中?

使用指针将数据从一个地址复制到另一个地址

c++ - API 设计告诉 API 的使用者分配内存是最佳实践吗?

C 编译错误

assembly - 正在运行时中断汇编指令

mips - MIPS 中的影子寄存器是什么?它们是如何使用的?

c - int (*ptr)[4] 的真正含义是什么,它与 *ptr 有何不同?