gpt4 book ai didi

linux - sys_brk 的对齐要求是什么

转载 作者:太空宇宙 更新时间:2023-11-04 12:09:38 29 4
gpt4 key购买 nike

我正在使用 sys_brk 系统调用在堆中动态分配内存。我注意到,在获取当前中断位置时,我通常会得到类似于这样的值:

mov rax, 0x0C
mov rdi, 0x00
syscall

结果

rax   0x401000

该值通常按 512 字节对齐。所以想问下break值有没有对齐要求?或者我们可以按照我们想要的方式错位它?

最佳答案

内核确实以字节粒度跟踪中断。但是,如果您非常关心性能,请不要直接将它用于小的分配。


在评论中有一些关于内核将中断四舍五入到页面边界的讨论,但事实并非如此。 The implementation of sys_brk使用这个(添加了我的评论,所以它在上下文之外是有意义的)

newbrk = PAGE_ALIGN(brk);     // the syscall arg
oldbrk = PAGE_ALIGN(mm->brk); // the current break
if (oldbrk == newbrk)
goto set_brk; // no need to map / unmap any pages, just update mm->brk

这会检查中断是否移动到不同的页面,但最终 mm->brk = brk; 将当前中断设置为传递给系统调用的确切 arg(如果它有效)。如果当前中断总是页面对齐,内核就不需要 PAGE_ALIGN() 了。


当然,内存保护至少具有页面粒度(如果内核选择使用匿名大页面进行此映射,则可能是大页面)。所以you can access memory out to the end of the page containing the break without faulting .这就是为什么内核代码只是检查中断是否移动到不同的页面以跳过映射/取消映射逻辑,但仍然更新实际的中断。

据我所知,没有任何东西会使用中断上方的映射内存作为暂存空间,因此它不像堆栈指针下方的内存那样可以异步破坏。

brk 只是内核中内置的一个简单的内存管理系统。系统调用是昂贵的,所以如果你关心性能,你应该跟踪用户空间中的事情,并且只在你需要一个新页面时才进行系统调用。 直接使用 sys_brk 进行微小的分配对性能来说很糟糕,尤其是在启用了 Meltdown + Spectre 缓解的内核中(使系统调用更加昂贵,例如数万个时钟周期 + TLB 和分支预测失效,而不是数百个时钟周期)。

关于linux - sys_brk 的对齐要求是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49413851/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com