我有两个进程,每个都可以从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或操作系统上没有问题。
原因之一,我的错。