Що таке висока пам'ять і низька пам'ять в Linux?


92

Мене цікавить різниця між Highmem і Lowmem:

  1. Чому існує така диференціація?
  2. Що ми отримуємо, роблячи це?
  3. Які особливості має кожен?

@hiro, ви маєте на увазі "HIGHMEM" - це "віртуальна адреса ядра", як описано ldd3. Я погоджуюсь з тобою. це заплутано, ldd3 визначає "LOWMEM" "HIGHMEM", також визначає "віртуальну адресу ядра" "логічну адресу ядра". вони одне і те ж, але мають різну назву. це "краса" програмного забезпечення, це залежить від мови опису.
steve

Відповіді:


69

У 32-розрядної архітектурі діапазон адресного простору для адреси RAM становить:

0x00000000 - 0xffffffff

або 4'294'967'295(4 ГБ).

Ядро Linux розбиває на 3/1 (може також 2/2 або 1/3 1 ) на простір користувачів (висока пам'ять) та простір ядра (низька пам'ять) відповідно.

Діапазон простору користувача:

0x00000000 - 0xbfffffff

Кожен щойно створений користувальницький процес отримує адресу (діапазон) всередині цієї області. Користувацькі процеси, як правило, не довіряють, а тому заборонено отримувати доступ до простору ядра. Далі, вони вважаються невідкладними, як правило, ядро ​​намагається відкласти розподіл пам'яті на ці процеси.

Діапазон простору ядра:

0xc0000000 - 0xffffffff

