【问题标题】:Can't change heap size AMD64无法更改堆大小 AMD64
【发布时间】:2016-06-19 05:35:42
【问题描述】:

我试图通过更改 brk 将堆大小增加 100,但我不知道为什么我的代码不起作用。
这是尝试执行此操作的代码部分:

movq $0, %rdi
movq $12, %rax
syscall
movq %rax, InicialHeap

movq InicialHeap, %rsi
mov $str, %rdi
call printf

movq $100, %rdi
movq $12, %rax
syscall

movq %rax, %rsi
mov $str, %rdi
call printf

movq InicialHeap, %rdi
movq $12, %rax
syscall

movq InicialHeap, %rsi
mov $str, %rdi
call printf

movq $60, %rax
syscall

程序应该打印如下内容:
x(打印初始堆)
x + 100(打印初始堆 + 100)
x(打印初始堆)
但它只打印 3 次相同的结果“x”。
我必须做些什么来增加我的堆大小?

【问题讨论】:

  • 为什么在第二次调用时会加100,而在第三次调用时却不加InicialHeap中存储的值?
  • 你能用 strace 重新运行你的程序并发布结果吗?例如,strace ./a.out。 Strace 将打印所有系统调用,解码它们的参数并显示和解码返回值。你的操作系统是什么?在 linux 中 brk 有点奇怪:linux.die.net/man/2/brk.
  • 虽然不是这个问题的答案,但可以在这个 SO 答案中找到一些使用 NASM(非 GNU 汇编器)的示例 32 位代码(不是 64 位):stackoverflow.com/a/33903235/3857942。该代码确实使用了brk 32 位系统调用,但该代码中的想法应该能够以最小的努力适应在您的汇编器中使用 64 位系统调用。
  • 你在为什么操作系统编程?

标签: assembly heap-memory brk


【解决方案1】:

作为 the man page for int brk(void *addr); describes 的 NOTES 部分,系统调用 (__NR_brk = 12) 实际上实现了 brk(),而不是 sbrk,但返回的是当前中断而不是整数。

作为@osgx cmets,尝试在strace 下运行你的程序,看看你得到了什么返回值。例如从strace /bin/true可以看出,动态链接器启动是正常的,使用brk(0)找出当前的断点:

brk(0)                                  = 0x24c6000

从那里,您应该保存返回值,并在下次调用 brk() 时使用一个偏移量。


您当前的代码显然无法运行:

movq $100, %rdi
movq $12, %rax
syscall             ;;  brk((void*)100)

【讨论】:

    猜你喜欢
    • 2011-09-17
    • 2012-01-10
    • 2018-09-13
    • 2018-06-08
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多