Linux Kernel (Ядро линукса) (часть 3)


Структуры отображения в память

Отображение в память представляется комбинацией следующих структур:
- индексного дескриптора, ассоциированного с отображаемым файлом;
- объекта address space отображаемого файла;
- файлового объекта для каждого отображения, созданного для файла различными процессами;
- дескриптора vm area struct для каждого отдельного отображения файла;
- дескриптора страницы для каждого страничного кадра, присвоенного области памяти, которая отображает файл.
В левой части рисунка мы видим индексный дескриптор, идентифицирующий файл. Поле i mapping каждого индексного дескриптора указывает на объект address_
space файла. Поле page tree каждого объекта address space указывает на базисное дерево страниц, принадлежащих этому адресному пространству, в то время как поле i rnmap указывает на другое дерево, называемое базисным деревом приоритетного поиска областей памяти, которое принадлежит этому адресному пространству. Основное предназначение базисного дерева приоритетного поиска состоит в выполнении "обратного отображения", т. е. в быстром нахождении всех процессов, совместно использующих заданную страницу. Деревья приоритетного поиска подробно описываются в следующей главе, поскольку они применяются для утилизации страничных кадров. Связь между файловыми объектами, относящимися к одному файлу, и индексным дескриптором устанавливается при ПОМОЩИ ПОЛЯ f mapping.

Каждый дескриптор области памяти имеет поле vm fiie, которое связывает его с файловым объектом отображенного файла (если это поле равно null, значит, область памяти не используется в отображении). Позиция начала отображения хранится в поле vm pgoff дескриптора области памяти, представляет собой смещение в файле, измеряемое в единицах, равных длине страницы.

Длина отображенной порции файла — это просто длина области памяти, которая вычисляется ПО значениям полей vm_start И vm end.
Страницы совместно используемых отображений в память всегда находятся в кэше страниц; страницы закрытых отображений находятся в кэше до тех пор, пока не будут изменены. Когда процесс пытается модифицировать страницу закрытого отображения в память, ядро создает копию страничного кадра и заменяет оригинал на дубликат в Таблице Страниц процесса. Это одно из применений механизма копирования при записи”, обсуждаемого в главе 8. Оригинальный страничный кадр остается в кэше страниц, хотя он больше не принадлежит отображению в память, поскольку заменен дубликатом. Зато дубликат не заносится в кэш, поскольку он больше не содержит данные, представляющие файл на диске.

находящихся в кэше и относящихся к файлу, отображенному в память. Обратите внимание, что первая область памяти на рисунке имеет размер три страницы, но для нее выделено только два страничных кадра. Можно предположить, что процесс, владеющий этой областью памяти, никогда не обращался к третьей странице.

Ядро предлагает несколько технических средств для специализации механизма отображения в память для любой файловой системы. Самая важная часть реализации отображения в память делегирована методу файлового объекта, названному mm ар. В большинстве дисковых файловых систем и для файлов блочных устройств этот метод реализуется функцией общего назначения generic file mmap , которая описана в следующем разделе.

Отображение файла в память основано на механизме выделения страниц по требованию, описанного в главе 9. Фактически только что установленное отображение в память является областью памяти, не содержащей ни одной страницы. Когда процесс обращается по адресу внутри этой области, возникает событие ошибка при обращении к странице”. Обработчик этого события проверяет, определен ли метод nopage для этой области памяти. Если метод не определен, значит, область памяти не отображает никакого файла. В противном случае отображение имеет место, и метод несет ответственность за чтение страниц, для чего обращается к блочному устройству. Почти во всех дисковых операционных системах и файлах блочных устройств метод nopage реализован С ПОМОЩЬЮ функции f ilemap nopage .

Предыдущая страница | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 | Следующая страница




Возможно, Вас также заинтересует:

ОС Knoppix - это Linux без про...

ВведениеЕсли вы цените свое время, умеете считать деньги и знаете стоимость информации, то эта книга...

Linux Kernel (Ядро линукса) (ч...

Спин-блокировкаСпин-блокировка необходима в многопроцессорной системе, потому что могут возникнуть...

Linux Kernel (Ядро линукса) (ч...

Копирование при записи В системах Unix первых поколений создание процесса было реализовано довольно...

Linux Kernel (Ядро линукса) (ч...

Буферы блоков и головы буферовУ каждого буфера есть дескриптор голова буфера, имеющий тип buffer...