【发布时间】:2018-07-29 23:33:32
【问题描述】:
我正在使用 sys_brk 系统调用在堆中动态分配内存。我注意到在获取当前中断位置时,我通常会得到类似于以下的值:
mov rax, 0x0C
mov rdi, 0x00
syscall
结果
rax 0x401000
该值通常以 512 字节对齐。所以想问一下break值有一些对齐要求吗?或者我们可以按照我们想要的方式错位?
【问题讨论】:
-
传统上,对齐要求是1,如中,没有对齐要求。
-
确实!这由程序员来管理。
-
请注意,内存保护只有页面粒度,因此操作系统只能对硬件进行编程以将整个页面映射到您的虚拟地址空间。 IDK 如果有任何东西会在与中断相同的页面中踩到字节,但在您“拥有”的部分之外,但您绝对可以访问它们而不会出错。浪费 CPU 时间进行系统调用以以小于 4k 的页面增量移动中断没有多大意义,除非您真的想要很小的代码大小并且不想跟踪用户空间中的任何内容。跨度>
-
内核代码aligns the break to page size(由 Peter 解释)。
-
x86 的页面大小为 4k。以 x86 为目标时,您无需在运行时查询它。其他一些架构可以为 non-hugepage pagesize 选择不同的大小,但 x86 固定为 4k。
标签: linux assembly heap-memory x86-64 sbrk