По-перше, 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