Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C mmap SIGBUS错误并初始化文件_C_Mmap - Fatal编程技术网

C mmap SIGBUS错误并初始化文件

C mmap SIGBUS错误并初始化文件,c,mmap,C,Mmap,我试图通过映射一个与RAM大小相对应的1MIB文件来模拟一个基本CPU。我想读/写这个文件。目前,我得到了一个SIGBUS错误,ram[2]=1,我收集到这个错误是由于试图将其映射到文件范围之外。我已经读到,也许我需要用零作为占位符填充文件,但我有点困惑为什么我必须这样做,因为我认为mmap会自动为我留出一个内存块,当我第一次触摸它时会分配给我(正如我在下面的测试中尝试做的那样)。我错过了什么 int16_t ramD; if ( (ramD = open("ramMap.txt", O_RDW

我试图通过映射一个与RAM大小相对应的1MIB文件来模拟一个基本CPU。我想读/写这个文件。目前,我得到了一个SIGBUS错误,
ram[2]=1
,我收集到这个错误是由于试图将其映射到文件范围之外。我已经读到,也许我需要用零作为占位符填充文件,但我有点困惑为什么我必须这样做,因为我认为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]);

SIGBUS的
SIGBUS
表示您正在文件外写入。从Linux手册页:

SIGBUS

试图访问缓冲区中与文件不对应的部分(例如,超出文件末尾, 包括另一个进程已截断 文件)

创建新文件时,该文件最初为空,即大小为0字节。您需要使用
ftruncate
调整其大小,使其至少足够大以包含写入的地址(可能四舍五入到页面大小)。如果您想要一个大小为
ram\u字节
的ram磁盘,那么:

ftruncate(ramD, ram_bytes);



PS.
open
返回一个
int
;您应该使用
int
,而不是
int16\u t
,来存储文件描述符。

内存字节的值是多少?您没有检查
mmap
是否成功@DavidSchwartz没关系,当映射成功时会生成sigbus。@AnttiHaapala当然可以,但这将是一个完全不同的原因,例如,如果他在一个共享内存支持已被禁用的平台上是一种非常奇怪的变量类型。为什么不用int呢?