Die konkreten filesystems (ext2, minix, xiafs, ...) werden beim kernel
startup durch die vfs Funktion sys_setup
in
fs/filesystems.c
registriert. Für jedes filesystem wird
init_name_fs
aufgerufen, für ext2 also init_ext2_fs
in
fs/ext2/super.c.
init_name_fs
ruft meist nur
register_filesystem
in fs/super.c
auf mit folgender
Struktur als Parameter:
struct file_system_type { struct super_block *(*read_super) (struct super_block *, void *, int); const char *name; int requires_dev; struct file_system_type * next; };
Der erste Parameter ist ein Zeiger auf die Funktion, um den superblock
zu lesen. Der zweite Paramter ist der Name des filesystems.
requires_dev
gibt an, ob das filesystem auf einem device gemountet
werden muß - ob unter dem filesystem ein device liegen muß. Der
letzte Zeiger zeigt auf die Beschreibung des nächsten filesystems und
wird im Kernel verwendet, um die Liste der filesystems aufzubauen.
Die obige Struktur ist für das ext2 ebenfalls in fs/ext2/super.c
definiert:
static struct file_system_type ext2_fs_type = { ext2_read_super, "ext2", 1, NULL };
D.h. die Funktion, um den superblock von ext2 zu lesen, ist
ext2_read_super
, die auch in fs/ext2/super.c
definiert ist.
Nun kann man ein Beispiel für das switchen des VFS angeben: Ein
User ruft mount -t ext2 /dev/xxxx /mnt
auf. Dabei wird system
call 21 - mount per interrupt aufgerufen. Der interrupt handler ruft
sys_mount
in fs/super.c
auf. In sys_mount
wird
(über do_mount
) read_super
aufgerufen. Diese Funktion
geht nun die registrierten file systems durch, bis der Eintrag für
ext2 gefunden wird. Dann wird die Funktion in dieser Struktur
(ext2_read_super
) aufgerufen, um den superblock zu lesen.