Compiler construction C编译器如何提供对多个内存的访问?

Compiler construction C编译器如何提供对多个内存的访问?,compiler-construction,Compiler Construction,如果一台计算机有多个用于数据的地址空间,C编译器如何提供对这些地址空间的访问 上下文 我正在考虑的一些现实体系结构: KR580VM1或κМ580М1 这基本上是一个Intel 8080,添加了几个寄存器和一个第17个地址行。指令前缀在提取操作码后断言第17个地址行,直到指令结束;由于指针仍然只有16位宽,这自然会将地址空间分成两半。地址空间的下半部分可能包含代码,两部分可能包含数据 CDC 6000的外围处理器 它们有一个12位地址总线,因此可以访问4096个本地内存机器字。它们还有一个18位

如果一台计算机有多个用于数据的地址空间,C编译器如何提供对这些地址空间的访问

上下文 我正在考虑的一些现实体系结构:

KR580VM1κМ580М1

这基本上是一个Intel 8080,添加了几个寄存器和一个第17个地址行。指令前缀在提取操作码后断言第17个地址行,直到指令结束;由于指针仍然只有16位宽,这自然会将地址空间分成两半。地址空间的下半部分可能包含代码,两部分可能包含数据

CDC 6000的外围处理器

它们有一个12位地址总线,因此可以访问4096个本地内存机器字。它们还有一个18位地址总线,用于寻址中央内存库

单元处理器

这些在PlayStation 3中使用,据我所知,它们与我提到的CDC有类似的安排。我不确定,但我认为SPE的地址空间可能与PPE重叠

问题 在我看来,指针是一种看起来像整数的东西,因为它有离散的值,可以向上或向下计数,它最终会被放到地址总线上。我的问题是,对于我描述的体系结构,由于各种原因,指针不能唯一地标识内存位置。这意味着代码生成器需要以不同的方式关注如何生成代码以取消引用指针

那么,是否有一个C编译器的实现与这个问题有关呢?你能给我描述一下他们的解决方案吗?

编译器提供了一个扩展(还有,,…)。这在您的上下文中可能很有用。有时,您有其他类型的扩展(例如,在旧的16位PC上…)

详细信息是特定于编译器和目标体系结构的

您甚至可以使用自己的GCC扩展GCC(这并不容易)

但是,CDC6000比C早了很长一段时间

在某些情况下,协处理器获得自己的程序,并且数据传输是显式的。研究一个例子

在其他情况下,特定的
#pragma
将指导编译器。见

当然,您可以使用一个用于共享内存的API。例如,见

有时,你可能会有奇怪的s。例如,调查


最后,C并不像您希望的那样具有普遍性。有些体系结构不适合它。

如果不列出所有这些奇特的体系结构,对于8/16位微控制器来说,这是一种相当常见的情况,它们需要寻址比16位地址总线允许的64kib更多的闪存。MS DOS+早期x86也有类似的问题

有两种可能的解决方案,两者都不好:

  • 为更大的地址范围编译程序中的所有指针。这将使二进制文件的大小更大,并且可能会影响性能
  • 对不同的地址区域使用非标准扩展,例如用于访问较小地址的非标准
    near
    指针,以及用于访问较大地址的
    far
    。也就是说,
    near
    far
    成为指针的非标准类型限定符:
    int*far ptr

对不起,为什么要标记C?与C语言的联系是什么?这与我无关C@Stargateur我对C特别感兴趣。C中的解决方案将与Lisp中的解决方案完全不同。但我会编辑这个问题来澄清。我没有投反对票,但你的问题缺乏动机和背景,可能不适合StackOveflow(太广泛了,没有)。请编辑您的问题,以改进itA指针只能在不同对象内或刚过对象时进行上下计数。(当然包括数组)为什么要进行下一票?它提供了一个问题的答案。我也这么认为,尤其是这些后来的编辑。我给你一个+1来反驳它。我也同意:这确实回答了问题。充其量,一个人可能会增加它。例如:Atmel AVR是一个,具有单独的代码(闪存)和RAM地址空间。只读数据在链接器的帮助下放入闪存(
PROGMEM
属性)。通常,会编写单独的函数来访问不同的地址空间。(在avr libc中,闪存访问函数具有
\u P
后缀。实际的低级地址空间特定访问,如
pgm\u read\u byte()
,通过编译器内置或内联程序集实现。)