Во-первых, 32-битная система имеет 0xffffffff
( 4'294'967'295
) линейные адреса для доступа к физическому расположению поверх ОЗУ.
Ядро делит эти адреса на пространство пользователя и ядра.
Пользовательское пространство (большой объем памяти) может быть доступно пользователю и, при необходимости, также ядру.
Диапазон адресов в шестнадцатеричном и десятичном виде:
0x00000000 - 0xbfffffff
0 - 3'221'225'471
Пространство ядра (нехватка памяти) доступно только ядру.
Диапазон адресов в шестнадцатеричном и десятичном виде:
0xc0000000 - 0xffffffff
3'221'225'472 - 4'294'967'295
Как это:
0x00000000 0xc0000000 0xffffffff
| | |
+------------------------+----------+
| User | Kernel |
| space | space |
+------------------------+----------+
Таким образом, расположение памяти, которое вы видели, dmesg
соответствует отображению линейных адресов в пространстве ядра.
Во-первых, последовательности .text, .data и .init, которые обеспечивают инициализацию собственных таблиц страниц ядра (переводят линейные в физические адреса).
.text : 0xc0400000 - 0xc071ae6a (3179 kB)
Диапазон, в котором находится код ядра.
.data : 0xc071ae6a - 0xc08feb78 (1935 kB)
Диапазон, в котором находятся сегменты данных ядра.
.init : 0xc0906000 - 0xc0973000 ( 436 kB)
Диапазон, в котором находятся исходные таблицы страниц ядра.
(и еще 128 кБ для некоторых динамических структур данных.)
Это минимальное адресное пространство достаточно велико, чтобы установить ядро в ОЗУ и инициализировать его основные структуры данных.
Их используемый размер указан в скобках, например, код ядра:
0xc071ae6a - 0xc0400000 = 31AE6A
В десятичной записи это 3'255'914
(3179 кБ).
Во-вторых, использование пространства ядра после инициализации
lowmem : 0xc0000000 - 0xf77fe000 ( 887 MB)
Диапазон низких значений может использоваться ядром для прямого доступа к физическим адресам.
Это не полный 1 ГБ, потому что ядру всегда требуется как минимум 128 МБ линейных адресов для реализации непрерывного распределения памяти и фиксированных линейных адресов.
vmalloc : 0xf7ffe000 - 0xff7fe000 ( 120 MB)
Выделение виртуальной памяти может распределять фреймы страниц на основе несмежной схемы. Основным преимуществом этой схемы является избежание внешней фрагментации, это используется для областей подкачки, модулей ядра или выделения буферов для некоторых устройств ввода-вывода.
pkmap : 0xff800000 - 0xffa00000 (2048 kB)
Постоянное отображение ядра позволяет ядру устанавливать долговременные отображения кадров страниц с большим объемом памяти в адресное пространство ядра. Когда страница HIGHMEM отображается с помощью kmap (), отсюда назначаются виртуальные адреса.
fixmap : 0xffc57000 - 0xfffff000 (3744 kB)
Это линейные адреса с фиксированным сопоставлением, которые могут ссылаться на любой физический адрес в ОЗУ, а не только на последние 1 ГБ, как адреса младших элементов. Линейные адреса с фиксированным отображением немного более эффективны, чем их коллеги из lowmem и pkmap. Существуют выделенные дескрипторы таблицы страниц, назначенные для фиксированного отображения, и отсюда выделены отображения страниц HIGHMEM с использованием kmap_atomic.
Если вы хотите погрузиться глубже в кроличью нору:
Понимание ядра Linux