-1

我想在两个进程之间共享内存。
之后mmap(),我得到一个地址 mapStart,然后我添加偏移量mapStart并得到mapAddr,并确保mapAddr不会超过映射的 PAGE_SIZE。
当我写信mapAddr

memcpy((void *)mapAddr, data, size);

一切都好。

mapAddr但是当我从

memcpy( &data, (void *)mapAddr, size);` 

这将导致系统崩溃。
谁知道为什么? 类似的问题在这里

添加一些信息: @Tony Delroy,@J-16 SDiZ
mmap 函数是:

mapStart = (void volatile *)mmap(0, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_LOCKED, memfd, pa_base);

系统崩溃:没有任何操作系统错误消息,控制台打印一些MCA信息

此处描述的详细信息

4

2 回答 2

1

至少有两个可能的问题:

在 mmap() 之后,我得到一个地址 mapStart,然后我将偏移量添加到 mapStart 并获取 mapAddr,并确保 mapAddr 不会超过映射的 PAGE_SIZE。

NotmapAddr必须确保不超过映射大小,但是mapAddr+size. 您正在尝试触摸size字节,而不仅仅是一个。

memcpy((void *)mapAddr, data, size);
memcpy( &data, (void *)mapAddr, size);

假设data不是一个数组(这是一个合理的假设,因为您在第一行中没有使用地址运算符),第二行不是从数据指向的位置复制,而是从数据开始。这很可能是一些未分配的内存,或者堆栈上的某个位置,或者其他什么。如果堆栈上没有很多,它还不如从堆栈末尾读取到文本段,或者......其他东西。

(如果data确实是一个数组,当然是等价的,但是你的代码风格会不一致。)

于 2012-07-02T09:19:30.953 回答
1

只是一些想法。

您是否mmap()跨越具有不同属性的内存区域?这是非法的。较旧的内核(您说 2.6.18)允许这样做,但是当您写入其中一些内核时会崩溃。

请参阅这篇文章以获取一些起点。如果可能,请尝试更新的内核。

于 2012-07-02T08:53:50.363 回答