我想在两个进程之间共享内存
在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
信息
答案 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
确实是一个数组,它当然是等价的,但是你的代码风格会不一致。)