从Macos Catalina上的程序集调用mmap来保留内存

问题描述 投票:0回答:1

我在MacOs Catalina上有一个没有链接库的程序集文件,想要调用mmap来动态保留一些内存。我以为我需要做类似的事情

#define __NR_mmap 0x20000c5

#define PROT_READ 0x01
#define PROT_WRITE 0x02
#define PROT_EXEC 0x04
#define PROT_ALL (PROT_READ | PROT_WRITE | PROT_EXEC)

#define MAP_ANON 0x1000
#define MAP_SHARED      0x0001
#define MAP_PRIVATE     0x0002

#define USER_DEFS_SIZE 0x20000

        mov $__NR_mmap, %rax            //mmap
        xor %rdi,%rdi                   // start address
        and $USER_DEFS_SIZE,%rsi        // length
        mov $PROT_READ, %rdx            // rwx
        mov $(MAP_ANON|MAP_SHARED),%rcx // flags
        xor %r8,%r8                     // file descriptor
        xor %r9,%r9                     // offset
        syscall

但是在%rax中返回0x13(ENODEV)。我尝试传递文件描述符$ -1,但这给了我一个预期的“错误的文件描述符”错误。]

  • 问题1:我在做什么错-如何正确调用mmap来保留内存?

  • 问题2:寄信人地址和errno如何返回?集会不能都在%rax中,还是可以?我不确定调用约定。

感谢您的帮助。

macos assembly x86-64 macos-catalina
1个回答
2
投票

首先,就像杰斯特指出的那样,%rsi未被初始化是一个问题。

之后,系统调用ABI错误。第四个参数(标志)应该在%r10中传递,而不是在%rcx中传递。

标志寄存器的CF标志指示错误。如果已设置,则%rax包含错误号;否则,返回值。

最后,我应该指出,Apple特别声明syscall ABI在操作系统的发行之间可能不稳定。稳定的ABI是库包装层(即,您应该从libSystem.dylib调用_mmap)。他们保留随时中断直接执行系统调用的任何操作的权利。

© www.soinside.com 2019 - 2024. All rights reserved.