【问题标题】:Mac 64-bit syscallMac 64 位系统调用
【发布时间】:2018-06-06 06:36:37
【问题描述】:

如何在 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);
}

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

我编译:

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

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

附言问题是在 64 位系统上 syscall 应该返回 64 位值,但在 Mac 中 unistd.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, ...);

【问题讨论】:

  • 您没有收到编译器警告syscall() 已被弃用吗? unistd.h 中的函数声明装饰有弃用属性,其中包括语句“syscall(2) is unsupported; please switch to a supported interface”。 macOS 明确不支持您尝试做的事情。在其他地方,Apple 解释说库接口(例如 mmap() 之类的函数)是 ABI 兼容性接口,并且不保证直接系统调用在操作系统更新之间工作或保持兼容。
  • @KenThomases 我都知道了,你知道如何在不借助汇编的情况下执行 64 位 syscall 吗?

标签: c++ macos system-calls


【解决方案1】:

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

所以,我自己实现了这些,你can find the functions here

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

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

syscall3(0x2000000 + SYS_write, STDOUT, str, 12);

【讨论】:

    【解决方案2】:

    正如 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>
    

    【讨论】:

    • 正如我所说,mmap 只是一个例子。那么,我是否正确地说 Mac 基本上没有正确实现 syscall 函数,我必须自己实现?
    • AFAIK 是的,如果您需要 64 位返回值,则必须编写自己的函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-28
    • 2018-10-01
    • 1970-01-01
    • 2014-12-30
    • 2020-04-22
    相关资源
    最近更新 更多