File Access and Control - Kapitel 18 des Lions
Transcription
File Access and Control - Kapitel 18 des Lions
File Access and Control Kapitel 18 des Lions-Kommentar Sergej Wildemann Seminar: Aufbau eines historischen UNIX-Systems 13. Januar 2015 Inodes Speicherabbild Strukturen Code • In Unix ist alles eine Datei: Ordner, Festplatten, Eingabegeräte, Pipes, stdin/stdout, etc. • Meist interagiert man in der Shell mit Inodes und nicht mit Dateien 1 / 13 Inodes Speicherabbild Strukturen Code Inodes • ”Index” Node? • Repräsentieren Dateien • Enthalten Metadaten • Verweisen auf den Speicherort des Dateiinhalts • Speichern der aktuellen Prozesszugriffe im ”file” Array 2 / 13 Inodes Speicherabbild Strukturen Code Inode Struktur Direkte Blöcke Inode Infos Indirekte Blöcke Doppelt indirekte Blöcke 1 Block = 512 B 3 / 13 Inodes Speicherabbild Strukturen Code Speicherabbild process 1 0 1 2 3 .. . process 2 0 1 2 .. . .. . .. . count=1, RW .. . count=1, /var/foo .. . count=2, R .. . count=1, /var/bar .. . count=1, W .. . count=2, /var/baz .. . count=1, R inode table file table file descriptor table 4 / 13 Inodes Speicherabbild Strukturen Code Strukturen file 1 2 3 4 5 6 7 8 struct user { ... int u_ofile[NOFILE]; /* pointers to file structures of open files */ ... } u; 1 2 3 4 5 6 7 8 9 struct file { char f_flag; char f_count; int f_inode; char *f_offset[2]; } file[NFILE]; #define NOFILE 15 #define NFILE 100 /* max open files per process */ /* reference count */ /* pointer to inode structure */ /* read/write character pointer */ /* number of in core file structures */ 5 / 13 Inodes Speicherabbild Strukturen Code Strukturen inode 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 struct inode { char i_flag; char i_count; int i_dev; int i_number; /* reference count */ /* device where inode resides */ /* i number, 1-to-1 with device address */ int i_mode; char i_nlink; char i_uid; char i_gid; char i_size0; char *i_size1; int i_addr[8]; int i_lastr; } inode[NINODE]; /* /* /* /* /* /* /* #define NINODE 100 /* number of in core inodes */ directory entries */ owner */ group of owner */ most significant of size */ least sig */ device addresses constituting file */ last logical block read (for read-ahead) */ 6 / 13 Inodes Speicherabbild Strukturen Code Dateien erstellen creat() • Übergibt einen file descriptor an einen Benutzerprozess • Suche eines zum Pfad passenden Inodes • Neuer Inode wird erstellt bzw. vorhandener verwendet • Aufruf von open1() mit Inode • Überprüfen der Zugriffsrechte • Eintrag im file-Array erstellen und file descriptor zurückliefern 7 / 13 Inodes Speicherabbild Strukturen Code Dateien öffnen open() • Suche eines zum Pfad passenden Inodes • Aufruf von open1() mit Inode und gewünschtem Zugriffsmodus (R, W, R|W) 8 / 13 Inodes Speicherabbild Strukturen Code Dateien schließen und löschen close() • Löschen des file descriptors • Schließen des file-Array Eintrags durch Aufruf von closef() • Dekrementieren des Zugriffszählers • Schließen des Inodes über closei() und iput() • iput() löscht Dateiblöcke, wenn Inode nicht mehr verlinkt ist 9 / 13 Inodes Speicherabbild Strukturen Code Dateien lesen und schreiben read() und write() Aufruf von rdwr(mode) mit Lese- oder Schreibmodus • Überprüfen der Zugriffsrechte im file-Array • Setzen von base, offset und count • Aufruf von readi() bzw. writei() 10 / 13 Inodes Speicherabbild Strukturen Code Dateien lesen und schreiben readi() Lesen der einem Inode zugeordneten Datei • Aktualisieren der Zugriffszeit • Umrechnung von LBN zu echtem Geräteblock über bmap() • Einlesen der Daten in Buffer über bread() • Übertragen von Daten im Buffer zum Benutzerbereich mit iomove() 11 / 13 Inodes Speicherabbild Strukturen Code Dateien lesen und schreiben writei() Schreiben von Daten in eine Datei • Aktualisieren der Zugriffs- und Änderungszeit • Umrechnung von LBN zu echtem Geräteblock über bmap() • Übertragen von Daten im Benutzerbereich in Bufferinhalt mit iomove() • Schreiben der Daten in Buffer über b[ad]write() • Falls nötig Erhöhung der eingetragenen Dateigröße 12 / 13 Inodes Speicherabbild Strukturen Code Dateien lesen und schreiben bmap() Mapping von Inode und LBN auf physischen Block • 512 B Dateiblöcke • Max 8 direkte Referenzen auf Blöcke ein einem Inode (4.069 B) • Indirekte und doppelt indirekte Blöcke erweitern referenzierbare Dateigröße auf 7 · 28 + 27 · 28 = 34.560 Blöcke = 17.694.720 B LBN: 15 14 13 12 11 10 9 8 d-indirect indirect | {z } double indirect block index 7 | 6 5 4 3 2 1 0 direct {z } indirect block index 13 / 13