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

时间:2013-03-29 09:03:47

标签: c linux memory arm shared-memory

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

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

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

Process1: 0x41b31000
Process2: 0x4017d000

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

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

我知道这个问题,但问题并不那么容易 - shmat() is returning a different "shmaddr" for same "shmkey" -

2 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:0)

这是关于记忆对齐的。

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

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

一个原因,我的错。

相关问题