Головна Головна -> Реферати українською -> Інформатика, комп'ютери, програмування -> Як Uniux працює з пам'яттю

Як Uniux працює з пам'яттю

Назва:
Як Uniux працює з пам'яттю
Тип:
Реферат
Мова:
Українська
Розмiр:
7,94 KB
Завантажень:
14
Оцінка:
 
поточна оцінка 5.0


Скачати цю роботу безкоштовно
Пролистати роботу: 1  2  3 
Як же ядро працює з найдорожчим що в нього є, з пам'яттю. Перші спроби розібратися з нальоту що і як ні до чого не привели. Не всі так просто як хотілося б. Отовсюду стирчать кінці, начебто всі ясно, але як зв'язати їх воєдино...

Виникла думка звернутися до минулого , щоб принаймні розібратися як усе це розвивалося (версія 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)

{

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. І нарешті до реальної адреси, що вказує на початок сторінки додають зсув від її початку.

page_dir = pgd_offset(vma->vm_mm, address);

if (pgd_none(*page_dir))

return;

if (pgd_bad(*page_dir)) {

printk("bad page table directory entry %p:[%lx]\n", page_dir, pgd_val(*page_dir));

pgd_clear(page_dir);

return;

}

page_middle = pmd_offset(page_dir, address);

if (pmd_none(*page_middle))

return;

if (pmd_bad(*page_middle)) {

printk("bad page table directory entry %p:[%lx]\n", page_dir, pgd_val(*page_dir));

pmd_clear(page_middle);

return;

}

page_table = pte_offset(page_middle, address);

Узагалі ж усі дані про використовуваний процесом пам'яті містяться в структурі mm_struct

struct mm_struct {

Завантажити цю роботу безкоштовно
Пролистати роботу: 1  2  3 



Реферат на тему: Як Uniux працює з пам'яттю

BR.com.ua © 1999-2017 | Реклама на сайті | Умови використання | Зворотній зв'язок