在mmap()之后,写入返回的地址是可以的,但是读取会导致系统崩溃。为什么?

时间:2012-07-02 08:28:04

标签: linux crash kernel mmap itanium

我想在两个进程之间共享内存 在mmap()之后,我得到一个地址mapStart,然后我将偏移添加到mapStart并获得mapAddr,并确保mapAddr不会超过maped PAGE_SIZE。<登记/>  当我通过

写信mapAddr
memcpy((void *)mapAddr, data, size);
一切都好。

但是当我从mapAddr读取

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

将导致系统崩溃 谁知道为什么? The similar problem is here

添加一些信息: @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信息

here

中描述的详细信息

2 个答案:

答案 0 :(得分:1)

只是一些想法。

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

请参阅this post了解一些起点。如果可能,请尝试更新的内核。

答案 1 :(得分:1)

至少有两个可能的问题:

  

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

必须确保mapAddr不要超过映射的大小,mapAddr+size。您试图触摸size个字节,而不只是一个。

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

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

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