我有两个流程,每个流程都可以从shmid
获取相同shmget()
。
在这两个过程中,shmat()
给出了不同的内存地址。
每个过程的地址始终相同:
Process1: 0x41b31000
Process2: 0x4017d000
我不认为地址是虚拟地址,如下面的问题中所述的答案,旁边,如果这些地址是虚拟地址,则必须指向相同的硬件地址。 但是,这些地址的内容并不相同。
我正在为ARM处理器进行交叉编译,我的程序在x86 Debian Lenny中运行没有错误或问题。
我知道这个问题,但问题并不那么容易 - shmat() is returning a different "shmaddr" for same "shmkey" -
答案 0 :(得分:4)
shmat
返回的地址是虚拟地址。
可以将相同的物理内存映射到不同进程中的不同虚拟地址。 (甚至可以将同一物理内存映射到一个进程内的不同虚拟地址;操作系统可以设置虚拟到物理转换,以便多个虚拟地址映射到同一物理内存。)
如果shmat
返回进程a
中的地址A
并且映射相同的共享内存段,则返回进程b
中的地址B
,那么a
处的数据进程A
中的{1}}应与进程b
中B
中的数据相同。如果不是,则出现问题,其中可能包括:您实际上没有映射相同的共享内存段,您没有正确地比较数据,或者(非常不可能)共享内存软件中存在错误或者操作系统。
答案 1 :(得分:0)
这是关于记忆对齐的。
我有一个巨大的数据,开始是1字节,无论它是否干净,但1字节成本为2周。
ARM或操作系统上的共享内存没有问题。
一个原因,我的错。