Linux – 为什么每次运行程序时程序断点指针(brk / sbrk)都不同
发布时间:2020-12-14 01:26:47 所属栏目:Linux 来源:网络整理
导读:据我所知,program break是Linux操作系统为进程分配的最高虚拟内存地址,因此标记了堆的最高地址.您可以通过调用sbrk(0)来获取程序中断的地址. 当我创建以下简单程序时,每次运行时都会得到不同的结果: #define _BSD_SOURCE#include stdio.h#include unistd.hi
据我所知,program break是Linux操作系统为进程分配的最高虚拟内存地址,因此标记了堆的最高地址.您可以通过调用sbrk(0)来获取程序中断的地址.
当我创建以下简单程序时,每次运行时都会得到不同的结果: #define _BSD_SOURCE #include <stdio.h> #include <unistd.h> int main() { printf( "system break: %pn",sbrk( 0 ) ); return 0; } 例如,在我的电脑上: $./sbrk system break: 0x81fc000 $./sbrk system break: 0x9bce000 $./sbrk system break: 0x97a6000 我的理解是堆直接分配在虚拟内存中的BSS部分之上 – 我想我期望它总是具有相同的初始值,就像这样一个简单的程序.是否有一些随机化或程序中断最初定位的东西?如果没有,为什么每次运行程序时它都不同? 解决方法
默认情况下,内核会随机化初始点,但可以禁用此功能.这是运行的代码(对于x86,在arch / x86 / kernel / process.c中):
unsigned long arch_randomize_brk(struct mm_struct *mm) { unsigned long range_end = mm->brk + 0x02000000; return randomize_range(mm->brk,range_end,0) ? : mm->brk; } 另外,在ELF二进制加载器(fs / binfmt_elf.c)的这个函数中,你可以看到名为的函数: if ((current->flags & PF_RANDOMIZE) && (randomize_va_space > 1)) { current->mm->brk = current->mm->start_brk = arch_randomize_brk(current->mm); #ifdef CONFIG_COMPAT_BRK current->brk_randomized = 1; #endif } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |