Подтвердить что ты не робот

Как Linux идентифицирует определенную файловую систему для выполнения системного вызова

Можно скомпилировать события/шаги, которые происходят, когда я пытаюсь выполнить системный вызов read()/write(). Как ядро ​​знает, какую файловую систему выдавать эти команды.

Допустим, что процесс вызывает write(). Затем он вызовет sys_write().

Теперь, возможно, поскольку sys_write() выполняется от имени текущего процесса, он может получить доступ к struct task_struct и, следовательно, может получить доступ к struct files_struct и struct fs_struct, который содержит информацию о файловой системе.

Но после этого я не вижу, как этот fs_struct помогает идентифицировать файловую систему.

Изменить: теперь, когда Алекс описал поток... Я все еще сомневаюсь, как чтение/запись направляются в FS, поскольку VFS этого не делает, тогда это должно происходить где-то в другом месте. Также как базовое блочное устройство, а затем, наконец, подключенный аппаратный протокол PCI/USB.

Простая блок-схема, включающая фактические структуры данных, будет полезна

Пожалуйста, помогите.

4b9b3361

Ответ 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