我正在尝试通过mmapping 1 MiB文件来建模基本CPU,对应于RAM大小。我想读/写这个文件。目前我收到ram[2] = 1
的SIGBUS错误,我收集的是尝试在文件范围之外进行mmap。我读过,也许我需要用零填充文件作为占位符,但我有点困惑为什么我必须这样做,因为我认为mmap会自动为我分配一个内存块,将被分配当我第一次触摸它时(因为我试图在下面进行测试)。我错过了什么?
int16_t ramD;
if ( (ramD = open("ramMap.txt", O_RDWR | O_CREAT, 0666)) == -1)
{
errx(EX_OSERR, "RAM could not be initialized");
}
uint8_t* ram = mmap(0, ram_bytes, PROT_READ | PROT_WRITE, MAP_SHARED, ramD, 0);
ram[2] = 1;
printf("%i", ram[2]);
答案 0 :(得分:4)
SIGBUS
表示您在文件外写字。来自Linux手册页mmap(2)
:
<强>
SIGBUS
强>尝试访问与文件不对应的部分缓冲区(例如,超出文件末尾, 包括另一个进程截断的情况 文件)。
在创建新文件时,它最初是为空,即大小为0字节。您需要使用ftruncate
调整其大小,使其至少足以包含写入的地址(可能向上舍入到页面大小)。如果你想要一个大小为ram_bytes
的ram磁盘,那么:
ftruncate(ramD, ram_bytes);
See this answer for a longer explanation about the same mechanism, using POSIX shared memory objects
PS。 open
返回int
;您应该使用int
而不是int16_t
来存储文件描述符。