Управление на паметта в Linux
Вместо да описваща теорията на управлението на паметта в операционните системи, този раздел ще се опита да се определят основните характеристики на неговото изпълнение в Linux. Въпреки, че не е нужно да бъде гуру в Linux виртуална памет за mmap. основен преглед на това как тя работи, е полезно. Това, което следва е доста дълъг описание на структурите от данни, използвани от ядрото за управление на паметта. След получаване на необходимата предварителна знания можем да започнем да работим с тези структури.
Физическа памет е разделена на отделни модули, наречени страници. Значителна част от обработката на вътрешния системната памет се извършва въз основа на страница. Размерът на страница варира от една до друга архитектура, въпреки че повечето системи в момента използват 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 на структура (определено в
неподписан дълго 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 (в някои
По това заключава нашия преглед на структурите на паметта в данните за управление на Linux. Това направи, сега можем да се пристъпи към изпълнение на призива на mmap система.