• Международная доставка грузов в

    За небольшую оплату международная доставка грузов в нашем магазине.

    www.utec.ru





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


Функция tryJtojunmapjoneQ

Функция try to unmap one о вызывается многократно, как из функции
try_to_unmap_anon, так И ИЗ фуНКЦИИ try_to_unmap_f ile . Она Принимает два параметра: указатель раде на дескриптор целевой страницы и указатель vma на дескриптор области памяти. Эта функция выполняет следующие действия:
1. Вычисляет линейный адрес страницы, подлежащей утилизации, по начальному линейному адресу области памяти (vma->vm_start), смещению области памяти в отображенном файле (vma->vm_pgoff) и смещению стра
ницы внутри отображенного файла (page->index). Для анонимных страниц поле vma->vm_pgoff равно либо нулю, либо vm start/PAGE SizE. Соответственно, поле page->index равно либо индексу страницы внутри области памяти, либо линейному адресу страницы, поделенному на page size.
2. Если целевая страница анонимна, функция проверяет, попадает ли ее линейный адрес внутрь области памяти. Если нет, функция завершает работу, возвращая swap again. (Как было сказано при описании обратного отображения для анонимных страниц, список структуры anon vma может включать в себя области памяти, не содержащие целевую страницу.)
3. Извлекает адрес дескриптора памяти из поля vma->vm_mm и получает спин- блокировку vma->vm_mm->page_table_lock, который защищает таблицы страниц.
4. Вызывает друг за другом функции pgd_offset, pud of f set , pmd offseto И pte of f set map , Чтобы ПОЛучИТЬ адрес Записи Таблицы Страниц, соответствующий линейному адресу целевой страницы.
5. Выполняет некоторые проверки, чтобы убедиться, что целевая страница действительно является утилизируемой. Если хотя бы одна из следующих проверок даст отрицательный результат, функция перейдет к шагу 12, чтобы завершить работу и возвратить код ошибки, либо swap again, либо swap_fail:
• проверяет, что запись в Таблице Страниц действительно указывает на целевую страницу. Если это не так, функция возвращает swap again. Это может произойти в следующих случаях:
D запись в Таблице Страниц ссылается на страничный кадр, назначенный с помощью копирования при записи”, но анонимная область памяти, идентифицируемая параметром vma, по-прежнему принадлежит списку anon vma исходного страничного кадра;
D системный вызов mremap может переотобразить области памяти и перенести страницы в адресное пространство режима пользователя, редактируя записи в таблице страниц напрямую. В этом случае объ- ектно-базированное обратное отображение не работает, потому что поле index дескриптора страницы не может быть использовано для определения фактического линейного адреса страницы;
D отображение файла в память является нелинейным
• проверяет, является ли область памяти заблокированной (vm locked) или зарезервированной (vm reserved). Если одно из этих условий удовлетворено, функция возвращает значение swap fail;
• проверяет, сброшен ли бит Accessed в записи Таблицы Страниц. Если нет, функция сбрасывает его и возвращает swap fail. Если бит Accessed установлен, страница считается используемой”, и ее нельзя утилизировать;
• проверяет, принадлежит ли страница кэшу подкачки, и обрабатывается ли она в настоящий момент функцией get user pages В этом случае, чтобы избежать неприятной конкуренции между процессами, функция возвращает SWAP_FAIL.
6. Итак, страницу можно утилизировать. Если бит Dirty в записи Таблицы Страниц установлен, функция устанавливает флаг PG dirty для страницы.
7. Очищает запись Таблицы Страниц и соответствующие TLB-буферы.
8. Если страница является анонимной, функция заносит идентификатор выгружаемой страницы в запись Таблицы Страниц, чтобы при последующих обращениях к этой странице она была загружена обратно
Кроме того, функция уменьшает счетчик анонимных страниц, хранящийся в поле anon rss дескриптора памяти.
9. Уменьшает счетчик страничных кадров, выделенных процессу, хранящийся в поле rss дескриптора памяти.
10. Уменьшает значение поля mapcount дескриптора страницы, потому что ссылка на этот страничный кадр была удалена из записей Таблицы Страниц режима пользователя.
11. Уменьшает счетчик обращений страничного кадра, хранящийся в поле
count дескриптора страницы. Если значение счетчика станет отрицательным, функция удаляет дескриптор страницы из активного или неактивного списка (см. разд. "Списки давно неиспользуемых страниц (LRU)” далее в этой главе) и вызывает функцию f ree hot page , чтобы освободить страничный кадр
12. Вызывает функцию pte unmapO, чтобы освободить временное отображение в адресное пространство ядра, которое могло быть выделено функцией pte_of f set_map на шаге 4
13. Освобождает спин-блокировку vma->vm_irim->page_table_lock, полученную на шаге 3.
14. Возвращает соответствующий код (swap again в случае успеха).

Предыдущая страница | 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. Этот дескриптор содержит всю информацию, необходимую ядру для работы с блоком, так что перед обработкой блока ядро обязательно проверяет голову...