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


Запись страницы в область подкачки

Следующее действие, которое надо выполнить для выгрузки, заключается в записи содержимого страницы в область подкачки. Эта операция пересылки данных запускается функцией shrink iist о, которая проверяет, установлен ли флаг PG dirty страничного кадра, а затем вызывает функцию pageout о
Как было сказано в разд. ”Утилизация при дефиците памяти”ранее в этой главе, функция pageout о устанавливает поля дескриптора writeback controi
и вызывает метод writepage объекта address space данной страницы. Метод writepage объекта swapper_state реализован функцией swap_writepage .
Функция swap writepage , со своей стороны, выполняет следующие действия:
1. Убеждается, что хотя бы один процесс режима пользователя ссылается на страницу. Если это не так, функция удаляет страницу из кэша подкачки и возвращает 0. Эта проверка необходима, потому что какой-нибудь процесс может конкурировать с алгоритмом утилизации страничных кадров и освободить страницу после проверки, выполненной функцией shrink iist .
2. Вызывает функцию get swap bio , чтобы выделить и инициализировать дескриптор bio Функция вычисляет адрес дескриптора области подкачки по идентификатору выгружаемой страницы. Затем она обходит списки интервалов подкачки, чтобы определить начальный сектор страничного слота на диске. Дескриптор bio будет содержать запрос на одну страницу данных (страничный слот), а в качестве метода завершения указана функция end swap bio write .
3. Устанавливает флаг PG writeback дескриптора страницы и теги обратной записи в базисном дереве кэша подкачки. Кроме того, сбрасывает флаг PG iocked.
4. Вызывает функцию submit bio , передавая ей команду write и адрес дескриптора bio.
5. Возвращает 0.

По окончании операции ввода/вывода выполняется функция end_swap_ bio_write. Она возобновляет выполнение всех процессов, ожидающих сброса флага PG writeback, сбрасывает флаг PG writeback и соответствующие теги в базисном дереве и освобождает дескриптор bio, использованный в операции ввода/вывода.

Удаление страничного кадра из кэша подкачки

Последний шаг операции выгрузки выполняется все той же функцией shrink iist . Если она убеждается, что никакой процесс не пытался обратиться к страничному кадру во время ввода/вывода данных, она вызывает функцию deiete from swap cache (), чтобы удалить страничный кадр из кэша подкачки. Поскольку кэш подкачки был единственным владельцем страницы, страничный кадр возвращается buddy-системе.

Загрузка выгруженных страниц

Загрузка имеет место, когда процесс пытается обратиться к странице, которая была выгружена на диск. Обработчик исключения ошибка обращения к странице” запускает операцию загрузки при следующих условиях:
- страница, включающая адрес, вызвавший исключение, является корректной, т. е. принадлежит области памяти текущего процесса;
- страница отсутствует в памяти, т. е. флаг Present в записи Таблицы Страниц сброшен;
- запись Таблицы Страниц, ассоциированная с этой страницей, содержит ненулевое значение, но бит Dirty сброшен. Это означает, что запись содержит идентификатор выгруженной страницы Если все перечисленные условия удовлетворены, функция handie_pte_ fault вызывает вполне подходящую функцию do swap page , чтобы загрузить необходимую выгруженную страницу.

Функция do_swap_page

Функция do swap page принимает следующие параметры:
- mm— адрес дескриптора памяти, принадлежащего процессу, вызвавшему исключение "ошибка обращения к странице";
- vma — адрес дескриптора области памяти, которая включает в себя адрес
address;
- address — линейный адрес, из-за обращения к которому возникло исключение;
- page tabie— адрес записи Таблицы Страниц, которая отображает адрес
address;
- pmd— адрес среднего каталога страниц, который отображает адрес
address;
- orig pte— содержимое записи Таблицы Страниц, которая отображает адрес address;
- write access— флаг, показывающий, было ли обращение к странице попыткой прочитать или записать ее.
В отличие от других функций, do swap page () никогда не возвращает 0. Она возвращает 1, если страница уже находится в кэше подкачки (незначительная ошибка); 2, если страница была прочитана из области подкачки (серьезная ошибка); и -1,если во время загрузки выгруженной страницы возникла ошибка.
Функция выполняет следующие действия:
1. Извлекает идентификатор выгруженной страницы из orig pte.
2. Вызывает функцию pte unmap , чтобы освободить любое имеющееся временное отображение ядра для Таблицы Страниц, созданное функцией handie_mm_fauit Как было сказано в главе page_tabie_iock и возвращает код ret: 1 (незначительная ошибка обращения) или 2 (серьезная ошибка).

Предыдущая страница | 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 без проблем

ВведениеЕсли вы цените свое время, умеете считать деньги и знаете стоимость информации, то эта книга для вас. А так как к книге прилагается компакт- диск с готовой к работе операционной системой Knoppix Live CD, то лишь достаточно вставить его в привод и перегрузить компьютер,...

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

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

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

Копирование при записи В системах Unix первых поколений создание процесса было реализовано довольно неуклюже: получив системный вызов fork о, ядро в буквальном смысле дублировало все адресное пространство родителя и присваивало копию процессу-потомку. Такая операция...

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

Буферы блоков и головы буферовУ каждого буфера есть дескриптор голова буфера, имеющий тип buffer head. Этот дескриптор содержит всю информацию, необходимую ядру для работы с блоком, так что перед обработкой блока ядро обязательно проверяет голову...