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

时间:2018-08-30 11:10:42

标签: compiler-construction

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

上下文

我正在考虑的一些现实建筑:

KR580VM1 КР580ВМ1

这基本上是Intel 8080,带有一些寄存器和第17条地址线。在获取操作码后,指令前缀会声明第17条地址线,直到指令结束为止。由于指针仍然只有16位宽,因此自然会将地址空间分为两半。地址空间的下半部分可能包含代码,而两半都可能包含数据。

CDC 6000的外围处理器

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

单元处理器

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

问题

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

那么,有没有一个与此问题相关的C编译器的实现?你能描述他们对我的解决方案吗?

2 个答案:

答案 0 :(得分:4)

GCC编译器提供作为扩展 named address spaces(还有function attributesvariable attributestype attributes,{{3 }},...)。在您的上下文中,这可能很有用。有时,您还有其他类型的扩展名(例如在旧的16位PC上使用target-specific builtins ...)

细节是特定于编译器和目标体系结构的。

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

但是,CDC6000早于C。

在某些情况下,协处理器正在获取自己的程序,并且数据传输是显式的。以plugin为例。

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

当然,您可能只有共享内存的API。例如,请参见OpenACC

有时候,您可能会遇到奇怪的shm_overview(7)。例如查看ABI

最后,C不是您想要的那样通用。有些架构不太适合它。

答案 1 :(得分:1)

在没有列出所有这些奇特的体系结构的情况下,对于需要寻址比其16位地址总线所允许的64kib更多的闪存的8/16位微控制器,这是一个相当普遍的情况。 MS DOS +早期的x86也有类似的问题。

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

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