Розмір пам’яті для роботи ядра mmap


9

Мене цікавить спосіб Linux mmaps файлів в основну пам'ять (в моєму контексті це для виконання, але я думаю, що процес mmap є однаковим для запису та читання) і який розмір він використовує.

Тож я знаю, що Linux використовує підкачку з розміром сторінок 4 КБ (де в ядрі я можу знайти цей розмір?). Але що саме це означає для виділеної пам’яті: Припустимо, у вас є двійковий розмір у кілька розряджених байтів, давайте просто скажемо 5812B, і ви виконаєте його. Що відбувається в ядрі: чи виділяє він 2 * 4 кБ, а потім копіює 5812B в цей простір, витрачаючи> 3 КБ основної пам'яті на 2-й сторінці?

Було б чудово, якби хтось знав файл у джерелі ядра, де визначено розмір сторінки.

Моє друге питання також дуже просте, я думаю: я припустив, що 5812B є як розмір файлів. Чи правильно, що цей розмір просто взято з inode?

Відповіді:


6

Немає прямої залежності між розміром виконуваного файлу та розміром в пам'яті. Ось дуже швидкий огляд того, що відбувається при виконанні двійкового файлу:

  1. Ядро аналізує файл і розбиває його на розділ. Деякі розділи завантажуються безпосередньо в пам'ять, на окремі сторінки. Деякі розділи взагалі не завантажуються (наприклад, символи налагодження).
  2. Якщо виконуваний файл динамічно пов'язаний, ядро ​​викликає динамічний завантажувач, і він завантажує необхідні спільні бібліотеки і виконує випуск посилань у міру необхідності.
  3. Програма починає виконувати свій код, і зазвичай вона вимагатиме більше пам'яті для зберігання даних.

Для отримання додаткової інформації про виконувані формати, зв’язування та завантаження виконуваного файлу, ви можете прочитати Linker and Loaders від Джона Р. Левіна .

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

У Linux можна перевірити відображення пам’яті на виконуваний файл cat /proc/$pid/maps. Формат задокументований на proc(5)сторінці man; див. також Розуміння Linux / proc / id / карт .


0

Так: ви, зрештою, отримаєте дві 4k сторінки. Дані завантажуються на вимогу, тому якщо ніколи нічого не звертається до другої сторінки, вони ніколи не завантажуються в пам'ять.

include/asm-i386/param.h:#define EXEC_PAGESIZE  4096
include/asm-i386/elf.h:#define ELF_EXEC_PAGESIZE        4096

Не змінюйте цих значень і не очікуйте, що щось спрацює.

Так, розмір файлу зберігається в inode в ext2 / 3.


0

Для частини визначення на ядрі 2.6.38 ~ ish архітектури Intel:

arch / x86 / include / asm / page_types.h:

/ * PAGE_SHIFT визначає розмір сторінки * /

#define PAGE_SHIFT 12

#define PAGE_SIZE (_AC (1, UL) << PAGE_SHIFT)

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