Sistema de archivos virtual

Niveles de VFS

Entre la implementación del sistema de archivos y el proceso del usuario (o biblioteca C).

 

Clasificación del sistema de archivos

Sistema de archivos basado en disco (ext2 / 3 fat iso9660 ...), sistema de archivos virtual (proc), sistema de archivos de red (nfs)

 

 

Modelo de archivo común

VFS proporciona un modelo estructural que contiene todos los componentes que debería tener un potente sistema de archivos. Todas las implementaciones del sistema de archivos deben proporcionar rutinas que cooperen con la estructura definida por el VFS para compensar la diferencia entre los dos intentos.

 

Descriptor de archivo

Un número entero que se utiliza para identificar un archivo en todas las operaciones relacionadas con archivos en la capa de usuario. Es creado por el kernel cuando se abre el archivo y es específico del proceso.

 

 

inodo

 

l ¿Qué es inodo?

² Inode se utiliza para almacenar los metadatos del archivo (por ejemplo, el creador del archivo, la fecha de creación del archivo, el tamaño del archivo, etc.)

² Tenga en cuenta que el inodo no incluye el nombre del archivo.

 

l contenido de inodo

El inodo contiene la metainformación del archivo, específicamente el siguiente contenido:

² El tamaño del archivo, el ID de usuario y el ID de grupo del propietario del archivo

 

² Permisos de lectura, escritura y ejecución de archivos

² La marca de tiempo del archivo: ctime (la hora en que se cambió por última vez el inodo), mtime (la hora en que se modificó por última vez el contenido del archivo) y atime (la hora en que se abrió por última vez el archivo).

² El número de enlaces, es decir, cuántos nombres de archivos apuntan a este inodo.

² En qué bloques de disco se distribuyen los datos del archivo.

 

l estado del inodo

Cada inodo está en uno de tres estados:

² El inodo está ubicado en la memoria y no está asociado con el archivo; (inode_unused)

² El inodo está ubicado en la memoria, usado por uno o más procesos, y ha sido sincronizado con el disco; (inode_in_used)

² El inodo está en uso activo, no sincronizado con el contenido del disco y el inodo está sucio;

 

l ¿Cómo está organizado el inodo?

² El kernel utiliza dos formas de organizar los inodos.

² Lista vinculada: cada inodo tiene un miembro i_list, y el inodo se puede almacenar en la lista vinculada. (El inodo aparece en la lista i_sb_list específica del superbloque y también aparece en la lista vinculada específica del estado, como inode_in_used)

² Hash: cada inodo aparece en una tabla hash al mismo tiempo (según el número de inodo para acceder rápidamente al inodo).

 

l ¿Qué es el directorio?

² En Linux, los directorios también son archivos, así como partes de datos e inodo. El contenido de la parte de datos es el siguiente:

La primera parte indica el número del inodo correspondiente (único en el sistema), y la segunda parte indica el nombre del archivo o directorio.

¿Cómo accede el kernel a / user / bin / emacs

 

Primero lea el directorio raíz (esto siempre se mantiene en el kernel), busque la entrada del directorio de usuario en la parte de datos del archivo del directorio raíz y obtenga el inodo de acuerdo con el número de inodo que contiene. La búsqueda bin es similar, hasta que encuentre emacs y encuentre el inodo correspondiente a emacs, la parte de datos del inodo es el contenido del archivo emacs (archivo de datos ordinario).

Icono:

 

 

Dentry de caché de elementos de directorio :

 

l Presentar dentry

 

El proceso anterior de acceder a / user / bin / emacs consume mucho tiempo y es necesario leer continuamente el inodo y la parte de datos correspondiente. Para acelerar, el kernel almacena en caché los directorios o archivos a los que se accedió anteriormente (denominados colectivamente entradas de directorio). La próxima vez que acceda a la misma entrada de directorio (por ejemplo, la parte / user / bin / de / user / bin / vi) , puede encontrar directamente el inodo correspondiente (número 10 en la imagen de arriba).

 

