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
相关产品推荐
相关产品推荐

