Mac 64 位系统调用
Mac 64-bit syscall
如何在 C++ 中的 Mac 上执行 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
P.S。我知道存在 mmap
函数,以上只是一个例子,我需要让 syscall
函数工作。
P.P.S。问题是在 64 位系统上 syscall
应该 return 64 位值,但在 Mac unistd.h
中它被定义为 int
:
int syscall(int, ...);
这是一个错误吗? mmap
系统调用return正确void*
:
void * mmap(void *, size_t, int, int, int, off_t) __DARWIN_ALIAS(mmap);
mmap
实际上是如何实现的?
P.P.P.S.
在 Linux 上它被正确定义为 long:
long syscall(long number, ...);
正如 Ken Thomases 指出的那样,syscall
函数在 OS X 上已弃用。
对于您的具体示例,您应该使用 mmap
而不是 syscall
。 mmap
函数不是根据 syscall
函数实现的,而是根据 __mmap
:
实现的
libsystem_kernel.dylib`mmap:
0x7fff643fa69e <+87>: callq 0x7fff643fe998 ; __mmap
反过来,它执行实际的系统调用并且可能在汇编中实现:
libsystem_kernel.dylib`__mmap:
0x7fff643fe998 <+0>: movl [=11=]x20000c5, %eax ; imm = 0x20000C5
0x7fff643fe99d <+5>: movq %rcx, %r10
0x7fff643fe9a0 <+8>: syscall
0x7fff643fe9a2 <+10>: jae 0x7fff643fe9ac ; <+20>
经过一些搜索,我没有找到在 Mac 上执行 64 位系统调用的方法。
所以,我自己实现了这些,你can find the functions here。
此外,如果您使用这些功能,请不要忘记添加 0x2000000
Unix 系统调用 class 转移到您的系统调用号码:
int SYS_write = 4;
int STDOUT = 1;
char* str = "Hello world\n";
syscall3(0x2000000 + SYS_write, STDOUT, str, 12);
如何在 C++ 中的 Mac 上执行 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
P.S。我知道存在 mmap
函数,以上只是一个例子,我需要让 syscall
函数工作。
P.P.S。问题是在 64 位系统上 syscall
应该 return 64 位值,但在 Mac unistd.h
中它被定义为 int
:
int syscall(int, ...);
这是一个错误吗? mmap
系统调用return正确void*
:
void * mmap(void *, size_t, int, int, int, off_t) __DARWIN_ALIAS(mmap);
mmap
实际上是如何实现的?
P.P.P.S.
在 Linux 上它被正确定义为 long:
long syscall(long number, ...);
正如 Ken Thomases 指出的那样,syscall
函数在 OS X 上已弃用。
对于您的具体示例,您应该使用 mmap
而不是 syscall
。 mmap
函数不是根据 syscall
函数实现的,而是根据 __mmap
:
libsystem_kernel.dylib`mmap:
0x7fff643fa69e <+87>: callq 0x7fff643fe998 ; __mmap
反过来,它执行实际的系统调用并且可能在汇编中实现:
libsystem_kernel.dylib`__mmap:
0x7fff643fe998 <+0>: movl [=11=]x20000c5, %eax ; imm = 0x20000C5
0x7fff643fe99d <+5>: movq %rcx, %r10
0x7fff643fe9a0 <+8>: syscall
0x7fff643fe9a2 <+10>: jae 0x7fff643fe9ac ; <+20>
经过一些搜索,我没有找到在 Mac 上执行 64 位系统调用的方法。
所以,我自己实现了这些,你can find the functions here。
此外,如果您使用这些功能,请不要忘记添加 0x2000000
Unix 系统调用 class 转移到您的系统调用号码:
int SYS_write = 4;
int STDOUT = 1;
char* str = "Hello world\n";
syscall3(0x2000000 + SYS_write, STDOUT, str, 12);