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()
。
我使用的是 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()
。