Mac OSX上的mmapping / dev / zero给出了无效参数

时间:2015-02-23 17:24:21

标签: c linux macos mmap

所以我试图将一些代码从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_PRIVATEMAP_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上创建零填充内存映射?

1 个答案:

答案 0 :(得分:0)

根据fd手册页,您应该传递-1而不是mmap()作为文件描述符的值。另外正如您所说MAP_ANON是MacOS的正确选项(至少是旧版本),并且不需要MAP_FILE