Ядро обробляє тут свою адресу (діапазон). Ядро може безпосередньо отримувати доступ до цих 1 ГБ адрес (ну, не повних 1 Гб, є 128 Мб, зарезервоване для доступу до високої пам'яті).

Процеси, породжені в просторі ядра, є надійними, терміновими та передбачають відсутність помилок, запит на пам'ять обробляється миттєво.

Кожен процес ядра також може отримати доступ до діапазону простору користувача, якщо цього бажає. І щоб досягти цього, ядро ​​відображає адресу з простору користувача (висока пам'ять) до свого простору ядра (низька пам'ять), згадані вище 128 Мб спеціально зарезервовані для цього.


1 Чи розділення дорівнює 3/1, 2/2 або 1/3, керується CONFIG_VMSPLIT_...опцією; ви, ймовірно, можете перевірити, /boot/config*щоб побачити, який варіант був обраний для вашого ядра.


Це стара, і я не впевнений, що ти тут. Але я хочу запитати одне: зарезервований 128 МБ у просторі ядра (для доступу до високої пам'яті), чи це всі посилання на область пам'яті простору користувача? Отже, процес ядра може отримати доступ до будь-якого простору користувача, звернувшись до цієї області, правда?
Amumu

1
Чому це завжди в 1/4? Тобто, чому він не міг розділити його на 5/1 чи щось таке?
mgalgs

Що саме тут означає "прямий доступ"? Я маю на увазі, чи не доступ до самого ядра через механізм віртуальної пам'яті?
telenn

1
Я вважаю, що те, що ви говорите про високу / низьку пам'ять, є неправильним: я вважаю, що в чистій 32-бітовій системі ядро ​​може отримати доступ до повних 3 Гб простору користувача (ядро може отримати доступ до простору ядра та простору користувача). Однак, коли у вас є ядро ​​PAE, все складніше, тепер у вас більше 3 Гб оперативної пам’яті, кожен процес може бути 3 Гб, і ви не можете отримати доступ до всього простору користувача безпосередньо. Тут надходить висока пам’ять і 128 Мб пам’яті в просторі ядра. З 64-бітовим ядром воно знову стає простішим, без великих чоловіків, так як весь ядро ​​користувача доступне з ядра.
ctrl-alt-delor

2
@mgalgs ¼, 2/4 та ¾ було лише набором вибору за замовчуванням. З 2007 року можна також вибрати 5/16-ту та 15/32-ту. Якщо ви знаєте редагувати рядок #define, ви можете вибрати майже довільний розкол власного.
jørgensen

28

Перша посилання, на яку слід звернутися, - це драйвери пристроїв Linux (доступні як в Інтернеті, так і в книжковій формі), особливо глава 15, в якій є розділ на цю тему.

В ідеальному світі кожен системний компонент міг би зіставити всю пам'ять, до якої він коли-небудь потребує доступу. Це стосується процесів в Linux та більшості операційних систем: 32-бітний процес може отримати доступ лише трохи менше 2 ^ 32 байтів віртуальної пам’яті (насправді близько 3 ГБ у типовій 32-розрядної архітектурі Linux). Ядро стає важким, якому потрібно мати можливість відобразити повну пам'ять процесу, системний виклик якого він виконує, плюс всю фізичну пам'ять, а також будь-який інший апарат, нанесений на карту пам'яті.

Отже, коли 32-бітовому ядру потрібно зіставити більше 4 ГБ пам’яті, воно повинно бути складено з високою підтримкою пам’яті. Висока пам'ять - це пам'ять, яка не відображається постійно в адресному просторі ядра. (Низька пам'ять - це навпаки: вона завжди відображається на карті, тому ви можете отримати доступ до неї в ядрі, просто відстеживши покажчик.)

Коли ви отримуєте доступ до високої пам’яті з коду ядра, вам потрібно зателефонувати kmapспочатку, щоб отримати вказівник зі структури даних сторінки ( struct page). Виклик kmapпрацює, незалежно від того, стоїть вона у великій або низькій пам'яті. Також є kmap_atomicдодаткові обмеження, але він є більш ефективним для багатопроцесорних машин, оскільки він використовує більш дрібнозернисту блокування. Отриманий вказівник kmap- це ресурс: він використовує адресний простір. Після завершення роботи ви повинні зателефонувати kunmap(або kunmap_atomic), щоб звільнити цей ресурс; тоді вказівник більше не дійсний, і до вмісту сторінки не можна отримати доступ, поки ви kmapзнову не зателефонуєте .


2
Дякую Жиллу за відповідь .. Але я ще не в змозі отримати всю концепцію. Чи можете ви бути трохи простішими, не зменшуючи інформацію в ньому?
Сен

17

Це стосується ядра Linux; Я не впевнений, як будь-яке ядро ​​Unix обробляє це.

Висока пам'ять - це сегмент пам'яті, до якого можуть бути адресовані користувацькі простори. Він не може торкнутися низької пам'яті.

Низька пам'ять - це сегмент пам'яті, до якого ядро ​​Linux може безпосередньо звертатися. Якщо ядро ​​повинно отримати доступ до високої пам'яті, воно має спершу відобразити його у власному адресному просторі.

Нещодавно було введено виправлення, яке дозволяє контролювати, де знаходиться сегмент. Компроміс полягає в тому, що ви можете забирати адресну пам'ять далеко від користувальницького простору, щоб ядро ​​могло мати більше пам’яті, яку йому не потрібно проводити картування перед використанням.

Додаткові ресурси:


4

HIGHMEM - це діапазон пам’яті ядра, але це НЕ пам'ять, до якої ви отримуєте доступ, але це місце, де ви ставите те, до чого хочете отримати доступ.

Типова карта 32-бітної віртуальної пам'яті Linux виглядає так:

  • 0x00000000-0xbfffffff: користувацький процес (3 Гб)

  • 0xc0000000-0xffffffff: простір ядра (1 Гб)

(Вектор, що стосується процесора, і все, що тут ігнорується).

Linux розділяє простір ядра 1 ГБ на 2 частини, LOWMEM та HIGHMEM. Розділення змінюються від установки до установки.

Якщо установка вибирає, скажімо, 512 МБ-512 МБ для пам'яті НИЗКОГО та ВИСОКОГО, 512 МБ LOWMEM (0xc0000000-0xdfffffff) статично відображається на час завантаження ядра; зазвичай для цього використовується перше стільки байтів фізичної пам'яті, щоб віртуальні та фізичні адреси в цьому діапазоні мали постійне зміщення, скажімо, 0xc0000000.

З іншого боку, останній 512 Мб (HIGHMEM) не має статичного відображення (хоча ви можете залишити сторінки напівзміненими, відображеними там, але це потрібно зробити явно у вашому коді драйвера). Натомість сторінки тут тимчасово відображаються та не мапуються, щоб віртуальні та фізичні адреси в цьому діапазоні не мали послідовного відображення. Типове використання HIGHMEM включає одноразові буфери даних.


3

Наскільки я пам’ятаю, «Висока пам’ять» використовується для простору додатків, а «Якість пам'яті» для ядра.

Перевагою є те, що (користувацький простір) програми не можуть отримати доступ до пам’яті простору ядра.


0

Багато людей сказали, що низька пам'ять призначена для операційної системи. Зазвичай це правда, але цього не повинно бути. Висока пам'ять і низька пам'ять - це лише дві частини простору пам’яті, але в системі Linux низька пам’ять призначена лише для ядра, а велика пам’ять - для процесів користувача.

Відповідно до "Книги динозаврів (концепції операційної системи)", ми можемо розмістити операційну систему як в низькій пам'яті, так і у високій пам'яті. Основним фактором, що впливає на це рішення, є розташування вектора переривання. Оскільки вектор переривання часто знаходиться в недостатній кількості пам'яті, програмісти зазвичай також розміщують операційну систему в низькій пам'яті.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.