2017-06-14 32 views
2

我试图通过映射一个1 MiB文件,对应于RAM大小来建模一个基本的CPU。我想读/写这个文件。目前我收到一个SIGBUS错误ram[2] = 1,我收集的是试图在文件范围之外的mmap。我读过,也许我需要用零填充文件作为占位符,但我有点困惑,为什么我必须这样做,因为我认为mmap会自动为我分配一个内存块,将分配给我当我第一次触摸它时(正如我试图在我的测试中做的那样)。我错过了什么?mmap SIGBUS错误并初始化文件

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

'ram_bytes'的值是什么? – myaut

+1

你没有检查'mmap'是否成功! –

+0

@DavidSchwartz没关系,映射成功时会生成sigbus。 –

回答

3

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