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


Создание отображения в память

Чтобы создать новое отображение в память, процесс делает системный вызов mmap , передавая ему следующие параметры:
- дескриптор файла, идентифицирующий файл, который должен быть отображен;
- смещение внутри файла, определяющее первый символ отображаемого фрагмента файла;
- длину отображаемого фрагмента файла;
- набор флагов. Процесс должен явно установить флаг map shared или map private, чтобы уточнить тип запрошенного отображения;
Процесс может также установить флаг map anonymous, помечая новую область памяти как анонимную, т. е., не ассоциированную ни с каким файлом на диске Процесс может также создать область памяти с установленными флагами map shared и map anonymous. В этом случае область будет отображать специальный файл в файловой системе tmpfs который будет доступен всем потомкам процесса.
- набор прав доступа, определяющих один или несколько типов доступа к области памяти: для чтения (prot read), записи (prot write) или выполнения (prot_exec);
- линейный адрес (необязательно), который воспринимается ядром как подсказка, с какого места должна начинаться новая область памяти. Если установлен флаг map fixed, а ядро не может выделить новую область памяти, начинающуюся с заданного линейного адреса, системный вызов завершается неудачей.

Системный вызов mmар возвращает линейный адрес первой ячейки новой области памяти. Из соображений совместимости в архитектуре 80x86 ядро резервирует две точки входа для тшар в таблице системных вызовов: одну с индексом 90, а другую— с индексом 192. Первая соответствует служебной процедуре oid mmap (используемой в старых библиотеках С), а вторая — служебной процедуре sys_mmap2 (используемой в новых библиотеках С). Эти две служебные процедуры различаются только способом передачи параметров системному вызову. Обе вызывают функцию do mmap pgoff о, Сейчас мы дополним это описание, уточнив только шаги, выполняемые при создании области памяти, отображающей файл. Мы опишем случай, в котором параметр file (указатель на файловый объект) функции do mmap pgoff о не равен null. Ради ясности изложения, мы сохраним нумерацию шагов описания функции do mmap pgof f и укажем, какие дополнительные действия совершаются в новой ситуации:
- Шаг 1 — проверяет, определена ли файловая операция тшар для отображаемого файла. Если нет, возвращает код ошибки. Значение null для тшар в таблице означает, что файл не может быть отображен (например, потому что является каталогом).
- Шаг 2 — функция get unmapped area вызывает метод get unmapped area файлового объекта (если метод определен), чтобы выделить интервал линейных адресов, подходящий для отображения файла в память. В дисковых файловых системах этот метод не определен. В таком случае, как было сказано в разд. "Работа с областями памяти" главы 9, функция get unmapped area вызывает метод get unmapped area дескриптора памяти.
- Шаг 3 — в дополнение к обычным проверкам на непротиворечивость функция сравнивает тип запрошенного отображения в память (заданный параметром flags системного вызова mmap ) и флаги, заданные при открытии файла (которые хранятся в поле f iie->f_mode). В частности:
• если затребовано совместно используемое отображение с правами на запись, функция убеждается, что файл был открыт для записи и что он был открыт не в режиме добавления (флаг o append системного вызова
open );
• если затребовано совместно используемое отображение, функция убеждается, что на файл не наложена обязательная блокировка
• при любом типе отображения в память функция убеждается, что файл был открыт для чтения.

Если хотя бы одно из этих условий нарушено, возвращается код ошибки.

Кроме того, при инициализации значения в поле vm_f lags дескриптора новой области памяти функция устанавливает флаги vm read, vm write,
VM_EXEC, VM_SHARED, VM_MAYREAD, VM_MAYWRIТЕ, VM_MAYEXEC И VM_MAYSHARE В COответствии с правами доступа к файлу и типом запрошенного отображения в память В целях оптимизации флаги vm shared и vm maywrite сбрасываются для совместно используемого отображения без права на запись. Это можно сделать, поскольку процессу не разрешено записывать в страницы области памяти,
и, следовательно, такое отображение не отличается от закрытого. Впрочем, ядро разрешает другим процессам обращаться к тому же файлу, чтобы читать страницы из этой области памяти.
- Шаг 10— инициализирует поле vm fiie дескриптора области памяти адресом файлового объекта и увеличивает счетчик обращений файла. Вызывает метод mmap для отображаемого файла, передавая в качестве параметров адрес файлового объекта и адрес дескриптора области памяти. В большинстве файловых систем этот метод реализован функцией generic f iie mmap , которая выполняет следующие действия:
• сохраняет текущее время в поле i atime индексного дескриптора файла и помечает индексный дескриптор как грязный”;
• инициализирует поле vm ops дескриптора области памяти адресом таблицы generic fiie vm ops. Все методы в этой таблице равны NULL, кроме метода nopage, реализованного функцией filemap nopage о, и метода
populate, реализованного функцией filemap popuiate
- Шаг 11 — увеличивает поле i writecount индексного дескриптора файла, т. е. счетчик обращений для пишущих процессов.
Уничтожение отображения в память
Когда процесс готов уничтожить отображение в память, он делает системный вызов munmap . Этот же системный вызов можно использовать для уменьшения размера любой области памяти. Вызов принимает следующие параметры:
- адрес первой ячейки удаляемого интервала линейных адресов;
- длину удаляемого интервала линейных адресов.

Служебная процедура sys munmap этого системного вызова использует функцию do munmap , описанную в разд. "Освобождение интервала линейных адресов" в главе 9. Обратите внимание, что в этом случае нет необходимости принудительно записывать на диск содержимое страниц совместно используемого отображения в память, которое должно быть уничтожено. Эти страницы продолжают действовать как кэш диска, поскольку они по- прежнему входят в состав кэша страниц.

Предыдущая страница | 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...