• Оцилиндрованное бревно кедровое

    Оцилиндрованное бревно кедровое

    www.hochy-dom.ru





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


Монтирование типичной файловой системы

Сейчас мы опишем действия, выполняемые ядром при монтировании файловой системы. Мы начнем с рассмотрения файловой системы, монтируемой на каталоге уже смонтированной файловой системы. (При этом новую файловую систему мы будем называть типичной”.)
Для монтирования типичной файловой системы применяется системный вызов mount . Его служебная процедура sys mount воздействует на следующие параметры:
- путь к файлу устройства, содержащему файловую систему, или null, если в этом пути нет необходимости (например, когда монтируется сетевая файловая система);
- путь к каталогу, на котором будет смонтирована файловая система (к точке монтирования);
- тип файловой системы. Это должно быть название зарегистрированной файловой системы;
- флаги монтирования
- указатель на структуру, специфичную для файловой системы (который может иметь значение null).
Функция sys mounto копирует значения параметров во временные буферы ядра, включает глобальную блокировку ядра и вызывает функцию do mount . Когда do mount возвращает управление, служебная процедура снимает глобальную блокировку и освобождает временные буферы ядра.

Функция do mount несет ответственность за собственно монтирование, выполняя следующие операции:

1. Если установлены хотя бы некоторые из флагов ms nosuid, ms nodev или ms noexec, она сбрасывает их и устанавливает соответствующие флаги (mnt_nosuid, mnt_nodev, mnt_noexec) в объекте, представляющем монтируемую файловую систему.
2. Анализирует путь к точке монтирования, вызывая функцию path iookup (), которая сохраняет результат в локальной переменной nd, имеющей тип
nameidata
3. Изучает флаги монтирования, чтобы определить свои дальнейшие действия. В частности:
• если флаг ms remount установлен, это обычно означает намерение изменить флаги монтирования в поле s fiags суперблока и флаги монтируемой файловой системы в поле mnt fiags объекта, представляющего монтируемую файловую систему. Эти изменения выполняет функция
do_remount ;
• в противном случае она проверяет флаг ms bind. Если он установлен, значит, пользователь просит сделать файл или каталог видимым в другой точке системного дерева каталогов;
• в противном случае она проверяет флаг ms move. Если он установлен, значит, пользователь просит изменить точку монтирования уже смонтированной файловой системы. Функция do move mount делает это автоматически;
• в противном случае она вызывает функцию do new mount . Это самый распространенный случай. Он имеет место, когда пользователь хочет
смонтировать либо какую-то специальную файловую систему, либо обычную, хранящуюся в разделе диска. Функция do new mount вызывает функцию do kern mount , передавая ей тип файловой системы, флаги монтирования и имя блочного устройства. Эта функция, отвечающая за операцию монтирования и возвращающая адрес дескриптора новой смонтированной файловой системы, описана в следующем разделе. Затем функция do new mount ВЫЗЫВает функцию do add mount , которая выполняет следующие действия:
получает семафор namespace->sem текущего процесса для записи, поскольку эта функция собирается модифицировать пространство имен;
функция do kern mount могла приостановить процесс, а тем временем другой процесс мог смонтировать файловую систему на нашей точке монтирования или даже изменить нашу корневую файловую систему (current->namespace->root). Поэтому обсуждаемая функция убеждается, что файловая система, смонтированная последней на этой точке монтирования, все еще указывает пространство имен процесса current. Если это не так, функция освобождает семафор чтения/записи и возвращает код ошибки;
если монтируемая файловая система уже смонтирована на точке монтирования, переданной системному вызову в качестве параметра, или если точка монтирования является символьной ссылкой, функция освобождает семафор чтения/записи и возвращает код ошибки;
инициализирует флаги в поле mnt fiags объекта, представляющего монтируемую файловую систему и созданного функцией
do_kern_mount ;
п вызывает функцию graft treeo, чтобы занести объект, представляющий монтируемую файловую систему, в список имен, хеш- таблицу и список потомков родительской файловой системы;
п освобождает семафор чтения/записи namespace->sem и возвращает управление.
4. Вызывает функцию path reiease для завершения анализа пути к точке монтирования и возвращает 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 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 | Следующая страница




Возможно, Вас также заинтересует:

ОС Knoppix - это Linux без проблем

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

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

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

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

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

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

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