Как виртуальная память ядра отображается в физическую память

Как узнать отображения памяти для пространства ядра? VA → PA

Я знаю файловую систему proc /proc/pid/maps и /proc/pid/mappings, которая дает нам сопоставления приложений пользовательского пространства. Что-нибудь подобное, чтобы найти отображения пространства ядра?

Спасибо!

Ответ 1

Вот частичный ответ, может быть, это поможет.

Linux делит виртуальное адресное пространство ядра на две части - lowmem и vmalloc.

Lowmem использует сопоставление 1-1 между виртуальными и физическими адресами. То есть виртуальный адрес X отображается на физический адрес X-C (где C - некоторая константа, например, 3 ГБ). Это отображение создается во время загрузки и никогда не изменяется.

Vmalloc использует динамическое сопоставление по требованию. При каждом распределении обнаруживается куча физических страниц и диапазон виртуальных адресов, а таблицы подкачки изменяются для создания сопоставления.

Две двое разделены виртуальными адресами. Различные диапазоны виртуальных адресов используются каждым. Диапазон lowmem всегда отображается, диапазон vmalloc отображается при назначении.

Ответ 2

На самом деле, kernelelspace делит на LOW и HIGH память (область vmalloc - часть высокой памяти). Как сказал ugoren, lowmem является прямым отображением, созданным во время загрузки. Высокая память может использоваться, например, для сопоставления некоторых страниц пользовательского пространства с использованием kmap (область pkmap). Вот более подробное изображение, которое вы можете найти в журналах ядра во время загрузки. Пример:

fixmap  : 0xffc57000 - 0xfffff000   (3744 kB)
pkmap   : 0xff800000 - 0xffa00000   (2048 kB)
vmalloc : 0xf7ffe000 - 0xff7fe000   ( 120 MB)
lowmem  : 0xc0000000 - 0xf77fe000   ( 887 MB)
.init : 0xc0906000 - 0xc0973000   ( 436 kB)
.data : 0xc071ae6a - 0xc08feb78   (1935 kB)
.text : 0xc0400000 - 0xc071ae6a   (3179 kB)

В этом примере пространство ядра 1Gb разделилось на 887 с низкой памятью против 120 high mem. Поскольку вы можете видеть 120 МБ высокой памяти, занимаемой областью vmalloc, и только 2 и 3 Kbs зарезервированы для областей pkmap и fixmap. О fixmaps вы можете прочитать здесь http://embeddedma.blogspot.ru/2013/06/linux-fixmap-role.html.