як визначається розмір сторінки у віртуальному адресному просторі?


43

Linux використовує систему віртуальної пам'яті, де всі адреси - це віртуальні адреси, а не фізичні адреси. Ці віртуальні адреси процесор перетворює на фізичні адреси.

Для полегшення цього перекладу віртуальна та фізична пам'ять поділяються на сторінки. Кожній із цих сторінок надається унікальний номер; номер кадру сторінки

Деякі розміри сторінок можуть становити 2 Кб, 4 Кб тощо. Але як визначається номер розміру сторінки? На це впливає розмір архітектури? Наприклад, 32-розрядна шина матиме адресний простір у 4 ГБ.

Відповіді:


56

Дізнатися розмір сторінки за замовчуванням системи можна за допомогою запиту про її конфігурацію за допомогою getconfкоманди:

$ getconf PAGE_SIZE
4096

або

$ getconf PAGESIZE
4096

ПРИМІТКА . Вищезазначені одиниці зазвичай знаходяться в байтах, тому 4096 дорівнює 4096 байт або 4 кБ.

Це провідне джерело в джерелі ядра Linux тут:

Приклад

$ more /usr/src/kernels/3.13.9-100.fc19.x86_64/include/asm-generic/page.h
...
...
/* PAGE_SHIFT determines the page size */

#define PAGE_SHIFT  12
#ifdef __ASSEMBLY__
#define PAGE_SIZE   (1 << PAGE_SHIFT)
#else
#define PAGE_SIZE   (1UL << PAGE_SHIFT)
#endif
#define PAGE_MASK   (~(PAGE_SIZE-1))

Як зміщення дає 4096?

Коли ви зміщуєте біти, ви виконуєте двійкове множення на 2. Отже, фактично зміщення бітів вліво ( 1 << PAGE_SHIFT) робить множення на 2 ^ 12 = 4096.

$ echo "2^12" | bc
4096

2
Сучасне обладнання підтримує розміри сторінок розміром 2 Мб, а також 1 Гб. Чи можна "PAGE_SHIFT" встановити на 21 для сторінок 2 МБ як стандартну форму для складання ядра?
ReverseFlow

2
@ReverseFlow Щоб отримати таку відповідь, я би поставив окреме запитання.
Кирило Булигін

@sim, цікаво, чому тут використовуються бітові маніпуляції? Я читав, що компілятор зазвичай перетворює множення в бітові маніпуляції, отже, даючи ту саму продуктивність.
InAFlash

17

Апаратне забезпечення (конкретно MMU , що входить до процесора) визначає, які розміри сторінок можливі. Немає відношення до розміру регістру процесора і є лише непряме відношення до розміру адресного простору (в тому, що MMU визначає обидва).

Майже всі архітектури підтримують розмір сторінки в 4 КБ. Деякі архітектури підтримують більші сторінки (а деякі також підтримують менші сторінки), але 4 кБ є дуже поширеним за замовчуванням.

Linux підтримує два розміри сторінки:

  • Сторінки звичайного розміру, які, на мою думку, за замовчуванням для всіх архітектур становлять 4 кБ , хоча деякі архітектури дозволяють отримати інші значення, наприклад, 16 кБ на ARM64 або 8 кБ, 16 кБ або 64 кБ на IA64 . Вони відповідають найглибшому рівню дескрипторів MMU (те, що Linux називає PTE ).
  • Величезні сторінки , якщо вони зібрані ( CONFIG_HUGETLB_PAGEнеобхідні, а CONFIG_HUGETLBFSтакож для більшості застосувань). Це відповідає другому заглибленим рівнем дескрипторів MMU (те, що Linux називає PMD) (або, принаймні, зазвичай це робиться, я не знаю, чи це стосується всіх архітектур).

Розмір сторінки - це компроміс між використанням пам'яті, використанням пам'яті та швидкістю.

  • Більший розмір сторінки означає більше витрат, коли сторінка частково використовується, тому система швидше втрачає пам'ять.
  • Більш глибокий рівень дескриптора MMU означає більше пам'яті ядра для таблиць сторінок.
  • Більш глибокий рівень дескриптора MMU означає більше часу, витраченого на обхід таблиці сторінок.

Приріст більших розмірів сторінок невеликий для більшості програм, тоді як вартість значна. Ось чому більшість систем використовують лише сторінки звичайного розміру.

Ви можете запитати (нормальний) розмір сторінки на вашій системі з getconfутилітою або функції C sysconf.

$ getconf PAGE_SIZE
4096

Використання величезних сторінок вимагає монтажу hugetlbfsфайлової системи та mmapпінг-файлів там.


FYI: Використання величезних сторінок не вимагає монтажу hugetlbfs, тому що цей документ ядра відмічає внизу, ви також можете використовувати спільні дзвінки пам'яті або прапор mmap. Крім того, що цікавіше, ви можете ввімкнути прозорі величезні сторінки, тоді ядро ​​автоматично перетворить звичайні сторінки на величезні сторінки, коли це можливо в усіх додатках.
дероберт

Це справді фундаментальна відповідь. Linux призначений для того, щоб добре використовувати апаратне забезпечення підкачки. Детальніше про пейджінга: stackoverflow.com/questions/18431261/how-does-x86-paging-work
Чіро Сантіллі新疆改造中心法轮功六四事件

0

Розмір сторінки в основному залежить від архітектури процесора. На x86, з часів процесора 386, який запровадив захищений режим, розмір сторінки становив 4 кБ.

У режимі x64 також можуть бути величезні сторінки, розміром яких є 2 Мб. Однак використовувати їх трохи складніше.

Додаткову інформацію про розмір сторінки ви можете знайти в статті Вікіпедії


0

Процесор визначає доступні розміри сторінки. Для більшості цілей розмір сторінки, реалізованої обладнанням для процесорів x86 та x86_64, становить 4 кб. Однак операційна система може виділяти більше однієї сторінки одночасно, якщо цього хоче, і тим самим ефективно реалізовувати сторінки в 8 кбіт, 16 кб або 32 кбіт у програмному забезпеченні.

Процесори x86 і x86_64 можуть відповідно змішувати 4mb і 2mb сторінки разом зі стандартними 4kb сторінками. Якщо ця можливість взагалі використовується, вона в основному буде використовуватися для розподілу простору ядра.

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