Как виртуальная память ядра отображается в физическую память
Как узнать отображения памяти для пространства ядра? 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.