【问题标题】:the virtual memory addresses returned by shmat() points different hardware memory locationsshmat() 返回的虚拟内存地址指向不同的硬件内存位置
【发布时间】:2013-03-19 23:27:42
【问题描述】:

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

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

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

Process1: 0x41b31000
Process2: 0x4017d000

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

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

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

【问题讨论】:

  • 是的,地址不同。有什么问题?
  • 地址内容必须相同,但每次访问0x4017d000时,读取的内容不同。
  • 也许您应该编辑问题以使其包含问题。就目前而言,其中没有任何有用的内容。
  • 标题仍然具有误导性,手册页明确表示地址在不同进程中不同是可以的。无论如何,内存的内容应该是一样的。你能在一个独立的小例子中重现这个问题吗?
  • 这些虚拟地址。

标签: c linux memory arm shared-memory


【解决方案1】:

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

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

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

【讨论】:

  • 我已经知道了,问题是分配的内容,用 shmget,我猜,没有很好地对齐。
  • @EnesUnal 不,这与您的代码有关。 shmat() 效果很好。
  • 不过,不在我的手臂机器中。它在 x86 Linux 中非常完美。
【解决方案2】:

这是关于内存对齐的。

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

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

一个原因,我的错。

【讨论】:

    猜你喜欢
    • 2021-10-07
    • 2018-07-09
    • 2011-08-09
    • 1970-01-01
    • 2013-06-04
    • 2021-07-25
    • 2023-03-17
    • 2012-03-21
    • 2014-09-06
    相关资源
    最近更新 更多