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

标签 c system-calls mmap

我使用的是 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/

相关文章:

c - 我怎么知道 linux 系统调用是否线程安全?

c - 在调用 mmap 后我是否需要保持文件打开?

c - 如何使用 printf 函数添加连续字节的数字以显示整数?

c - 这段代码的时间复杂度是多少?

c - 作业,在 C 结构体中分配指针

在 C 中转换数字数据类型

c - 在 C : Or how to dynamically allocate an array? 中将文件读入 char 数组

c - macOS 上的 gettimeofday() 是否使用系统调用?

c - 为什么共享内存中的 memcpy 会出现段错误

c - 使用mmap分配内存