【问题标题】:Creating array with mmap function. Assembler x86_64 AT&T使用 mmap 函数创建数组。汇编器 x86_64 AT&T
【发布时间】: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) 现在我收到了 rax 0xffffffffffffffff(map_failed)
  • 必须保留MAP_PRIVATE 标志并在其中添加MAP_ANONYMOUS。规则是必须指定 MAP_PRIVATEMAP_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


【解决方案1】:

mmap 需要 6 个参数,但您只传递了 5 个。您忘记为文件描述符设置 r8。假设你想分配匿名内存,这应该设置为-1,当然MAP_ANONYMOUS也应该在标志中设置。

PS:如果你有可用的 C 库,分配内存的简单方法是调用malloc()

【讨论】:

  • r8 为 0,我已将其更改为 -1 mov $-1,%r8,并将 r10 设置为 3 (map_anonymous)。系统调用 rax 为 0xffffffffffffffff 后 - 映射失败。我想在没有 C 库的情况下做到这一点
  • MAP_ANONYMOUS0x20MAP_PRIVATE0x02 (see kernel source) ...不知道你从哪里得到了错误的值。所以MAP_ANONYMOUS | MAP_PRIVATE 给了0x22
  • OP 没有指定他所在的系统,并且为这两个标志提供的值对我来说是陌生的,但现在是时候问了...就此而言,here 是马赫; #define MAP_PRIVATE 0x0002#define MAP_ANON 0x1000。 @Piodo,您正在开发什么系统? Linux?苹果电脑?完全不同的东西?
  • 我正在使用 Ubuntu Linux。我已将 0x22 放入 r10 中,它似乎有效。感谢 Jester 和 Iwillnotexist Idonotexist 为像我这样的新手浪费时间。我真的很感谢你的帮助。谢谢