簡體   English   中英

Linux - 為什么每次運行程序時程序斷點指針(brk / sbrk)都不同?

[英]Linux - why is the program break pointer (brk/sbrk) different each time a program is run?

我知道程序中斷是Linux操作系統為進程分配的最高虛擬內存地址,因此標記了堆的最高地址。 您可以通過調用sbrk(0)來獲取程序中斷的地址。

當我創建以下簡單程序時,每次運行時都會得到不同的結果:

#define _BSD_SOURCE
#include <stdio.h>
#include <unistd.h>

int main()
{
    printf( "system break: %p\n", 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
}

是的,有隨機性。 稱為地址空間布局隨機化(ASLR)。 http://en.wikipedia.org/wiki/Address_space_layout_randomization

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM