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 int , unsigned 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