Где ядро Linux находится в памяти?

[114951]Awk[12182]этот awk-скрипт будет работать над произвольным количеством столбцов > 2, и порядок их появления будет сохранен, как и наоборот, без каких-либо предположений о том, что это за столбцы ([115359]т.е.[115360] не имеет значения, являются ли они числовыми или нет, отсортированы или нет, и т.д.):[12183]Given:[12184]Порядок по столбцам (2). .[115361]n[115362]), затем строкой:[12185]R[12186]Хотя большинство людей не думают о R для обработки текста, в данном случае, на самом деле, это немного проще, хотя все настройки опций делают его более сложным, чем он есть на самом деле. Суть этого решения заключается в том, чтобы просто [115363]rbind()[115364] кратное [115365]cbind()[115366]:[12187]Затем, просто:[12188]
2
10.01.2013, 12:11
2 ответа

Сейчас он находится в полуслучайном месте благодаря aslr (предполагается, что он у вас скомпилирован, и с 64-битной системой нет причин этого не делать, а поскольку сейчас 2016 год, вы должны работать с 64-битной системой.... если у вас мало памяти, просто запустите 64-битное ядро + 32-битное пользовательское пространство)

0
27.01.2020, 23:06

Физическая память

В физической памяти ядро ​​обычно располагается по случайному смещению выше 0x1000000. Это зависит от параметров конфигурации ядра CONFIG_PHYSICAL_START, CONFIG_PHYSICAL_ALIGNи CONFIG_RANDOMIZE_BASEи параметров командной строки ядра kaslr/ nokaslr, как описано в внутренней книге linux -.

Виртуальная память (32 -бит)

В 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 -бит)

В 64-разрядных --битных архитектурах ситуация иная из-за гораздо большего адресного пространства.

Детали зависят от архитектуры -, но по соглашению ядро ​​располагается в диапазоне памяти в верхней части адресного пространства.

x86 -64

На платформе x86 -64 (, также известной как AMD64 ), структура памяти достаточно хорошо задокументирована . Возможны две конфигурации в зависимости от аппаратной поддержки и варианта конфигурации CONFIG_X86_5LEVEL:

.
Старт (4 -пейджинговый уровень)Размер (4 -уровень с.)Старт (Пейджинг 5 -уровня)Размер (5 -уровень с.)Описание
0xFFFF8000000000008 ТиБ 0xFF000000000000004 ПиБ защитное отверстие,также зарезервировано для гипервизора
0xFFFF8800000000000,5 ТиБ 0xFF100000000000000,25 ПиБ Переназначение LDT для PTI
0xFFFF88800000000064 ТиБ 0xFF1100000000000032 ПиБ прямое отображение всей физической памяти
0xFFFFC9000000000032 ТБ 0xFFA000000000000012,5 ПиБ пространство vmalloc/ioremap
0xFFFFEA00000000001 ТБ 0xFFD40000000000000,5 ПиБ карта виртуальной памяти
0xFFFFEC000000000016 ТБ 0xFFDF0000000000008 ПиБ Теневая память КАСАН
идентичная компоновка отсюда и далее
0xFFFFFE00000000000,5 ТБ процессор _запись _отображение области
0xFFFFFF00000000000,5 ТБ %esp стеков исправлений
0xFFFFFFEF0000000064 ГБ Пространство сопоставления регионов EFI
0xFFFFFFFF80000000512 МБ отображение текста ядра , сопоставленное с физическим адресом 0
0xFFFFFFFFA00000001520 МБ пространство отображения модуля
FIXADDR_START~0,5 МБ ядро ​​-внутренний диапазон fixmap, переменный размер и смещение
0xFFFFFFFFFF6000004 КБ устаревший ABI vsyscall

Таким образом, область ядра начинается либо с 0xFFFF800000000000, либо с 0xFF00000000000000, а код ядра обычно располагается (по рандомизированному смещению )в области, начинающейся с 0xFFFFFFFF80000000.

АРМ64

На 64-битной -ARM схема памяти несколько похожа на компоновку на x86 -64 . Точное разделение зависит от конфигурации ядра (Страницы 4kB/64kB, пейджинг уровня 2/3/4 -):

Размер страницы Уровни пейджинга начальный адрес области ядра
4 КБ 3 0xFFFFFF8000000000
4 КБ 4 0xFFFF000000000000
64 КБ 2 0xFFFFFC0000000000
64 КБ 3 0xFFFF000000000000
0
12.05.2021, 23:54

Теги

Похожие вопросы