По-перше, 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)
Діапазон lowmem може використовувати ядро для прямого доступу до фізичних адрес.
Це не повний 1 Гб, тому що ядро завжди вимагає щонайменше 128 Мб лінійних адрес для здійснення нерозривного розподілу пам'яті та виправлення відображених лінійних адрес.
vmalloc : 0xf7ffe000 - 0xff7fe000 ( 120 MB)
Виділення віртуальної пам’яті може виділяти кадри сторінок на основі безперервної схеми. Основна перевага цієї схеми полягає в тому, щоб уникнути зовнішньої фрагментації, вона використовується для областей підкачки, модулів ядра або виділення буферів для деяких пристроїв вводу / виводу.
pkmap : 0xff800000 - 0xffa00000 (2048 kB)
Постійне відображення ядра дозволяє ядру встановлювати довговічні відображення кадрів сторінок з високою пам'яттю в адресний простір ядра. Коли сторінка HIGHMEM відображається за допомогою kmap (), тут призначаються віртуальні адреси.
fixmap : 0xffc57000 - 0xfffff000 (3744 kB)
Це лінійні адреси з виправленими картами, які можуть посилатися на будь-яку фізичну адресу в оперативній пам’яті, а не лише на останній 1 Гб, як адреси з низьким розміром. Лінійні адреси з виправленими картами трохи ефективніші, ніж їхні колеги з низьким розміром та pkmap. Існують спеціальні дескриптори таблиці сторінок, призначені для фіксованого відображення, і відображення сторінок HIGHMEM за допомогою kmap_atomic виділяються звідси.
Якщо ви хочете зануритися глибше в кролячу нору:
Розуміння ядра Linux