Як Uniux працює з пам'яттю
{
return PAGE_OFFSET + PAGE_SIZE * (page - mem_map);
}
Вільні сторінки зберігаються в особливій структурі free_area
static struct free_area_struct free_area[NR_MEM_TYPES][NR_MEM_LISTS];
, де перше поле відповідає за тип області : Ядра, Користувача, DMA і.т.д. И обробляються по дуже хитрому алгоритмі.
Сторінки поділяються на вільні безупинні обростити розміру 2 у ступені x помноженої на розмір сторінки ( (2^x)*PAGE_SIZE ). Області одного розміру лежать в одній області масиву.
....
|------
|Свободные Сторінки розміру PAGE_SIZE*4 ---> список вільних областей
|------
|Свободные Сторінки розміру PAGE_SIZE*2 ---> список вільних областей
|------
|Свободные Сторінки розміру PAGE_SIZE ---> список вільних областей
|------
Виділяє сторінку функція get_free_pages(order). Вона виділяє сторінки складові область розміру PAGE_SIZE*(2^order). Шукається область відповідного чи розміру більше. Якщо є тільки область більшого розміру то вона поділяється на трохи маленьких і береться потрібний шматок. Якщо вільних сторінок недостатньо, то деякі будуть скинуті в область підкачування і процес выделенения почнеться знову.
Повертає сторінку функція free_pages(struct page, order). Вивільняє сторінки починаються з page розміру PAGE_SIZE*(2^order). Область повертається в масив вільних обрастей у відповідну позицію і після цього відбувається спроба об'єднати кілька областей для створення одного більшого розміру.
Відсутність сторінки в пам'яті обрабатыватся ядром особливо. Сторінка чи може взагалі отсутствовать чи знаходитися в області підкачування.
От власне і вся базова робота з реальними сторінками.Самий час згадати, що процес працює все-каки з віртуальними адресами, а не з фізичними. Перетворення відбувається за допомогою вичислений, використовуючи таблиці дескрипторів, і каталоги таблиць. Linux підтримує 3 рівні таблиць: каталог таблиць першого рівня (PGD - Page Table Directory),каталог таблиць другого рівня (PMD - Medium Page Table Diractory), і нарешті таблиця дескрипторів (PTE - Page Table Entry). Реально конкректным процесором можуть підтримуватися не всі рівні, але запас дозволяє підтримувати більше можливих архитектур (Intel має 2 рівні таблиць, а Alpha - цілих 3 ). Перетворення віртуальної адреси у фізичний відбувається відповідно в 3 етапи. Береться покажчик PGD, наявний у структурі кожен процес, що описує, перетвориться в покажчик запису PMD, а останній перетвориться в покажчик у таблиці дескрипторів PTE. І нарешті до реальної адреси, що вказує на початок сторінки додають зсув від її початку.