【发布时间】:2026-02-01 07:40:01
【问题描述】:
我想创建一个包含例如 4 个值的数组 这是我的代码:
mov $32,%rsi # 4 x 8bytes
mov $9,%rax
mov $0,%rdi
mov $0x3,%rdx
mov $0x01,%r10
mov $0,%r9
syscall
现在我在 rax 中有一个分配 32 字节的新地址?
当我试图把东西放进去时,例如:
mov $0,%r14
mov $3,%rdx
mov %rdx,(%rax,%r14,8)
它给了我 SIGSEGV 错误
【问题讨论】:
-
系统调用后
rax的值是多少?是MAP_FAILED(0xFFFFFFFFFFFFFFFF) 吗?此外,对于系统调用,系统调用# 进入rax,参数按顺序进入寄存器rdi rsi rdx r10 r8 r9。对于void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset);,这意味着 addr->rdi、length->rsi、prot->rdx、flags->r10、fd->r8 和 offset->r9。为什么不设置 r8? -
rax 在系统调用之后有 0xfffffffffffffff7。 r8 默认为 0 ,我已将其更改为 -1
mov $-1,%r8并将 r10 设置为 3 (map_anonymous) 现在我收到了 rax0xffffffffffffffff(map_failed) -
您必须保留
MAP_PRIVATE标志并在其中添加MAP_ANONYMOUS。规则是必须指定MAP_PRIVATE或MAP_SHARED中的一个,但不能同时指定两者,并且此外零个或多个其他标志,包括MAP_ANONYMOUS。 -
现在我将 1 放入 r10
mov $1,%r10作为MAP_PRIVATE,syscal 之后的 rax 现在是0xffffffffffffffed,但是当我想对这个mov %rdx,(%rax,%r14,8)进行操作时,它给了我 SIGSEGV错误 -
我发现
MAP_PRIVATE是0x1,MAP_ANONYMOUS是0x3,对01和11进行OR运算后得到11,与0x3相同。我试过在 r10 中输入 1,2,3,4,5,6,7 数字,总是以 SIGSEGV 错误结尾。
标签: linux assembly x86-64 mmap system-calls