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