tagger tag picard para musicbrainz mac kid3 for easytag linux linux-kernel vfs

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.

  1. Se llama al controlador de Syscall para read , en fs/read_write.c:620 . Recibe un descriptor de archivo (entero) como argumento, y llama a fdget_pos para convertirlo en una struct fd .
  2. fdget_pos llama a __fdget_pos llama a __fdget llama a __fget_light . __fget_light usa current->files , la tabla de descriptores de archivos para el proceso actual, para buscar el struct file que corresponde al número de descriptor de archivos pasado.
  3. De vuelta en el controlador syscall, la estructura del archivo se pasa a vfs_read , en fs/read_write.c:478 .
  4. vfs_read llama a __vfs_read , que llama a file->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.