C - 系统调用 - 64 位 - 指针

C - syscall - 64-bit - pointer

我使用的是 64 位 Linux x86。我需要使用 syscall 函数执行 mmap 系统调用。 mmap 系统调用号为 9:

printf("mmap-1: %lli\n", syscall(9,    0, 10, 3, 2 | 32, -1, 0));
printf("mmap-2: %lli\n", mmap(         0, 10, 3, 2 | 32, -1, 0));

但是,当我 运行 它时,syscall 函数给出了错误的结果。

mmap-1: 2236940288
mmap-2: 140503502090240

mmap-1: 3425849344
mmap-2: 140612065181696

mmap-1: 249544704
mmap-2: 139625341366272

mmap 工作正常,但 "addresses" 返回 syscall 结果为 Segmentation fault。来自 syscall 的值似乎被强制转换为 32 位或其他。

我做错了什么?

在您的 syscall() 中,不是为第一个参数 0 (NULL) 传递 addr,而是传递您之前声明的一些指针。这样就可以访问mmap映射的内存了。 mmap 函数声明:

void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);

找到问题原因:我是运行gcc-std=c99选项,去掉解决问题:

mmap-1: 139975263928320
mmap-2: 139975263924224

我想,-std=99 将系统调用定义为 int syscall(),没有它它的 long syscall()