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

C shmat()返回的虚拟内存地址指向不同的硬件内存位置,c,linux,memory,arm,shared-memory,C,Linux,Memory,Arm,Shared Memory,我有两个进程,每个进程都可以从shmget获取相同的shmid 在这两个进程中,shmat提供不同的内存地址 每个流程的地址始终相同: Process1: 0x41b31000 Process2: 0x4017d000 我不认为这些地址是虚拟地址,正如下面问题中所述,此外,如果这些地址是虚拟地址,它们必须指向相同的硬件地址。然而,这些地址的内容并不相同 我正在为ARM处理器交叉编译,我的程序在x86 Debian Lenny中运行,没有错误或问题 我知道这个问题,但问题并不是那么简单---sh

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

在这两个进程中,shmat提供不同的内存地址

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

Process1: 0x41b31000
Process2: 0x4017d000
我不认为这些地址是虚拟地址,正如下面问题中所述,此外,如果这些地址是虚拟地址,它们必须指向相同的硬件地址。然而,这些地址的内容并不相同

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

我知道这个问题,但问题并不是那么简单---

shmat返回的地址是虚拟地址

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

如果shmat在进程a中返回地址a,而映射同一共享内存段在进程b中返回地址b,则进程a中的a中的数据应与进程b中的b中的数据相同。如果不相同,则说明有问题,可能包括:您实际上没有映射同一共享内存段,您没有正确比较数据,或者共享内存软件或操作系统中不太可能存在错误。

shmat返回的地址是虚拟地址

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


如果shmat在进程a中返回地址a,而映射同一共享内存段在进程b中返回地址b,则进程a中的a中的数据应与进程b中的b中的数据相同。如果不相同,则说明有问题,可能包括:您实际上没有映射同一共享内存段,您没有正确比较数据,或者共享内存软件或操作系统中不太可能存在错误。

这是关于内存对齐的问题

我有一个巨大的数据,从1字节开始,不管它是否干净,但这1字节的成本为2周

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


一个原因是我的错。

是关于内存对齐的问题

我有一个巨大的数据,从1字节开始,不管它是否干净,但这1字节的成本为2周

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


原因之一是我的错。

是的,地址不同。问题是什么?地址的内容必须相同,但每次访问0x4017d000时,我读取的内容都不同。也许您应该编辑问题,使其包含问题。就目前而言,没有有用的内容。标题仍然具有误导性,手册页明确表示,地址在不同的过程中可以不同。无论如何,内存的内容应该是相同的。你能在一个小的自包含的例子中重现这个问题吗?这些是虚拟地址。是的,地址是不同的。问题是什么?地址的内容必须相同,但每次访问0x4017d000时,我读取的内容都不同。也许您应该编辑问题,使其包含问题。就目前而言,没有有用的内容。标题仍然具有误导性,手册页明确表示,地址在不同的过程中可以不同。无论如何,内存的内容应该是相同的。您能在一个小的自包含示例中重现这个问题吗?这些是虚拟地址。我已经意识到,问题是分配的内容与shmget没有很好地对齐,我想。@EnesUnal否。这是关于您的代码。shmat工作得很好,但不是在我的手臂上。它在x86 Linux中非常完美。我已经意识到了这一点,问题是分配给shmget的内容没有很好地对齐,我想。@EnesUnal没有。这是关于您的代码的。shmat工作得很好,但不是在我的手臂上。它在x86Linux中非常完美。