Як Uniux працює з пам'яттю
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 {struct vm_area_struct *mmap; /* Список відображених областей */
struct vm_area_struct *mmap_avl; /* Ті ж області але вже у виді дерева для більш швидкого пошуку*/
struct vm_area_struct *mmap_cache; /* Остання знайдена область*/
pgd_t * pgd; /*Каталог таблиць*/
atomic_t count;
int map_count; /* Кількість областей*/
struct semaphore mmap_sem;