Mac OSX上的mmapping/dev/zero提供的参数无效
所以我尝试将一些代码从Linux移植到MacOSX。在移植过程中,我遇到了这段代码Mac OSX上的mmapping/dev/zero提供的参数无效,c,linux,macos,mmap,C,Linux,Macos,Mmap,所以我尝试将一些代码从Linux移植到MacOSX。在移植过程中,我遇到了这段代码 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("could
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_匿名| MAP_共享,fd,0)代码>到newnode->ptr=mmap(NULL,size,prot,MAP_ANON | MAP_SHARED,fd,0)
因为Mac OSX没有MAP\u ANONYMOUS
标志,而是使用MAP\u ANON
但是当我运行程序时,mmap调用失败,参数无效。所以我的下一个想法是检查手册页,看看是什么导致无效参数错误。第一个原因是设置了MAP\u FIXED
,并且addr参数没有对齐页面,但我没有调用MAP\u FIXED
。其次,如果您没有指定MAP\u PRIVATE
或MAP\u SHARED
,它将返回无效参数,但我使用的是MAP\u SHARED
,所以不应该是这样。接下来它说len参数不能是负数,所以我打印了size变量并运行了它,它是一个正值。最后一个原因是offset参数不是页面对齐的,但是我传递的是零,所以这也不应该是问题所在
接下来我检查了堆栈溢出,看到了这个问题。我尝试使用MAP\u文件
而不是MAP\u ANON
,但现在我得到了设备不支持的操作,手册页上说这意味着我缺少MAP\u ANON
。所以我尝试添加MAP\u ANON
,这样我就有了mmap(NULL,size,prot,MAP\u FILE | MAP\u ANON | MAP\u SHARED,fd,0)代码>但它也返回无效参数
那么,如何在Mac OSX上创建mmap/dev/zero,或者至少在Mac OSX上创建一个零填充内存映射呢?根据mmap()
手册页,您应该传递-1而不是fd
作为文件描述符的值。另外,正如你所说的,MAP\u ANON
是MacOS(至少是旧版本)的正确选项,而且不需要MAP\u文件
有一个例子,上面的注释在OS X上不起作用,因为你不能在/dev/zero上进行mmap如果最终是这样,我将与苹果一起打开一个bug报告,但是如果你不能在Mac OSX上对/dev/zero进行mmap,那么它的另一个使用案例是什么呢?你可以使用cat/dev/zero
来获取源源不断的(空)数据。