我们有一个32位地址空间的进程需要访问比直接寻址更多的内存。此过程的大多数源代码都无法更改。我们可以更改用于管理数据访问的模块。这些模块的接口可能包含64位数据,用于标识要访问的内存。
我们目前有一个实现,其中接口模块使用进程间通信与64位进程来传输数据到64位进程的地址空间。
有更好的方法吗?
答案 0 :(得分:3)
很少有平台支持混合32位和64位代码。如果您需要超过2或3 GB的地址空间,您的选项是:
将整个应用程序重新编译为64位或
使用内存映射文件来分页和输出大块数据。
重新编译很容易。在32位程序中访问超过2或3 GB的内存是 hard 。
请注意,将32位应用程序重新编译为64位应用程序不需要更改代码或功能,除非您的代码具有不可移植的构造,否则可能会出现一些错误。比如:
size_t round_to_16(size_t x)
{
return x & ~15; // BUG in 64-bit code, should be ~(size_t) 15
}
答案 1 :(得分:1)
如各种评论所述,情况如下:
进程间通信通常很快。除非:
,否则可能没有更快的方法 Unix具有shmat
和mmap
等调用,允许进程附加到共享内存段,并将其地址空间的部分映射到共享内存段中的偏移量。这些调用可能支持将32位地址空间的部分映射到大型物理地址空间中存在的大型共享内存段。
例如,调用mmap
获取地址空间中映射地址的void *
参数和共享内存段中偏移量的off_t
参数。可以想象,即使off_t
仅是32位指针,void *
类型也可以是64位类型。我没有调查过这个。
可以想象重新映射内存比通过复制操作传输内存更快,因为它可能只涉及更改虚拟地址映射而不是物理移动数据。