[英]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
PS我知道存在mmap
函数,上面只是一个例子,我需要让syscall
函数工作。
PPS问题是在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
是如何实际实现的?
购买力平价
在Linux上,它被正确定义为:
long syscall(long number, ...);
经过一番搜索后,我找不到在Mac上执行64位系统调用的方法。
所以,我自己实现了这些,你可以在这里找到这些功能 。
另外,如果你使用这些功能,不要忘了加0x2000000
Unix的系统调用类转移到你的系统调用号:
int SYS_write = 4;
int STDOUT = 1;
char* str = "Hello world\n";
syscall3(0x2000000 + SYS_write, STDOUT, str, 12);
正如Ken Thomases所指出的,OS X上不推荐使用syscall
函数。
对于您的具体示例,您应该使用mmap
而不是syscall
。 mmap
函数不是根据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>
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.