Що означає макет пам'яті віртуального ядра у dmesg?


19

Під час проходження "Виведення dmesg" я міг побачити список значень, які я не в змозі правильно зрозуміти.

Memory: 2047804k/2086248k available (3179k kernel code, 37232k reserved, 1935k data, 436k init, 1176944k highmem)
virtual kernel memory layout:
    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)

Зі значень я розумію, що у мене є 2 Гб ОЗУ (фізична пам'ять). Але решта речей, здається, для мене Чарівні числа.

Я хотів би дізнатися про кожну (fixmap, pkmap, .. тощо) коротко (якщо буде більше сумнівів, я опублікую їх як окреме запитання)?

Може хтось мені це пояснить?

Відповіді:


22

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


Дякую за цю чудову відповідь. Мені хотілося б знати, чому низька пам’ять не заповнює 1 Гб і більше про наступну частину речення, "оскільки ядро ​​завжди вимагає щонайменше 128 Мб лінійних адрес для здійснення безперервного розподілу пам'яті та виправлення відображених лінійних адрес".
Сен

Ядро має час від часу отримувати доступ до коду високої пам’яті (інформація про BIOS та ACPI знаходиться на першому МБ оперативної пам’яті), він не може цього робити безпосередньо (як область низької пам’яті), тому йому потрібно зіставити низьку пам’ять на лінійні адреси з високою пам'яттю, 128 МБ зарезервовано лише для цієї мети. Зона vmalloc здебільшого тимчасово відображається на деяких областях з високою пам’яттю і отримує перезавантаження досить швидко.
віг

Тож сторінки, створені ядром для віртуального системного виклику, також є частиною fixmap ??? Я зіткнувся з цим питанням, я хочу знати, що саме лежить на сторінці з адресою fffb5000, fffa1000 і т. Д. ... Я отримую накладні витрати в моїй віртуальній машинній програмі, тому що багато віртуальних процесорів отримують доступ до цієї сторінки багато .... як це зробити Я знаю, що саме на цю адресу ... ВЕЛИКИЙ ВІДПОВІДЬ до речі :)
Глибока думка
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.