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


Нелинейные отображения в память

Ядро Linux 2.6 предлагает еще один способ обращения к обычному файлу — нелинейные отображения в память. В принципе, нелинейное отображение в память — отображение файла в память, описанное ранее, но страницы памяти не соответствуют последовательным страницам файла; каждая страница памяти отображает произвольную страницу данных файла.

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

Чтобы поддержать нелинейное отображение в память, ядро применяет некоторые дополнительные структуры данных. Во-первых, флаг vm nonlinear де
скриптора области памяти показывает, что эта область содержит нелинейное отображение. Все дескрипторы областей памяти с нелинейными отображениями для данного файла собраны в двунаправленном циклическом списке С корнем В ПОЛе i_mmap_nonlinear объекта address_space.

Чтобы создать нелинейное отображение в память, приложение режима пользователя вначале создает нормальное совместно используемое отображение с помощью системного вызова mmapo. Затем приложение переотображает некоторые страницы из области памяти, делая системный вызов
remap_file_pages . Служебная процедура sys_remap_file_pages о системного вызова принимает четыре параметра:
- start — линейный адрес внутри области памяти с совместно используемым отображением, к которому обращается вызывающий процесс;
- size — размер переотображенной порции файла в байтах;
- prot — не используется (должен быть ноль);
- pgof f — индекс первой страницы из файла, которая должна быть переото- бражена;
- flags — флаги, управляющие нелинейным отображением.

Служебная процедура переотображает порцию файла, идентифицируемую параметрами pgoff и size, начиная с линейного адреса start. Если либо область памяти не является совместно используемой, либо она недостаточно велика, чтобы вместить все страницы, запрошенные отображением, системный вызов завершается неудачей и возвращает код ошибки. Короче говоря, служебная процедура заносит область памяти в список i mmap noniinear данного файла и вызывает метод populate области памяти.

Для всех обычных файлов метод populate реализован функцией fiiemap_ populate , которая выполняет следующие действия:
1. Проверяет, сброшен ли флаг map nonblock в параметре flags системного вызова remap fiie pages о. Если сброшен, функция вызывает функцию do page cache readahead , чтобы заранее прочитать страницы файла, которые должны быть переотображены.
2. Для каждой страницы, подлежащей переотображению, выполняет следующие действия:
• проверяет, включен ли дескриптор страницы в кэш страниц. Если еще нет, а флаг map nonblock сброшен, функция читает страницу с диска;
• если дескриптор страницы находится в кэше, функция обновляет запись в Таблице Страниц для соответствующего линейного адреса так, чтобы она указывала на страничный кадр. Кроме того, функция обновляет счетчик страниц в дескрипторе области памяти;
• в противном случае, если дескриптора страницы нет в кэше, функция сохраняет смещение страницы файла в старших 32 битах записи Таблицы Страниц для соответствующего линейного адреса. Кроме того, функция сбрасывает бит Present в записи в Таблице Страниц и устанавливает бит Dirty.
при обработке ошибки обращения к странице функция handieptef auit проверяет биты Present И Dirty В Записи В Таблице Страниц. Если их значения соответствуют нелинейному отображению в память, функция handle_pte_fault ВЫЗЫВает функцию do_file_page, КО- торая извлекает индекс запрошенной страницы файла из старших битов записи в Таблице Страниц. Затем функция do fiie page о вызывает метод populate области памяти, чтобы прочитать страницу с диска и обновить саму запись Таблицы Страниц.

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

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