【发布时间】:2019-06-21 23:22:57
【问题描述】:
我一直在尝试使用 mmap 分配内存,但到目前为止我不知道如何正确执行。下面你可以看到我写的一个函数,它是从C调用的。它产生的结果总是197,和系统调用号一样。
C 声明:
extern "C" void * ll_alloc ();
程序集定义:
_ll_alloc:
sub rsp, 8
mov r9, 0
mov rdi, 0
mov rax, 197
mov rsi, 4096
mov r8, -1
mov rdx, 0x02 | 0x01
mov rcx, 0x1000 | 0x0001
syscall
add rsp, 8
ret
我直接从 C 调用 mmap,一切都按预期工作,我调用了:
void * mem = mmap(NULL, 4096, PROT_WRITE | PROT_READ, MAP_ANON | MAP_SHARED, -1, 0);
【问题讨论】:
-
我认为 MacOS 有相当于 Linux
strace的功能,用于跟踪系统调用。使用它来了解您的syscall会发生什么。我怀疑 eax=197 是错误的电话号码;我认为 MacOS 系统调用设置了高位。不过,我发现它会让 RAX 保持不变,而不是返回-ENOSYS,如果这是问题所在,我感到很惊讶。 -
这是我们正在寻找的行,从 dtruss
mmap(0x0, 0x1000, 0x3, 0x1001, 0xFFFFFFFFFFFFFFFF, 0x0) = 0x100783000 0转储 -
那来自你的工作版本?我的意思是
dtruss你的非工作版本,看看你实际上用 asm 做了什么系统调用。 -
您为什么操作系统编程?如果这是 macOS,那么您需要实际使用来自 macOS 的系统调用编号和常量,它们与 Linux 编号不同。调用约定也可能不同,但我不确定。
-
@PeterCordes 对不起!不,这不是来自大会的电话。我误解了。我找不到我打的电话。我正在使用来自站点的系统调用:sigsegv.pl/osx-bsd-syscalls。是的,我知道它们与 linux 中使用的不同。
标签: macos assembly x86-64 nasm