Схема отображения памяти x86-64 определена в arch/x86/mm/mmap.c
.Как видите, используются две стратегии: сверху вниз и снизу вверх.
По умолчанию используется распределение сверху вниз.Он начинается на 128 МБ ниже максимального экстента стека (как определено ограничением стека), настраивается случайным смещением, а затем распределяет последующие отображения вниз в памяти оттуда.
Распределение снизу вверх - это запасной вариант,Он используется, если:
- Ограничение стека не ограничено;
- Процесс имеет индивидуальную настройку
ADDR_COMPAT_LAYOUT
;или - sysctl
vm.legacy_va_layout
не равен нулю.
При распределении снизу-вверх сопоставленные области распределяются постепенно по более высоким адресам, начиная с TASK_SIZE / 3
, и настраиваются случайным образом.смещение.TASK_SIZE
на x86-64 равно 0x800000000000
, поэтому распределение снизу вверх начнется примерно с 0x2AAAAAAAAAAA
.
Я бы предложил подходящее отверстие для ваших фиксированных отображений, которое должно быть в порядке при любой стратегии распределения:около 2 * TASK_SIZE / 3
- я бы использовал 0x500000000000
.