2

我有两个进程,每个进程都shmid可以从shmget().

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

每个进程的地址始终相同:

Process1: 0x41b31000
Process2: 0x4017d000

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

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

我知道这个问题,但问题并不容易 - shmat() 为相同的“shmkey”返回不同的“shmaddr” -

4

2 回答 2

4

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

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

如果shmat返回a进程中的地址A和映射相同的共享内存段返回进程中的地址bB那么进程中的数据应该与a进程中的数据相同。如果不是,则有问题,可能包括:您实际上没有映射相同的共享内存段,您没有正确比较数据,或者(非常不可能)共享内存软件中存在错误或操作系统。AbB

于 2013-03-29T11:32:36.847 回答
0

这是关于内存对齐的。

我有一个庞大的数据,从 1 字节开始,无论它是否干净,但 1 字节的成本为 2 周。

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

一个原因,我的错。

于 2013-03-30T12:39:02.147 回答