如何处理rust:SIGBUS中的这个mmap错误:访问未定义的内存



我正在使用cratememmap对一个文件进行mmap。映射是这样完成的:

let mut mmap_var =   memmap::MmapOptions::new().len(8589934592)
.map_mut(file).unwrap();

一切都很顺利,直到我达到u8的mmap_var[4096]和u64的mmap_var[511]中包含的值。

当我尝试更进一步时,我得到一个:信号:7,SIGBUS:访问未定义的内存

我不明白为什么,因为当我读取mmaped数组的长度时,它与我设置的值相对应。

我想访问整个地图区域。

编辑

我知道问题出在文件大小上,因为它是一个常规文件。

我现在的问题是,主要目标是mmap一个长度为零的角色设备文件。

指令是:

memmap2::MmapOptions::new().len(65000)
.map_mut(&file);

结果是:

Os {
code: 19,
kind: Uncategorized,
message: "No such device",}

我搞定了!

当您尝试对一个常规文件进行mmap时,长度应为文件大小的最大值,以避免SIGBUS对未定义的内存区域进行访问。

关于设备文件,情况有所不同,因为即使它们的大小为零,也应该将它们视为属于设备的内存区域。

因此,设备文件的长度为零并不是一个问题。但是要小心将长度设置为小于设备内存区域大小的值。

EDIT关于上一个错误,它只是由于底层设备不支持mmap。因此,您应该为该设备的文件操作提供一个mmap处理程序。

最新更新