Mac 64 位系统调用
Mac 64-bit syscall
如何在 Mac 上执行64 位syscall
in 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
而不是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>
相关文章:
- 有什么好的方法可以让系统调用代理允许在单元测试中进行模拟
- 如果整个应用程序是虚拟映射的,为什么 new 会进行系统调用?
- 如何将C++系统调用连接到 freertos
- 如何使用 C/C++ 和 system() 系统调用以外的其他方法在 Linux 中获取文件功能?
- 系统调用:一次和多次,哪个更好?
- 使用路径和空格的系统调用
- 是否有等效于 macOS 上的 clone() 系统调用?
- 从C++调用系统调用节点?
- C++测试程序中的非法系统调用(对角矩阵元素程序的总和)
- 英特尔 Pin:如何获取系统调用的返回地址
- 如何使用低级系统调用从 stdin 和输入文件中获取字节数
- 使用模拟器C++从RISC-V裸机程序调用printf系统调用时失败
- 动态执行的 ARM ASM 系统调用,可从C++重新定位
- 如何知道我正在使用的Linux OS是否具有特定的系统调用
- 当C 中的系统调用conconculables时,参数字符串中的字符损失
- 调用系统调用函数时出现异常
- 在 boost::asio 中自定义套接字/关闭系统调用
- 系统调用失败"Incorrect Section Name -e" C++
- 绕过系统调用 C++
- Mac 64 位系统调用