我知道程序中断是Linux操作系统为进程分配的最高虚拟内存地址,因此标记了堆的最高地址.您可以通过调用sbrk(0)来获取程序中断的地址.
当我创建以下简单程序时,每次运行时都会得到不同的结果:
#define _BSD_SOURCE
#include <stdio.h>
#include <unistd.h>
int main()
{
printf( "system break: %p\n", sbrk( 0 ) );
return 0;
}
Run Code Online (Sandbox Code Playgroud)
例如,在我的电脑上:
$ ./sbrk
system break: 0x81fc000
$ ./sbrk
system break: 0x9bce000
$ ./sbrk
system break: 0x97a6000
Run Code Online (Sandbox Code Playgroud)
我的理解是堆直接分配在虚拟内存中的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;
}
Run Code Online (Sandbox Code Playgroud)
另外,在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
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1900 次 |
最近记录: |