【问题标题】:How to Dynamically Allocate Memory Using Assembly and System Calls Under Linux如何在 Linux 下使用汇编和系统调用动态分配内存
【发布时间】:2011-02-16 10:37:39
【问题描述】:

我正在寻找一些在 Linux 下使用汇编语言并使用系统调用而不是 malloc 和朋友的动态内存分配的好代码示例。

有哪些最简单但有效的方法?

在 Intel 386+ 计算机上。

【问题讨论】:

标签: linux assembly system-calls dynamic-memory-allocation


【解决方案1】:

使用 brk 系统调用更改数据段的结尾。

看看这里:http://www.linuxjournal.com/article/6390 了解您在做什么。

【讨论】:

    【解决方案2】:

    brk(2)。看看ELF

    【讨论】:

      【解决方案3】:

      brk() 的替代方法是使用mmap() 系统调用和MAP_ANONYMOUS | MAP_PRIVATE

      【讨论】:

        【解决方案4】:

        在 Linux 上,mmap2 是一个合理的系统调用,可用于低级别。它需要 6 个参数,因此在 IA32 中您可以使用以下方式调用它:

            mov eax, 192    ; mmap2
            xor ebx, ebx    ; addr = NULL
            mov ecx, 4096   ; len = 4096
            mov edx, $7     ; prot = PROT_READ|PROT_WRITE|PROT_EXEC
            mov esi, $22    ; flags = MAP_PRIVATE|MAP_ANONYMOUS
            mov edi, -1     ; fd = -1
            xor ebp, ebp    ; offset = 0 (4096*0)
            int $80         ; make call
        

        (有关参数传递的详细信息,请参阅relevant kernel source

        我使用 NASM 构建了它,并使用 strace 验证了它的工作原理,结果如下:

        mmap2(NULL, 4096, PROT_READ|PROT_WRITE|PROT_EXEC, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0xf77ae000
        

        【讨论】:

        • 要修复的错误:(0x02 | 0x20) 是 34,而不是 22。另外,PROT_EXEC 不需要分配内存。
        • @Hibou57 除非我遗漏了一些东西 $22 是十六进制 22,这对于 (0x02|0x20) 是正确的。它不需要 exec,但我一直在编写的示例代码需要它,所以我保持原样。
        • 是的,你是对的,那是使用 NASM 语法(我错误地将其红色为 gas 文字)。注意:关于文件描述符为 -1,我检查过 amd64(当然不是同一个程序集列表)需要 0,并返回 -EINVAL 和 -1。在 i386 上,-1 和 0 都有效,所以至少考虑到 i386 和 amd64,0 比 -1 更便携,至少从内核 Linux 2.8 开始。
        • 您能否就如何释放分配的空间提供一些提示?谢谢。
        • @AuBee munmap(void*,size_t) - 基本上你只需要设置 EAX(系统调用号 - 我认为是 91)、EBX(地址)和 ECX(长度)。
        猜你喜欢
        • 2017-12-13
        • 2019-11-10
        • 2016-01-16
        • 1970-01-01
        • 2018-05-11
        • 2010-12-18
        • 2012-01-20
        • 2015-04-30
        • 1970-01-01
        相关资源
        最近更新 更多