如果计算机有多个用于数据的地址空间,C编译器如何提供对这些的访问?
我正在考虑的一些现实生活中的架构:
KR580VM1或КР580ВМ1
这基本上是Intel 8080,增加了几个寄存器和第17个地址线。在取出操作码之后,指令前缀断言第17个地址线,直到指令结束;由于指针仍然只有16位宽,这自然将地址空间分成两半。地址空间的下半部分可能包含代码,两半可能包含数据。
CDC 6000的外围处理器
它们具有12位地址总线,因此可以访问本地存储器的4096个机器字。它们还具有18位地址总线,用于寻址中央存储体。
细胞处理器
这些用于PlayStation 3,据我所知,它与我提到的CDC有类似的安排。我不确定,但我认为SPE的地址空间可能与PPE重叠。
在我的脑海中,指针是一种类似于整数的东西,因为它具有离散值并且可以向上或向下计数,并且它最终会被放在地址总线上。我的问题是,对于我描述的架构,由于各种原因,指针不能唯一地标识内存位置。这意味着代码生成器需要以不同的方式关注如何生成代码以取消引用指针。
那么有一个C编译器的实现,它关注这个问题吗?你能描述一下他们的解决方案吗?
GCC编译器提供named address spaces(以及function attributes,variable attributes,type attributes,target-specific builtins,...)的扩展。这在您的上下文中可能很有用。有时候,你有其他类型的扩展(例如旧的16位PC上的far pointers ......)
详细信息是特定于编译器和目标体系
您甚至可以使用自己的GCC plugin扩展GCC(这并不容易)。
但是,CDC6000早在C之前就已经过时了。
在某些情况下,协处理器正在获取自己的程序,数据传输是明确的。以OpenCL为例。
在其他情况下,特定的#pragma
s正在指导编译器。见OpenMP,OpenACC。
当然,您可以拥有共享内存的API。例如,参见shm_overview(7)。
最后,C并不像你想要的那样普遍。有些架构不适合它。
在没有列出所有这些奇特的架构的情况下,对于8/16位微控制器来说,这是一个相当常见的情况,它需要寻址比16位地址总线允许的64kib更多的闪存。 MS DOS +早期的x86有类似的问题。
有两种可能的解决方案,两者都不好:
near
指针和用于较大地址的far
。也就是说,near
和far
成为指针的非标准类型限定符:int* far ptr;