You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

64位Linux汇编中sys_brk是否返回地址?FASM代码疑问

64位Linux下sys_brk系统调用问题解答

1. sys_brk是否会返回地址

是的,sys_brk的返回值就是地址:

  • 调用成功时,返回当前进程数据段的新brk(程序断点)地址;若仅查询当前brk地址(比如传入特殊参数),则直接返回当前的brk地址;
  • 调用失败时,返回一个负值(对应Linux错误码,如-EINVAL代表参数无效)。

2. 你提供的FASM代码执行后rax的返回值

你给出的代码:

mov     rdx, 0       
mov     rax, 12     
syscall

在Ubuntu 22.04(x86_64架构)下执行时,rax会返回当前进程的brk地址,且该地址确实是4KB页面对齐的——因为Linux内存管理以页为单位分配,brk地址必须满足页对齐要求。

这里需要注意:这段代码没有设置rdi寄存器(sys_brk的参数寄存器),rdi的值取决于程序执行上下文,但只要该值不变,rax的返回结果就会保持一致。

3. rdx传入0的作用&修改rdx不影响结果的原因

在x86_64 Linux的系统调用规范中,sys_brk的唯一参数(目标brk地址)通过rdi寄存器传递,rdx并不参与该系统调用的参数处理:

  • 你给rdx传入0没有任何实际作用,sys_brk不会读取这个寄存器的值;
  • 无论你给rdx设置什么值,都不会改变sys_brk的执行结果,因为它只关注rdi中的内容。

另外补充:若你想查询当前brk地址,正确的写法是将rdi设为0,再调用sys_brk:

mov     rdi, 0       
mov     rax, 12     
syscall

此时rax会返回当前进程的brk地址,不会修改它。

内容的提问来源于stack exchange,提问作者ntos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 07:47:47