Реферат на тему:


Воспользуйтесь поиском к примеру Реферат        Грубый поиск Точный поиск






Загрузка...
ea

static struct free_area_struct free_area [NR_MEM_TYPES] [NR_MEM_LISTS];

, где первое поле отвечает за тип области: Ядра, Пользователя, DMA и.т.д. И обрабатываются по очень хитрому алгоритму.

Страницы делятся на свободные непрерывные обрасти размера 2 в степени x умноженной на размер страницы ((2 ^ x) PAGE_SIZE). Области одного размера лежат в одной области массива.

....
| ------
| Свободные Страницы размера PAGE_SIZE 4 --- & gt; список свободных областей
| ------
| Свободные Страницы размера PAGE_SIZE 2 --- & gt; список свободных областей
| ------
| Свободные Страницы размера PAGE_SIZE --- & gt; список свободных областей
| ------

Выделяет страницу функция 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- & gt; 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;
unsigned long context;
unsigned long start_code, end_code, start_data, end_data;
unsigned long start_brk, brk, start_stack;
unsigned long arg_start, arg_end, env_start, env_end;
unsigned long rss, total_vm, locked_vm;
unsigned long def_flags;
unsigned long cpu_vm_mask;
unsigned long swap_cnt; / Number of pages to swap on next passВ противном случае не используется.
/
Struct vm_area_struct vm_next_share;
Struct vm_area_struct vm_pprev_share;

struct vm_operations_struct vm_ops;
Unsigned long vm_offset;
Struct file vm_file;
Unsigned long vm_pte; / Shared mem /
};

struct vm_operations_struct {
Void ( open) (struct vm_area_struct area);
Void ( close) (struct vm_area_struct area);
Void ( unmap) (struct vm_area_struct area, unsigned long, size_t);
Void ( protect) (struct vm_area_struct область, unsigned long, size_t, unsigned int newprot);
Int ( sync) (struct vm_area_struct область, unsigned long, size_t, unsigned int flags);
Void ( советует) (struct vm_area_struct область, unsigned long, size_t, unsigned int advise);
Unsigned long ( nopage) (struct vm_area_struct область, неподписанный длинный адрес, int write_access);
Unsigned long ( wppage) (struct vm_area_struct область, неподписанный длинный адрес,
Unsigned long page);
Int ( swapout) (struct vm_area_struct , struct page );
Pte_t ( swapin) (struct vm_area_struct , unsigned long, unsigned long);
};

Ідея даної структурирования зн чений в ідеїній війній файловои системи, то же всі операції над вігропользовательніми областіями, которые могут быть доступны для определенных типов пам'яни, наприложек при операциях с чистыми операциями и при помощи встроенных пам'ят (через файл / dev / Mem) зовіім інші. Спочать vm_area_struct з'явилася для небезопасного взыскания, а также постукивать по нему на площади.

Що робити, коли потрібно одержат нову область пам'яті. Є цілих 3 способаби. 1. Уже знайомий get_free_page ()
2. kmalloc - Простенька (по можливостям, але и ніяк не коду) процедура з великих обмеженней по видії новихъ областей віх іхньому розмірі.
3. vmalloc - процедура, описанная в описании пам'ят, може виділяти великі обсяги пам'яті.

З кожної з двх процедур у ядрі зв'язані ще за спис ком

Загрузка...