Mac 64 位系统调用

Mac 64-bit syscall

本文关键字:系统调用 Mac      更新时间:2023-10-16

如何在 Mac 上执行64 位syscallin C++.

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

#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);
}

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

我编译:

g++ ./mmap.cc -o ./mmap 

附言我知道存在mmap函数,以上只是一个例子,我需要让syscall函数工作。

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

int  syscall(int, ...);

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

void *  mmap(void *, size_t, int, int, int, off_t) __DARWIN_ALIAS(mmap);

mmap如何实际实施?

P.P.P.S.

在 Linux 上,只要

long syscall(long number, ...);

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

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

另外,如果您使用这些函数,请不要忘记将 Unix 系统调用类移位添加到您的系统呼叫号码0x2000000

int SYS_write = 4;
int STDOUT = 1;
char* str = "Hello worldn";
syscall3(0x2000000 + SYS_write, STDOUT, str, 12);

正如Ken Thomases指出的那样,syscall函数在OS X上被弃用。

对于您的特定示例,您应该使用mmap而不是syscallmmap函数不是根据syscall函数实现的,而是根据__mmap实现的:

libsystem_kernel.dylib`mmap:
0x7fff643fa69e <+87>:  callq  0x7fff643fe998            ; __mmap

反过来,它执行实际的系统调用,并且可能在汇编中实现:

libsystem_kernel.dylib`__mmap:
0x7fff643fe998 <+0>:  movl   $0x20000c5, %eax          ; imm = 0x20000C5
0x7fff643fe99d <+5>:  movq   %rcx, %r10
0x7fff643fe9a0 <+8>:  syscall
0x7fff643fe9a2 <+10>: jae    0x7fff643fe9ac            ; <+20>