Як Uniux працює з пам'яттю
Як же ядро працює з найдорожчим що в нього є, з пам'яттю. Перші спроби розібратися з нальоту що і як ні до чого не привели. Не всі так просто як хотілося б. Отовсюду стирчать кінці, начебто всі ясно, але як зв'язати їх воєдино...
Виникла думка звернутися до минулого , щоб принаймні розібратися як усе це розвивалося (версія 0.1). Це допомогло зрозуміти і сучасне ядро. Надалі мова йтиме про ядра серії 2.2 про зміни в 2.4 буде повідомлено особливо.
Не буду поглиблюватися в тонкості функціонування захищеного режиму процесора про це написано цілі фоліанти. Подивимося тільки саму суть.
Отже, в овнове усього лежать сторінки пам'яті. У ядрі вони описуються структурою mem_map_t.
typedef struct page {
/* these must be first (free area handling) */
struct page *next;
struct page *prev;
struct inode *inode;
unsigned long offset;
struct page *next_hash;
atomic_t count;
unsigned long flags; /* atomic flags, some possibly updated asynchronously */
struct wait_queue *wait;
struct page **pprev_hash;
struct buffer_head * buffers;
} mem_map_t;
Вже отут спостерігається наворороченность. Безліч усяких посилань. Усі вони використовуються . Одна сторінка може знаходитися в різних списках , наприклад і всписке сторінок у сторінковому кеше й у списку сторінок стосовних до відображеного в пам'ять файлу (inode).У структурі описывающей останній можна знайти і зворотне посилання,що дуже зручно.
Усі сторінки адресуються глобальним покажчиком mem_map
mem_map_t * mem_map
Адресація сторінок порисходит дуже хитро. Якщо раніш у структурі page було окреме поле указывающее на фізичну адресу (map_nr), то тепер він обчислюється
static inline unsigned long page_address(struct page * page)