所以我试图将一些代码从Linux移植到Mac OSX。在移植过程中,我遇到了这段代码。
static void allocZeroMap(unsigned long size, int prot, const char *name)
{
struct map *newnode;
int fd;
char buf[11];
fd = open("/dev/zero", O_RDWR);
if (fd == -1) {
printf("couldn't open /dev/zero\n");
exit(EXIT_FAILURE);
}
newnode = zmalloc(sizeof(struct map));
newnode->name = strdup(name);
newnode->size = size;
newnode->prot = prot;
newnode->type = INITIAL_MAP;
newnode->ptr = mmap(NULL, size, prot, MAP_ANONYMOUS | MAP_SHARED, fd, 0);
if (newnode->ptr == MAP_FAILED) {
perror("mmap");
exit(EXIT_FAILURE);
}
newnode->name = zmalloc(80);
sprintf(newnode->name, "anon(%s)", name);
num_initial_mappings++;
list_add_tail(&newnode->list, &initial_mappings->list);
sizeUnit(size, buf);
printf("mapping[%d]: (zeropage %s) %p (%s)\n",
num_initial_mappings - 1, name, newnode->ptr, buf);
close(fd);
}
所以我认为我需要将newnode->ptr = mmap(NULL, size, prot, MAP_ANONYMOUS | MAP_SHARED, fd, 0);
切换为newnode->ptr = mmap(NULL, size, prot, MAP_ANON | MAP_SHARED, fd, 0);
,因为Mac OSX没有MAP_ANONYMOUS
标记,而是使用MAP_ANON
。
但是当我运行该程序时,该mmap调用失败并带有Invalid参数。所以我的下一个想法是检查手册页,了解导致无效参数错误的原因。第一个原因是设置了MAP_FIXED
并且addr参数没有页面对齐,但我没有调用MAP_FIXED
。其次,它表示如果你没有指定MAP_PRIVATE
或MAP_SHARED
,它会返回无效参数,但我使用MAP_SHARED
这样就不应该这样做了。不管怎样。接下来它说len参数不能是负数,所以我打印了size变量并运行它并且它是一个正值。最后一个原因是offset参数不是页面对齐的,但我传递的是零,所以也不应该是问题。
接下来我检查了堆栈溢出并看到了这个问题mmap with /dev/zero。我尝试使用MAP_FILE
代替MAP_ANON
,但现在我得到设备不支持的操作,手册页显示意味着我缺少MAP_ANON
。所以我尝试添加MAP_ANON
以便我有mmap(NULL, size, prot, MAP_FILE | MAP_ANON| MAP_SHARED, fd, 0);
,但也返回Invalid参数。
那么我如何在Mac OSX上mmap / dev / zero或者至少在Mac OSX上创建零填充内存映射?
答案 0 :(得分:0)
根据fd
手册页,您应该传递-1而不是mmap()
作为文件描述符的值。另外正如您所说MAP_ANON
是MacOS的正确选项(至少是旧版本),并且不需要MAP_FILE
。