Linux - почему указатель прерывания программы (brk/sbrk) меняется при каждом запуске программы?

Я понимаю, что перерыв программы – это максимальный адрес виртуальной памяти, выделенный операционной системой 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 в виртуальной памяти — я думаю, я ожидал, что она всегда будет иметь одно и то же начальное значение для такой тривиальной программы. Есть ли какая-то рандомизация или что-то еще в том месте, где изначально расположен перерыв в программе? Если нет, то почему каждый раз, когда я запускаю программу, она меняется?


person Chris Vig    schedule 31.03.2015    source источник


Ответы (2)


По умолчанию ядро ​​рандомизирует начальную точку, хотя эту функцию можно отключить. Это код, который запускается (для 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
}
person teppic    schedule 31.03.2015

Да, есть рандомизация. Известна как рандомизация макета адресного пространства (ASLR). http://en.wikipedia.org/wiki/Address_space_layout_randomization

person kaylum    schedule 31.03.2015