Управление на паметта в Linux

Вместо да описваща теорията на управлението на паметта в операционните системи, този раздел ще се опита да се определят основните характеристики на неговото изпълнение в Linux. Въпреки, че не е нужно да бъде гуру в Linux виртуална памет за mmap. основен преглед на това как тя работи, е полезно. Това, което следва е доста дълъг описание на структурите от данни, използвани от ядрото за управление на паметта. След получаване на необходимата предварителна знания можем да започнем да работим с тези структури.

Управление на паметта в Linux

Физическа памет е разделена на отделни модули, наречени страници. Значителна част от обработката на вътрешния системната памет се извършва въз основа на страница. Размерът на страница варира от една до друга архитектура, въпреки че повечето системи в момента използват 4096 байт страница. Постоянен PAGE_SIZE (определена в ) Определя размера на страницата за всяка архитектура.

Горната и долната паметта

Терминът "високо памет" може да бъде известно объркване, особено след като тя има различно значение в света на персоналните компютри. Така че, за да бъде ясно, ние определяме тези условия тук:

Ние се отбележи, ограниченията върху използването на високо памет като стигаме до тях в тази глава.

Карта памет страница структура

По този начин, функциите на ядрото, които се занимават с памет, вместо повече използват указатели към структура страница (дефинирани в ). Тази структура на данни се използва за съхраняване на информация за почти всичко, че ядрото трябва да знае за физическа памет; за всяко физическо страница в системата, има една структура страница. Някои от полетата на тази структура да включват следното:

Броят на съществуващите връзки на тази страница. Когато броят пада до 0, страницата се връща към списъка със свободни.

неподписани дълги знамена;

Набор от битови флагове, описващ състоянието на тази страница. Те включват PG_locked. което показва, че страницата е блокирана в паметта, и PG_reserved. което не позволява на системата за управление на паметта обикновено се работи с тази страница.

Ядрото поддържа една или повече редици страница структура записи. които ви позволяват да проследите всички физическа памет на системата. На някои системи, има само един масив, наречен mem_map. На други системи, обаче, положението е по-сложно. Система с неравномерно достъп до паметта (неравномерно достъп до паметта, NUMA) един, а други с високо разделен физическа памет може да има повече от един набор от карти с памет, така че кодът, който е предназначен за преносимост, трябва да се избягва директен достъп до масива, когато е възможно. За щастие, като правило, е много лесно да се работи само с структура на страниците указатели без да се притеснявате от къде идват.

структура на страница * virt_to_page (нищожен * kaddr);

структура на страница * pfn_to_page (инт PFN);

Връща структура страница показалка за дадените номера на кадрите на страници. Ако е необходимо, той проверява номера на страницата рамка за валидност с pfn_valid, преди да премине към него pfn_to_page.

нищожен * page_address (структура на страница * страница);

нищожен * kmap (структура на страница * страница);

нищожен kunmap (структура на страница * страница);

нищожен * kmap_atomic (структура на страница * страница, ENUM km_type тип);

невалидни kunmap_atomic (невалидни * адр, ENUM km_type тип);

kmap_atomic е високо форма на kmap. Всеки архитектура поддържа малък списък на слотовете (назначения специална страница за маса) за атомна kmap-ите; kmap_atomic повикващия трябва да укаже на системата в тип аргумент. някои от тези слотове за използване. Единствените слотовете, които са значими за водача, и са KM_USER0 KM_USER1 (за код работещ директно от поканата от потребителското пространство) и KM_IRQ0 и KM_IRQ1 (за куки). Имайте предвид, че атомната kmap-те трябва да бъдат обработени с атомна; кода си, не мога да спя, докато го държите. Ние също така имайте предвид, че нищо в ядрото не пречи на двете функции на опитите да използват една и съща слота и пречат един на друг (въпреки че за всеки процесор има уникален набор от слотове). На практика конкуренция за слотове атомната kmap, не изглежда да е проблем.

Ще видим възможностите за използване на тези функции, когато се обръщаме към примерен код по-късно в тази глава и в следващите глави.

маса страница

Площта на виртуална памет

• Зона за изпълнима програма код (често наричани текст).

• Една от областите, за всяко активно картографиране памет.

# Cat / PROC / 1 / карти гледат на първоначален

08048000-0804e000 г-XP 03:01 00000000 64652 / sbin / първоначален текст

0804e000-0804f000 RW-р данни 00006000 03:01 64652 / sbin / първоначален

0804f000-08053000 rwxp 00000000 00:00 0 нулева картирани BSS

40000000-40015000 г-XP 00000000 96278 03:01 /lib/ld-2.3.2.so текст

40015000-40016000 RW-р 00014000 03:01 96278 /lib/ld-2.3.2.so данни

40016000-40017000 RW-р 00000000 00:00 0 BSS за ld.so

4212e000-42131000 RW-р 0012e000 03:01 80290 /lib/tls/libc-2.3.2.so данни

42131000-42133000 RW-р 00000000 00:00 0 BSS за библшотеката

bffff000-c0000000 rwxp 00000000 00:00 0 стека сегмент

ffffe000-fffff000 --- р 00000000 0 00:00 vsyscall страница

