我使用的是 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
工作正常,但返回的“地址”syscall
导致段错误
。来自 syscall
的值似乎被转换为 32 位或其他值。
我做错了什么?
最佳答案
在您的syscall()
中,不要为第一个参数addr
传递0 (NULL)
,而是传递一些您拥有的指针之前声明过。这样就可以访问mmap
映射的内存了。 mmap
函数声明:
void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);
关于C - 系统调用 - 64 位 - 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38640828/