Blok identyfikacyjny (z j. ang. superblock) opisuje system plikow. Mozna w nim znalezc informacje o wielkosci systemu plikow, maksymalnej mozliwej liczbie plikow, wolnych miejscach itp. Jadro gdy chce np. zapisac jakis plik na dysk musi wczytac blok identyfikacyjny z dysku do pamieci, aby siegnac do jego danych. Po ewentualnym wprowadzeniu potrzebnych zmian blok identyfikacyjny zostaje zapisany na dysk. Dane z bloku identyfikacyjnego potrzebne sa takze do zamontowania systemu plikow.
W Linuxie 2.0 w plikach naglowkowych (include) sa trzy struktury zwiazane z blokiem identyfikacyjnym: super_block (znajdujaca sie w pliku linux/fs.h), ext2_sb_info (w linux/ext2_fs_sb.h) oraz ext2_super_block (w pliku linux/ext2_fs.h). Wszystkie te struktury w momencie montowania systemu plikow sa tworzone w pamieci operacyjnej, przy czym struktura ext2_super_block jest ladowana z dysku. Do tworzenia struktur w pamieci wykorzystywana jest funkcja ext2_read_super (zaimplementowana w pliku fs/ext2/super.c). Struktura super_block zawiera pola niezalezne od typu systemu plikow, oraz pola zalezne zgromadzone w strukturze u. Jedna ze skladowych tej unii jest stuktura ext2_sb_info. Struktura ta, a takze struktura ext2_super_blok przechowuja dane dotyczace jednego konkretnego systemu plikow, ktorym jest ext2, uzywany przez Linuxa 2.0.
Z kazda grupa blokow jest zwiazana nadmiarowa kopia super bloku. Na poczatku kazdej grupy zapamietana jest struktura ext2_super_block. Dzieki,temu latwiej jest odtworzyc straty, gdy zniszczy sie jedna z kopii super bloku.
Wszystkie bloki identyfikacyjne przechowywane sa w tablicy super_blocks. Nalezy jednak dodac, ze w tej tablicy umieszcza sie dokladnie jeden super bloku kazdego zamontowanego systemu plikow. W tablicy super_blocks przechowuje sie bloki identyfikacyjne struktury super_block. Wielkosc tablicy, a zarazem maksymalna liczbe super blokow zaladowanych do pamieci okresla stala
#define NR_SUPER 64
Najwazniejszymi informacjami w strukturze super_block sa:
struct super_block { kdev_t s_dev; /* nr urzadzenia, na ktorym jest super blok */ unsigned long s_blocksize; /* wielkosc kazdego bloku dyskowego*/ unsigned char s_blocksize_bits; unsigned char s_lock; /* czy zalozona blokada super bloku */ unsigned char s_rd_only; /* czy mozna zmieniac zawartosc sb */ unsigned char s_dirt; /* czy kopia sb w pamieci jest rozna od dyskowej */ struct file_system_type *s_type; /* patrz nizej */ struct super_operations *s_op; /* patrz nizej */ struct dquot_operations *dq_op; /* patrz nizej */ unsigned long s_flags; /* flagi wykorzystywane przy montowaniu systemu plikow */ unsigned long s_magic; /* liczba charakterystyczna dla systemu plikow */ struct inode * s_mounted; /* wskaznik do i-wezla, pod ktory ma byc zamontowany sys. plikow */ struct wait_queue * s_wait;/* wskaznik do kolejki dostepu do super bloku */ ................. union { struct ext2_sb_info ext2_sb; struct msdos_sb_info msdos_sb; ................. } u; };
Pole s_type jest wskaznikiem do struktury file_system_type. Jest ona lista, ktorej pola przechowuja dane o typie systemu plikow. Pola s_op i dq_op sa wskaznikami do struktur super_operations i dquot_operations. Struktury te zawieraja funkcje niezbedne do obslugi systemu plikow. Sa to m. in. funkcje: read_inode (czyta dane z i-wezla), notify_change (zaznacza, gdy zostalo cos zmienione w i-wezle), write_inode, write_super, remount_fs (odmontowuje system plikow), alloc_block, alloc_inode, free_block, free_inode itp.
Informacje znajdujace sie w strukturze ex2_sb_info to m.in.:
struct ext2_sb_info { unsigned long s_inodes_per_block;/* Liczba i-wezlow w kazdym bloku */ unsigned long s_blocks_per_group;/* Liczba blokow w grupie blokow */ unsigned long s_inodes_per_group;/* Liczba i-wezlow w grupie /* unsigned long s_itb_per_group; /* Liczba blokow w ktorych jest tablica i-wezlow*/ unsigned long s_db_per_group; /* Liczba deskryptorow blokow w grupie */ unsigned long s_groups_count; /* Liczba grup w systemie plikow */ struct buffer_head * s_sbh; /* Bufor zawierajacy super blok */ struct ext2_super_block * s_es; /* Wskaxnik do super bloku w buforze s_sbh */ struct buffer_head ** s_group_desc; /* Wskaznik do tablicy deskryptorow grup */ struct buffer_head * s_inode_bitmap[EXT2_MAX_GROUP_LOADED]; /* Wskaznik do naglowka bufora zawierajacego mape bitowa i-wezlow */ struct buffer_head * s_block_bitmap[EXT2_MAX_GROUP_LOADED]; /* Wskaznik do naglowka bufora zawierajacego mape bitowa blokow */ struct wait_queue * s_rename_wait; /* wskaxnik do kolejki procesow czekajacych na super blok */ unsigned long s_mount_opt; /* opcje montowania systemu plikow */ unsigned short s_resuid, s_resgid; /* dane superusera */ int s_inode_size; /* rozmiar struktury i-wezla */ int s_first_ino; /* indeks pierwszego niezastrzezonego i-wezla */ .......... };
Tablica z mapa bitowa blokow jest indeksowana numerem zaladowanej grupy. Maksymalna liczba grup jednoczesnie zaladowanych do pamieci okreslona jest przez stala:
#define EXT2_MAX_GROUP_LOADED 8
Mapa bitowa przechowuje informacje o kazdym bloku. Jesli w miejscu dotyczacym tego bloku jest wartosc 0 to znaczy, ze dany blok jest wolny. W przeciwnym przypadku blok nie jest wolny. Analogiczna jest sytuacja z mapa bitowa i-wezlow.
W buforze s_sbh znajduje sie super blok pierwszej z grup zapisanych na dysku. (Chociaz w kazdej grupie jest kopia tego samego super bloku).
Struktura ext2_super_block przechowuje:
struct ext2_super_block { __u32 s_inodes_count; /* Liczba i-wezlow */ __u32 s_blocks_count; /* Liczba blokow */ __u32 s_r_blocks_count; /* Liczba blokow zastrzezonych */ __u32 s_free_blocks_count; /* Liczba wolnych blokow */ __u32 s_free_inodes_count; /* Liczba wolnych i-wezlow */ __u32 s_first_data_block; /* Numer pierwszego bloku z danymi */ __u32 s_log_block_size; /* Logarytm wielkosci bloku */ __u32 s_blocks_per_group; /* Liczba blokow w grupie */ __u32 s_inodes_per_group; /* Liczba i-wezlow w grupie */ __u32 s_mtime; /* Czas montowania systemu plikow */ __u32 s_wtime; /* Ostatni czas zapisu super bloku */ __u16 s_mnt_count; /* Liczba zamontowanych systemow plikow */ __s16 s_max_mnt_count; /* Maksymalna liczba zamontowan sys. plikow */ __u16 s_errors; /* Flagi mowiace jak ma sie zachowac system po wystapieniu bledow */ __u32 s_lastcheck; /* Czas ostatniego sprawdzania systemu plikow */ __u32 s_checkinterval; /* Maksymalny czas miedzy sprawdzaniami sys. plikow */ __u16 s_def_resuid; /* Domyslne uid superusera */ __u16 s_def_resgid; /* Domyslne gid superusera*/ __u32 s_first_ino; /* Numer pierwszego niezastrzezonego i-wezla */ __u16 s_inode_size; /* Wielkosc struktury i-wezla */ __u16 s_block_group_nr; /* Liczba grup w systemie plikow */ .................... };