【发布时间】:2017-06-14 20:11:27
【问题描述】:
我试图通过映射一个 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]);
【问题讨论】:
-
ram_bytes的值是多少? -
你没有检查
mmap是否成功! -
@DavidSchwartz 没关系,映射成功时会生成sigbus。
-
@AnttiHaapala 当然,但这将是一个完全不同的原因,例如,如果他在一个共享内存支持已被禁用的平台上。
-
另外,
int16_t ramD;是一个非常奇怪的文件描述符变量类型。为什么不直接使用 int?