tag - Cómo Linux identifica un sistema de archivos particular para ejecutar una llamada al sistema
musicbrainz picard debian (2)
Cada sistema de archivos se registra en VFS. Cuando se monta un sistema de archivos, su superbloque se lee y el superbloque VFS se llena con esta información. La tabla de punteros de función para este sistema de archivos también se llena en este momento. cuando file-> f_op-> read call sucede, la función registrada del sistema de archivos se llama en realidad. Puede consultar el texto en http://www.science.unitn.it/~fiorella/guidelinux/tlk/node102.html
Puede resumir los eventos / pasos que ocurren cuando intento ejecutar una llamada al sistema read () / write (). ¿Cómo sabe el núcleo qué sistema de archivos emitir estos comandos?
Digamos que un proceso llama a write (). Entonces llamará a sys_write ().
Ahora probablemente, ya que sys_write () se ejecuta en nombre del proceso actual, puede acceder a la estructura task_struct y, por lo tanto, puede acceder a la estructura files_struct y struct fs_struct que contiene información del sistema de archivos.
Pero después de eso no estoy viendo, cómo esta fs_struct está ayudando a identificar el sistema de archivos.
Edit: Ahora que Alex ha descrito el flujo ... Todavía tengo dudas de cómo la lectura / escritura se enrutan a un FS, ya que el VFS no lo hace, entonces debe estar ocurriendo en otra parte, también cómo está el bloqueo subyacente Dispositivo y, finalmente, el protocolo de hardware PCI / USB que se adjunta.
Un diagrama de flujo simple que involucre estructuras de datos reales sería útil
Por favor ayuda.
Esta respuesta se basa en la versión 4.0 del kernel. He rastreado parte del código que maneja un syscall de read
. Le recomiendo que clone la fuente de Linux y siga el código fuente.
- Se llama al controlador de Syscall para
read
, enfs/read_write.c:620
. Recibe un descriptor de archivo (entero) como argumento, y llama afdget_pos
para convertirlo en unastruct fd
. -
fdget_pos
llama a__fdget_pos
llama a__fdget
llama a__fget_light
.__fget_light
usacurrent->files
, la tabla de descriptores de archivos para el proceso actual, para buscar elstruct file
que corresponde al número de descriptor de archivos pasado. - De vuelta en el controlador syscall, la estructura del archivo se pasa a
vfs_read
, enfs/read_write.c:478
. -
vfs_read
llama a__vfs_read
, que llama afile->f_op->read
. A partir de aquí, estás en un código específico del sistema de archivos.
Así que el VFS realmente no se molesta en "identificar" el sistema de archivos en el que vive un archivo; simplemente utiliza la tabla de punteros de función de "operación de archivo" que se almacena en su struct file
. Cuando se inicializa ese struct file
, se le da la tabla de puntero de función f_op
correcta que implementa todas las operaciones específicas del sistema de archivos para su sistema de archivos.