Mac 64 位系统调用

Vad*_*Vad 4 c++ macos system-calls

如何在 Mac 上用 C++执行64 位 syscall

我需要以下内容才能工作:

#include <unistd.h>
#include <sys/syscall.h>
#include <sys/types.h>

int main() {
  long* addr = (long*) syscall(SYS_mmap, 0, 100, 1 | 2, 2 | 4096, -1, 0);
}
Run Code Online (Sandbox Code Playgroud)

问题是addr下面应该是 64 位,因为它是一个指针,但它会将结果截断为 32 位值。

我编译:

g++ ./mmap.cc -o ./mmap 
Run Code Online (Sandbox Code Playgroud)

PS我知道存在mmap函数,以上只是一个例子,我需要让syscall函数起作用。

PPS 问题是在 64 位系统上syscall应该返回 64 位值,但在 Mac 中unistd.h它被定义为int

int  syscall(int, ...);
Run Code Online (Sandbox Code Playgroud)

这是一个错误吗?该mmap系统调用返回正确void*

void *  mmap(void *, size_t, int, int, int, off_t) __DARWIN_ALIAS(mmap);
Run Code Online (Sandbox Code Playgroud)

mmap实际是如何实施的?

购买力平价

在 Linux 上,它被正确定义为:

long syscall(long number, ...);
Run Code Online (Sandbox Code Playgroud)

Vad*_*Vad 6

经过一番搜索,我没有找到在 Mac 上执行 64 位系统调用的方法。

所以,我自己实现了这些,你可以在这里找到这些功能

此外,如果您使用这些函数,请不要忘记将0x2000000Unix 系统调用类转移添加到您的系统调用号:

int SYS_write = 4;
int STDOUT = 1;
char* str = "Hello world\n";

syscall3(0x2000000 + SYS_write, STDOUT, str, 12);
Run Code Online (Sandbox Code Playgroud)