mmap SIGBUS错误并初始化文件

时间:2017-06-14 20:11:28

标签: c mmap

我正在尝试通过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]);

1 个答案:

答案 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来存储文件描述符。