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


Служебная процедура sys_swapon

Служебная процедура sys swapon принимает следующие параметры:
- speciaifiie— этот параметр указывает на путь (в адресном пространстве режима пользователя) к файлу устройства (разделу) или к обычному файлу, который реализует область подкачки;
- swap flags — этот параметр состоит из одного бита swap flag prefer и
31 бита приоритета области подкачки (эти биты имеют смысл, только если
бит SWAP_FLAG_PREFER установлен).

Эта функция проверяет поля объединения swap header, которое было записано в первый слот при создании области подкачки. Функция выполняет следующие действия:
1. Проверяет, есть ли у текущего процесса возможность cap sys admin.
2. Просматривает первые nr swapfiies элементов массива дескрипторов областей swap info в поисках первого дескриптора со сброшенным флагом swp used, показывающим, что соответствующая область подкачки неактивна. Если неактивная область найдена, функция переходит к шагу 4.
3. Индекс новой области подкачки равен nr swapfiies. Функция убеждается, что количество битов, зарезервированных под индекс области подкачки, достаточно для кодирования нового индекса. Если это не так, функция возвращает код ошибки; в противном случае она увеличивает на единицу Значение nr_swapfiles.
4. Определен индекс неиспользуемой области подкачки. Функция инициализирует поля дескриптора. В частности, она записывает в поле flags значение SWP_USED, а В ПОЛЯ lowest_bit И highest_bit — нули.
5. Если параметр swap fiags задает приоритет для новой области подкачки, функция устанавливает поле prio дескриптора. В противном случае, она записывает в поле значение, на единицу меньшее самого низкого приоритета среди активных областей подкачки (исходя из предположения, что
последняя активизированная область подкачки находится на самом медленном блочном устройстве). Если других активных областей подкачки еще нет, функция записывает -1.
6. Копирует строку, на которую указывает параметр speciaifiie, из адресного пространства режима пользователя.
7. Вызывает функцию fiip openo, чтобы открыть файл, заданный параметром speciaifiie
8. Сохраняет адрес файлового объекта, возвращенного функцией fiip open , в поле swap f iie дескриптора области подкачки.
9. Убеждается, что область подкачки еще не активна, для чего просматривает другие активные области подкачки в массиве swap info. Это делается путем проверки адресов объектов address space, хранящихся в полях swap f iie->f_mapping дескрипторов областей подкачки. Если оказывается, что область подкачки уже активна, функция возвращает код ошибки.
10. Если параметр speciaifiie идентифицирует файл блочного устройства, функция выполняет следующие действия:
• вызывает функцию bd ciaimo, чтобы сделать подсистему подкачки держателем блочного устройства (см. разд. "Блочные устройства" главы 14). Если у блочного устройства уже есть держатель, функция возвращает код ошибки;
• сохраняет адрес дескриптора biock device в поле bdev дескриптора области подкачки;
• сохраняет текущий размер блока устройства в поле oid biock size дескриптора области подкачки, а затем устанавливает размер блока устройства в значение 4096 байтов (размер страницы).
11. Если параметр speciaifiie идентифицирует обычный файл, функция выполняет следующие действия:
• проверяет флаг s swapfile в поле i fiags индексного дескриптора файла. Если этот флаг установлен, функция возвращает код ошибки, потому что файл уже используется в качестве области подкачки;
• сохраняет адрес дескриптора блочного устройства, содержащего файл, в поле bdev дескриптора области подкачки.
12. Читает дескриптор swap header, расположенный в слоте 0 области подкачки. С этой целью вызывает функцию read cache page , передавая ей в качестве параметров объект address space, на который указывает поле swap_fiie->f_mapping, индекс страницы 0, адрес файлового метода readpage (хранящийся В ПОЛе swap_file->f_mapping->a_ops->readpage) И
указатель на файловый объект swap f iie. Затем функция ждет, пока страница не будет прочитана в память.
13. Убеждается, что магическая строка в последних 10 байтах первой страницы равна "SWAPSPACE2". Если это не так, возвращает код ошибки.
14. Инициализирует поля lowest bit и highest bit дескриптора области подкачки в соответствии с размером области, хранящимся в поле
info. last_page объединения swap_header.
15. Вызывает функцию vmaiioco, чтобы создать массив счетчиков, ассоциированных с новой областью подкачки, и сохраняет его адрес в поле swap map дескриптора области подкачки. Затем инициализирует элементы массива нулем или значением swap map bad согласно списку дефектных страничных СЛОТОВ, который хранится В поле info.bad_pages объединения swap_header.
16. Вычисляет количество полезных страничных слотов по значениям полей info, last page и info.nr badpages в первом страничном слоте и сохраняет это значение в поле pages дескриптора области подкачки. Кроме того, записывает в поле шах суммарное количество страниц в области подкачки.
17. Строит список интервалов подкачки extent iist для новой области подкачки (только один, если областью подкачки является раздел диска) и соответствующим образом устанавливает поля nr extents и curr swap extent дескриптора области подкачки.
18. Записывает в поле flags дескриптора области подкачки значение
SWP_ACTIVE.
19. Обновляет глобальные переменные nr_good_pages, nr_swap_pages и total_swap_pages.
20. Заносит дескриптор области подкачки в список, на который указывает переменная swap iist.
21. Возвращает 0 (успешное завершение).

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