l El propósito de dentry:

El propósito principal de dentry es establecer la asociación entre el nombre del archivo y el inodo.

Entonces, la estructura incluye los dos campos más importantes, d_inode y d_name .

Entre ellos, d_name es el nombre del archivo. qstr es la encapsulación de cadenas del kernel (puede entenderse como char * con un valor hash).

d_inode es el inodo correspondiente al nombre del archivo.

 

l estructura dentry:

struct  dentry {

    ...

 

/ * A dónde pertenece el nombre - NULL es negativo * /

    struct  inode * d_inode ; 

 

struct  qstr  d_name ;

 

struct  dentry * d_parent /* directorio de padres */

    union  {

    struct  list_head  d_child / * hijo de la lista de padres * /

    struct  rcu_head  d_rcu ;

    }  d_u ;

    struct  list_head  d_subdirs /* nuestros hijos */

    struct  dentry_operations * d_op ;

    struct  super_block * d_sb / * La raíz del árbol dentry * /

    char sin firmar d_iname [DNAME_INLINE_LEN_MIN]; / * nombres pequeños * /

 

...

};

 

l ¿Cuándo fue creado?

Después de que VFS (y la implementación del sistema de archivos) lee una entrada de directorio (directorio o archivo normal), se crea un dentry para almacenar en caché los datos encontrados.

 

l Cómo organizar y gestionar estos dentry en la memoria

² Estructura: cada instancia dentry forma una red, por ejemplo, todos los archivos y subdirectorios asociados con la instancia dentry actual se agrupan en d_subdirs.

² Método de organización 1: Todas las instancias dentry activas del kernel se almacenan en una tabla hash, que se implementa utilizando dentry_hashtable (tabla hash dentry global).

² Organización 2: Lista enlazada LRU, se eliminará el dentry que no se utilice durante mucho tiempo.

 

 

Enlace

 

l Dos tipos de enlaces: enlaces simbólicos (enlaces blandos) y enlaces duros.

l El archivo de enlace simbólico (enlace suave) usa su propio inodo La parte de datos del inodo contiene una cadena que da la ruta del destino del enlace.

l Cuando se crea el enlace físico, se usa el número de inodo existente. Una vez establecido el vínculo físico, es imposible distinguir entre el archivo original y el archivo de vínculo físico recién creado. En este caso, el inodo usa un contador para asegurar que el inodo pueda ser eliminado cuando ningún otro archivo lo use durante la operación de eliminación del archivo.

Diagrama esquemático:

 

 

 

 

Información específica del proceso

struct  task_struct {

     ...

     / * Información sobre el sistema de archivos del proceso * /

     struct  fs_struct * fs;

     / * Archivos abiertos por este proceso * /

     struct  files_struct * files;

     ...

}

 

struct  files_struct {

     ...

     struct  fdtable fdtab;

      archivo de estructura * fd_array [NR_OPEN_DEFAULT];

};

 

 archivo de estructura {

     ...

 

 ruta de estructura * f_path;

     loff_t f_pos;

     ...

 

};

 

 

struct  file_operations {

     ...

     ssize_t (* escribir) (  archivo de estructura *,  const char  __user *, size_t, loff_t *);

     int  (* readdir) (  archivo de estructura *,  void  *, filldir_t);

     unsigned int  (* encuesta) (  archivo de estructura *,  estructura_tabla_de_  encuesta *);

     int  (* ioctl) ( struct  inode *,  struct  file *,  unsigned intunsigned long );

     int  (* mmap) (  archivo de estructura *,  estructura  vm_area_struct *);

     int  (* open) ( struct  inode *,  struct  file *);

     ...

};

 

La función struct  file_operations-> open esencialmente asocia un objeto de archivo a un inodo.

La función de encuesta también se encuentra entre ellos.

 

 

 

De tarea a dentry / inode

 

Supongo que te gusta

Origin blog.csdn.net/daocaokafei/article/details/114873160
Recomendado
Clasificación