mmap SIGBUS 错误和初始化文件
mmap SIGBUS error and initializing the file
我正在尝试通过映射一个 1 MiB 文件(对应于 RAM 大小)来为基本 CPU 建模。我想要 read/write 这个文件。目前我收到 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]);
SIGBUS
表示您正在文件外写入。来自 Linux 手册页 mmap(2)
:
SIGBUS
Attempted access to a portion of the buffer that does not correspond to the file (for example, beyond the end of the file,
including the case where another process has truncated the
file).
当您创建一个新文件时,它最初是空的,即大小为 0 字节。您需要使用 ftruncate
调整它的大小,使其至少足以包含写入的地址(可能四舍五入到页面大小)。因为你想要一个大小为 ram_bytes
的 ram 磁盘,那么:
ftruncate(ramD, ram_bytes);
.
PS。 open
returns 一个 int
;您应该使用 int
而不是 int16_t
来存储文件描述符。
我正在尝试通过映射一个 1 MiB 文件(对应于 RAM 大小)来为基本 CPU 建模。我想要 read/write 这个文件。目前我收到 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]);
SIGBUS
表示您正在文件外写入。来自 Linux 手册页 mmap(2)
:
SIGBUS
Attempted access to a portion of the buffer that does not correspond to the file (for example, beyond the end of the file, including the case where another process has truncated the file).
当您创建一个新文件时,它最初是空的,即大小为 0 字节。您需要使用 ftruncate
调整它的大小,使其至少足以包含写入的地址(可能四舍五入到页面大小)。因为你想要一个大小为 ram_bytes
的 ram 磁盘,那么:
ftruncate(ramD, ram_bytes);
PS。 open
returns 一个 int
;您应该使用 int
而不是 int16_t
来存储文件描述符。