Как Linux идентифицирует определенную файловую систему для выполнения системного вызова
Можно скомпилировать события/шаги, которые происходят, когда я пытаюсь выполнить системный вызов read()/write(). Как ядро знает, какую файловую систему выдавать эти команды.
Допустим, что процесс вызывает write().
Затем он вызовет sys_write().
Теперь, возможно, поскольку sys_write() выполняется от имени текущего процесса, он может получить доступ к struct task_struct и, следовательно, может получить доступ к struct files_struct и struct fs_struct, который содержит информацию о файловой системе.
Но после этого я не вижу, как этот fs_struct помогает идентифицировать файловую систему.
Изменить: теперь, когда Алекс описал поток... Я все еще сомневаюсь, как чтение/запись направляются в FS, поскольку VFS этого не делает, тогда это должно происходить где-то в другом месте. Также как базовое блочное устройство, а затем, наконец, подключенный аппаратный протокол PCI/USB.
Простая блок-схема, включающая фактические структуры данных, будет полезна
Пожалуйста, помогите.
Ответы
Ответ 1
Этот ответ основан на версии ядра 4.0. Я проследил некоторые из кода, который обрабатывает syscall read
. Я рекомендую вам клонировать исходное репо Linux и следовать в исходном коде.
- Вызывается обработчик Syscall для
read
, в fs/read_write.c:620
. Он получает дескриптор файла (целое число) в качестве аргумента и вызывает fdget_pos
, чтобы преобразовать его в struct fd
.
-
fdget_pos
вызывает __fdget_pos
вызывает __fdget
вызовы __fget_light
. __fget_light
использует current->files
, таблицу дескриптора файла для текущего процесса, для поиска struct file
, который соответствует переданному файловому дескриптору.
- Вернувшись в обработчик syscall, структура файла передается в
vfs_read
, в fs/read_write.c:478
.
-
vfs_read
вызывает __vfs_read
, который вызывает file->f_op->read
. Здесь вы находитесь в коде, специфичном для файловой системы.
Таким образом, VFS действительно не беспокоит "идентификацию" файловой системы, в которой находится файл; он просто использует таблицу указателей на функцию "файловая операция", которая хранится в ее struct file
. Когда этот struct file
инициализируется, ему предоставляется правильная таблица указателей функций f_op
, которая реализует все операции с файловой системой для своей файловой системы.
Ответ 2
Каждая файловая система регистрируется в VFS. Когда файловая система смонтирована, ее суперблок считывается, и суперблок VFS заполняется этой информацией. В это время также заполняется таблица указателей функций для этой файловой системы. когда происходит процесс file- > f_op- > , происходит вызов зарегистрированной функции из файловой системы. Вы можете ссылаться на текст в http://www.science.unitn.it/~fiorella/guidelinux/tlk/node102.html