Compiler construction C编译器如何提供对多个内存的访问?
如果一台计算机有多个用于数据的地址空间,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早了很长一段时间 在某些情况下,协处理器获得自己的程序,并且数据传输是显式的。研究一个例子 在其他情况下,特定的Compiler construction C编译器如何提供对多个内存的访问?,compiler-construction,Compiler Construction,如果一台计算机有多个用于数据的地址空间,C编译器如何提供对这些地址空间的访问 上下文 我正在考虑的一些现实体系结构: KR580VM1或κМ580М1 这基本上是一个Intel 8080,添加了几个寄存器和一个第17个地址行。指令前缀在提取操作码后断言第17个地址行,直到指令结束;由于指针仍然只有16位宽,这自然会将地址空间分成两半。地址空间的下半部分可能包含代码,两部分可能包含数据 CDC 6000的外围处理器 它们有一个12位地址总线,因此可以访问4096个本地内存机器字。它们还有一个18位
#pragma
将指导编译器。见
当然,您可以使用一个用于共享内存的API。例如,见
有时,你可能会有奇怪的s。例如,调查
最后,C并不像您希望的那样具有普遍性。有些体系结构不适合它。如果不列出所有这些奇特的体系结构,对于8/16位微控制器来说,这是一种相当常见的情况,它们需要寻址比16位地址总线允许的64kib更多的闪存。MS DOS+早期x86也有类似的问题 有两种可能的解决方案,两者都不好:
- 为更大的地址范围编译程序中的所有指针。这将使二进制文件的大小更大,并且可能会影响性能
- 对不同的地址区域使用非标准扩展,例如用于访问较小地址的非标准
指针,以及用于访问较大地址的near
。也就是说,far
和near
成为指针的非标准类型限定符:far
int*far ptr代码>
PROGMEM
属性)。通常,会编写单独的函数来访问不同的地址空间。(在avr libc中,闪存访问函数具有\u P
后缀。实际的低级地址空间特定访问,如pgm\u read\u byte()
,通过编译器内置或内联程序集实现。)