Сейчас он находится в полуслучайном месте благодаря aslr (предполагается, что он у вас скомпилирован, и с 64-битной системой нет причин этого не делать, а поскольку сейчас 2016 год, вы должны работать с 64-битной системой.... если у вас мало памяти, просто запустите 64-битное ядро + 32-битное пользовательское пространство)
В физической памяти ядро обычно располагается по случайному смещению выше 0x1000000
. Это зависит от параметров конфигурации ядра CONFIG_PHYSICAL_START
, CONFIG_PHYSICAL_ALIGN
и CONFIG_RANDOMIZE_BASE
и параметров командной строки ядра kaslr
/ nokaslr
, как описано в внутренней книге linux -.
В 32-битных -архитектурах разделение виртуального адресного пространства зависит от параметра конфигурации ядра CONFIG_PAGE_OFFSET
, который во многих архитектурах неявно задается параметрами CONFIG_VMSPLIT_*
. Конфигурация вашего ядра обычно помещается вместе с образом ядра в /boot/config-<version>
, поэтому вы можете проверить смещение, где область ядра в виртуальной памяти начинается с grep PAGE_OFFSET "/boot/config-$(uname -r)"
. Обычная конфигурация для x86 — CONFIG_VMSPLIT_3G
, которая устанавливает для PAGE_OFFSET
значение 0xC0000000,резервирование верхнего 1 ГБ адресного пространства для ядра. По соображениям производительности это сопоставление остается одинаковым во всех виртуальных адресных пространствах, включая все процессы пользовательского пространства.
Точный адрес, с которого начинается код ядра, находится где-то в этой области и может быть рандомизирован при загрузке. Это зависит от той же конфигурации и настроек командной строки ядра, что и рандомизация физических адресов.
В 64-разрядных --битных архитектурах ситуация иная из-за гораздо большего адресного пространства.
Детали зависят от архитектуры -, но по соглашению ядро располагается в диапазоне памяти в верхней части адресного пространства.
На платформе x86 -64 (, также известной как AMD64 ), структура памяти достаточно хорошо задокументирована . Возможны две конфигурации в зависимости от аппаратной поддержки и варианта конфигурации CONFIG_X86_5LEVEL
:
Старт (4 -пейджинговый уровень) | Размер (4 -уровень с.) | Старт (Пейджинг 5 -уровня) | Размер (5 -уровень с.) | Описание |
---|---|---|---|---|
0xFFFF800000000000 | 8 ТиБ | 0xFF00000000000000 | 4 ПиБ | защитное отверстие,также зарезервировано для гипервизора |
0xFFFF880000000000 | 0,5 ТиБ | 0xFF10000000000000 | 0,25 ПиБ | Переназначение LDT для PTI |
0xFFFF888000000000 | 64 ТиБ | 0xFF11000000000000 | 32 ПиБ | прямое отображение всей физической памяти |
0xFFFFC90000000000 | 32 ТБ | 0xFFA0000000000000 | 12,5 ПиБ | пространство vmalloc/ioremap |
0xFFFFEA0000000000 | 1 ТБ | 0xFFD4000000000000 | 0,5 ПиБ | карта виртуальной памяти |
0xFFFFEC0000000000 | 16 ТБ | 0xFFDF000000000000 | 8 ПиБ | Теневая память КАСАН |
идентичная компоновка отсюда и далее | ||||
0xFFFFFE0000000000 | 0,5 ТБ | процессор _запись _отображение области | ||
0xFFFFFF0000000000 | 0,5 ТБ | %esp стеков исправлений | ||
0xFFFFFFEF00000000 | 64 ГБ | Пространство сопоставления регионов EFI | ||
0xFFFFFFFF80000000 | 512 МБ | отображение текста ядра , сопоставленное с физическим адресом 0 | ||
0xFFFFFFFFA0000000 | 1520 МБ | пространство отображения модуля | ||
FIXADDR_START | ~0,5 МБ | ядро -внутренний диапазон fixmap, переменный размер и смещение | ||
0xFFFFFFFFFF600000 | 4 КБ | устаревший ABI vsyscall |
Таким образом, область ядра начинается либо с 0xFFFF800000000000
, либо с 0xFF00000000000000
, а код ядра обычно располагается (по рандомизированному смещению )в области, начинающейся с 0xFFFFFFFF80000000
.
На 64-битной -ARM схема памяти несколько похожа на компоновку на x86 -64 . Точное разделение зависит от конфигурации ядра (Страницы 4kB/64kB, пейджинг уровня 2/3/4 -):
Размер страницы | Уровни пейджинга | начальный адрес области ядра |
---|---|---|
4 КБ | 3 | 0xFFFFFF8000000000 |
4 КБ | 4 | 0xFFFF000000000000 |
64 КБ | 2 | 0xFFFFFC0000000000 |
64 КБ | 3 | 0xFFFF000000000000 |