我在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中,还是可以?我不确定调用约定。
感谢您的帮助。
首先,就像杰斯特指出的那样,%rsi未被初始化是一个问题。
之后,系统调用ABI错误。第四个参数(标志)应该在%r10
中传递,而不是在%rcx
中传递。
标志寄存器的CF标志指示错误。如果已设置,则%rax
包含错误号;否则,返回值。
最后,我应该指出,Apple特别声明syscall ABI在操作系统的发行之间可能不稳定。稳定的ABI是库包装层(即,您应该从libSystem.dylib调用_mmap
)。他们保留随时中断直接执行系统调用的任何操作的权利。