# Rsh вълк котка / ргос / самостоятелно / карти #### x86-64 (почиства)

00400000-00405000 г-XP 03:01 00000000 1596291 / хамбар / котка текст

00504000-00505000 RW-р 03:01 00004000 1596291 / хамбар / данни котка

00505000-00526000 rwxp 00505000 00:00 0 BSS

3252300000-3252301000 R - р 03:01 1237890 00100000 /lib64/ld-2.3.3.so

7fbfffe000-7fc0000000 RW-р 7fbfffe000 00:00 0 стека

ffffffffff600000-ffffffffffe00000 --- р 00000000 0 00:00 vsyscall

Полетата във всеки ред:

начало-край Перм компенсира специалност: непълнолетен на възела на изображението

Всяко поле в / ргос / * / карти (с изключение на преобразуването по име) съответства на една област, в структура vm_area_struct на:

Малко по-маска с разрешения за памет четат, пишат и изпълняват. В това поле се описва какво се оставя процесът да се направи със страници, които принадлежат към тази област. Последният герой в поле - това е било р за "частен" ( "частен"), или и за "споделена" ( "споделено").

Когато зоната на паметта започва във файла, с които той е свързан. Изместването на 0 означава, че в началото на зоната на паметта съответства на началото на файла.

големи и малки номера на устройства притежават файлът е бил показан. По ирония на съдбата, когато устройството на дисплея, малки и големи числа се отнасят до дисков дял, който съдържа специален файл устройство, което е открит от страна на потребителя, а не на самото устройство.

Номерът на на възела на картографирани файла.

Името на файла (обикновено изпълним файл), която е била картографирана.

структура vm_area_struct

Нека да разгледаме най-важните области в vm_area_struct на структура (определено в ). Тези полета могат да бъдат използвани от драйвери на устройства в тяхното изпълнение mmap. Имайте предвид, че ядрото поддържа списъци и дървета VMA за оптимизиране на търсене и някои полета vm_area_struct използвани в подкрепа на такава организация. Ето защо, VMA не може да бъде създадена по искане на водача, или на структурата нарушени. VMA основни области са както следва (обърнете внимание на сходството между тези области и на терминала / ргос която току-що е виждал.):

неподписан дълго vm_start;

неподписан дълго vm_end;

структура на файл * vm_file;

Указател към структура на файлова структура. свързани с тази област (ако има такива).

неподписан дълго vm_pgoff;

Изместване поле във файла, в страници. Когато покаже файла или устройството тази позиция в първата страница на файла се показва в тази област.

неподписани дълги vm_flags;

Struct vm_operations_struct * vm_ops;

Набор от функции, които ядрото могат да се обаждат, за да работят в тази област от паметта. Присъствието му показва, че складовата площ е "обект" на ядрото, както и структура на файла. ние използваме в тази книга.

Областите, които могат да бъдат използвани от водача да поддържа собствената си информация.

Като структура vm_area_struct. vm_operations_struct е определено в ; че включва операциите, изброени по-долу. Тези операции са необходими само за изискванията за обработка и памет, са изброени в реда, в който са декларирани. На следващо място, в тази глава ще се приложат някои от тези функции.

нищожен (* отворен) (структура vm_area_struct * VMA);

нищожен (* близо) (структура vm_area_struct * VMA);

При изтриване на поле ядрото призовава тази операция близо. Моля, имайте предвид, че не съществува брой употреба, свързана с VMA; зоната се отваря и затваря само веднъж от всеки процес, който я използва.

структура на страница * (* nopage) (структура vm_area_struct * VMA, неподписан дълго адрес, вътр * тип);

Когато един процес се опитва да получи достъп до страница, която се отнася до VMA валидно, но в момента не са в паметта, за съответната област се нарича nopage метод (ако е определен). Методът се връща показалеца на структура страница за физическото страницата, след като може би това се чете от средното за съхранение. Ако тази област nopage метод не е определена, ядрото се откроява празна страница.

Int (* попълвам) (структура vm_area_struct * VM, неподписан дълго адрес, неподписан дълго лен,

pgprot_t Prot, неподписан дълго pgoff, Int nonblock);

Този метод позволява на ядрото да "щети" на страницата в паметта, преди те да са на разположение на потребителското пространство. В действителност, водачът не е необходимо да се приложи методът за да попълвам.

Карта процес памет

Последната част на пъзела е процес на управление на паметта, структурата на карта с памет, която държи всички други структури от данни заедно. Всеки процес в системата (с изключение на няколко помощни потоци в ядрото пространство) има структура mm_struct (в някои ), Която съдържа списък на виртуални страници маси региони памет на процеса и други разни контрол информационни бита ферма дома памет заедно с семафор (mmap_sem) и spinlock (page_table_lock). Указател към тази структура може да се намери в структурата на проблема; В редки случаи, когато се изисква от водача да получите достъп до него, по обичайния начин е да се използва от тока> мм. Имайте предвид, че структурата на управление на паметта може да бъде споделяна между процеси; например, като по този начин действа изпълнение потоци в Linux.

По това заключава нашия преглед на структурите на паметта в данните за управление на Linux. Това направи, сега можем да се пристъпи към изпълнение на призива на mmap система.