由shmat()返回的虚拟内存地址指向不同的硬件内存位置

我有两个进程,每个都可以从shmget()获取相同的shmid

在这两个进程中, shmat()给出不同的内存地址。

每个进程的地址总是相同的:

 Process1: 0x41b31000 Process2: 0x4017d000 

我不认为这些地址是虚拟地址,正如在下面的问题中所写的答案一样,如果这些地址是虚拟地址,则必须指向相同的硬件地址。 但是,这些地址的内容不一样。

我正在为ARM处理器交叉编译,我的程序在x86 Debian Lenny中运行时没有错误或问题。

我意识到这个问题,但问题不是那么容易 – shmat()为相同的“shmkey”返回不同的“shmaddr” –

shmat返回的地址是虚拟地址。

相同的物理内存可以映射到不同进程中的不同虚拟地址。 (甚至有可能在一个进程中将同一物理内存映射到不同的虚拟地址;操作系统可以设置虚拟到物理的转换,以便多个虚拟地址映射到相同的物理内存。

如果shmat在进程A返回地址a ,并且在进程A映射相同的共享内存段返回地址b ,则进程A中的数据应该与进程B中的b中的数据相同。 如果不是的话,那么有些地方是错误的,这可能包括:你实际上没有映射相同的共享内存段,你没有正确地比较数据,或者(很不可能)共享内存软件或者操作系统。

这是关于内存对齐。

我有一个大的数据开始1个字节是否干净,但1字节花费2个星期。

共享内存在ARM或操作系统上没有问题。

原因之一,我的错。