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


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

Первый этап выполняется функциями init_rootfs И init_mount_tree, КО- торые вызываются во время инициализации системы.
Функция init rootfs регистрирует тип специальной файловой системы
rootfs:
struct file_system_type rootfs_fs_type = {
.паше = "rootfs";
.get_sb = rootfs_get_sb:
.kill_sb = kill_litter_super;
}
register_filesystem(rootfs_fs_type);
Функция init mount tree выполняет следующие операции:
1. Вызывает функцию do kern mount , передавая ей строку rootfs в качестве типа файловой системы, и сохраняет адрес дескриптора смонтированной файловой системы, возвращенный этой функцией в локальной переменной mnt. Как было сказано в предыдущем разделе, функция do kern mount , В КОНечНОМ Счете, вызывает метод get_sb файловой системы rootfs, Т. е. функцию rootfs_get_sb I
struct superblock rootfs_get_sb(struct file_system_type fs_type,
int flags, const char dev_name, void Mata){
return get_sb_nodev(fs_type, flags|MS_NOUSER, data,
ramfs_fill_super) ;}
Функция get sb nodev , в свою очередь, выполняет следующие шаги:
• вызывает sget для выделения нового суперблока, передавая в качестве параметра адрес функции set anon super . В результате поле s dev суперблока устанавливается должным образом: старший номер равен нулю, младший номер выбирается отличным от младших номеров других смонтированных специальных файловых систем;
• копирует значение параметра flags в поле s_flags суперблока;
• вызывает ramfs fiii super для выделения объекта индексный дескриптор” и соответствующего объекта элемент каталога” и заполнения полей суперблока. Поскольку rootfs является специальной файловой системой и не имеет дискового суперблока, необходимо реализовать лишь пару операций суперблока;
• возвращает новый суперблок.
2. Выделяет объект namespace для пространства имен процесса 0 и заносит в него дескриптор смонтированной файловой системы, возвращенный функцией do_kern_mount :
namespace = kmalloc(sizeof(namespace), GFP_KERNEL); list_add(&mnt->mnt_list, &namespace->list); namespace->root = mnt;
mnt->mnt_name space = init_task. namespace = namespace;
3. Записывает в поле namespace всех прочих процессов в системе адрес объ- екта-пространства имен, а также инициализирует счетчик обращений namespace->count. (По умолчанию все процессы совместно используют одно исходное пространство имен.)
4. Устанавливает в качестве корневого каталога и текущего каталога процесса 0 корневую файловую систему.
Этап 2. Монтирование реальной корневой файловой системы
Второй этап операции монтирования корневой файловой системы выполняется ядром ближе к концу инициализации системы. Существует несколько способов смонтировать реальную корневую файловую систему в соответствии с опциями, выбранными при компиляции ядра и опциями первоначальной загрузки, переданными загрузчику ядра. Ради краткости мы рассмотрим случай дисковой файловой системы, чье имя устройства было передано ядру через загрузочный параметр "root". Мы будем предполагать, что, кроме файловой системы rootfs, никакая другая первоначальная файловая система не используется.

Функция prepare namespace выполняет следующие операции:
1. Записывает в переменную root device name имя файла устройства, полученное из загрузочного параметра "root" . Кроме того, она записывает в переменную root dev старший и младший номера этого файла устройства.
2. Вызывает функцию mount root , которая, в свою очередь:
• ВЫЗЫВаеТ Служебную Процедуру sys_mknod СИСТеМНОГО ВЫЗОВа mknod () для создания файла устройства /dev/root в первоначальной корневой файловой системе rootfs с теми же старшим и младшим номерами, которые хранятся в переменной root dev;
• выделяет буфер и заносит в него список названий файловых систем. Этот список был либо передан ядру в параметре загрузки "rootfstype", либо построен путем сканирования элементов однонаправленного списка типов файловых систем;
• сканирует список названий файловых систем, построенный на предыдущем шаге. Для каждого названия обсуждаемая функция вызывает функцию sys mount и пытается смонтировать файловую систему соответствующего типа на корневом устройстве. Поскольку в каждом методе, специфичном для файловой системы, используется свое магическое число, все обращения к get sb закончатся неудачно, за исключением того, в котором будет сделана попытка заполнить суперблок с помощью функции файловой системы, реально используемой на корневом устройстве. Файловая система монтируется в каталоге /root файловой системы rootfs;
• вызывает sys chdir("/root") для изменения корневого каталога процесса.
3. Переносит точку монтирования новой файловой системы в корневой каталог файловой системы rootfs:
sys_mount(".", "/", NULL, MS_MOVE, NULL); sys_chroot(".");
Обратите внимание, что специальная файловая система не размонтируется; она всего лишь скрывается под корневой дисковой файловой системой.

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

ВведениеЕсли вы цените свое время, умеете считать деньги и знаете стоимость информации, то эта книга...

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

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

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

Копирование при записи В системах Unix первых поколений создание процесса было реализовано довольно...

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

Буферы блоков и головы буферовУ каждого буфера есть дескриптор голова буфера, имеющий тип buffer...