Marcin Jaskólski
System plików
Funkcje iget, iput, ialloc. System plików proc.

1.Funkcja iget


1.1. Znaczenie


Funkcja iget jest wywoywana przez funkcje obsługujące konkretne systemy plików (np. ext2, FAT). Jej znaczenie jest następujące: proszę o i-węzeł o podanym numerze, z podanego systemu plików (określonego przez superblok).

Funkcja jest zdefiniowana w pliku fs/inode.c

1.2. Algorytm


Mechanizm iget w jądrze 2.2.4 został rozbity na dwie funkcje: iget i iget4.
Funkcja iget4 jest zdefiniowana następująco:

struct inode *iget4(struct super_block *sb, unsigned long ino, find_inode_t find_actor, void *opaque)

Argumenty to:wskażnik do struktury superbloku, numer i-węzła, funkcja szukająca specyficzna dla systemu plików oraz jej argument.

Funkcja iget jest zdefiniowana następująco:

static inline struct inode *iget(struct super_block *sb, unsigned long ino) { return iget4(sb, ino, NULL, NULL); }

Jak widać, stanowi tylko opakowanie dla iget4. Algorytm iget jest zawarty w funkcji iget4.
Działanie funkcji iget4:

1.Oblicz wartość funkcji hashującej na podstawie superbloku i numeru i-węzła.
2.Wywołaj funkcję find_inode. Funkcja find_inode przeszukuje odpowiednią kolejkę mieszającą.
3.Jeśli funkcja find_inode zwróciła szukany i-węzeł x, wywołaj funkcję __iget(x) i zwróć x.
4.Jeśli funkcja find_inode nie zwróciła szukanego i-węzła, wywołaj funkcję get_new_inode. Argumenty - takie same jak dla iget4, dodatkowo przekazywany jest adres początku właściwej kolejki mieszającej.
Zwróć wynik działania tej funkcji.

Funkcja get_new_inode wykonuje 2 kroki: alokuje pamięć na strukturę i-węzła oraz wczytuje go z dysku. Przy wczytywaniu używana jest funkcja specyficzna dla systemu plików.

Funkcja __iget służy do usunięcia i-węzła z listy wolnych i-węzłów, dopisania i-węzła do odpowiedniej kolejki mieszającej (o ile nie był wcześniej używany) oraz zmniejszenia licznika wolnych i-węzłów.

1.3. Kontekst wołania


Funkcja iget jest wywoływana przez wiele funkcji obsługujących konkretne systemy plików. Większość z tych funkcji używa wywołania iget, ale niektóre używają iget4 (np CODA, reiserfs).Funkcja iget4 jest ogólniejszym rozwiązaniem, jednak definicja iget pozwala na zgodność z istniejącymi funkcjami.

1.4. Zmiany w stosunku do jądra 2.2.17


Najważniejszą zmianą jest rozbicie mechanizmu iget na funkcje iget i iget4.

2. Funkcja iput


2.1. Znaczenie


Funkcja iput jest wywoływana, kiedy dany i-węzeł przestaje być potrzebny procesowi.

Funkcja jest zdefiniowana w pliku fs/inode.c

2.2. Algorytm


1.Jeśli jest określona, wywołaj funkcję put_inode właściwą dla systemu plików.
2.Zmniejsz licznik odwołań i-węzła (pole i_count) o 1. Jeśli licznik odwołań nadal ma wartość większą od 0, zakończ pracę.
3.Jeśli licznik sztywnych odwołań do i-węzła ma wartość 0, usuń iwęzeł z dysku używając funkcji odpowiedniej dla systemu plików. Odpowiada to sytuacji, w której nie istnieje zapis katalogowy odpowiadający i-węzłowi.
4.Jeśli licznik sztywnych odwołań ma wartość większą od zera:
-Jeśli i-węzeł nie jest zabrudzony ani zablokowany, usuń go z listy używanych i-węzłów i dopisz go na listę wolnych i-węzłów.
-Zwiększ o 1 licznik wolnych i-węzłów.
5.Zwolnij pamięć używaną przez i-węzeł.

3. Przydział nowego i-węzła na dysku - ialloc



3.1. Znaczenie

Algorytm ialloc służy do przydziału nowego bloku na dysku. Ponieważ dotyczy on i-węzłów na dysku, a nie w pamięci, będzie różny dla każdego systemu plików. Omówię ten algorytm dla systemu plików ext2. Jest on zawarty w funkcji ext2_new_inode.

3.2. Nagłówek funkcji


Nagłowek funkcji ext2_new_inode wygląda następująco:
struct inode * ext2_new_inode (const struct inode * dir, int mode)

Funkcja jest zdefiniowana w pliku fs/ext2/ialloc.c

3.3. Algorytm działania


Istnieją dwie metody przydziału i-węzła: dla katalogów oraz dla innych plików. Jeśli nowy i-węzeł jest katalogiem, wyszukiwana jest grupa z dużą ilością wolnego miejsca oraz niskim stosunkiem liczby katalogów do ogólnej liczny i-węzłów. W tej grupie wyszukiwany jest wolny i-węzeł.
Jeśli to się nie uda, spośród grup o ponadprzeciętnej ilości wolnego miejsca wybierana jest grupa z najmniejszą liczbą katalogów, i w niej wyszukiwany jest wolny i-węzeł.

Dla innych i-węzłów funkcja przeszukuje kolejne bloki, zaczynając od bloku przydzielonemu katalogowi, szukając wolnego i-węzła.

Algorytm przebiega następująco:

Na początku funkcja sprawdza, czy katalog, w którym tworzony jest i-węzeł nie jest usunięty. Jeśli tak, zwracany jest błąd. Następnie alokowana jest pamięć dla nowej struktury i-węzła oraz blokowany jest superblok. Następnie funkcja szuka odpowiedniego i-węzła. Sposób wyszukiwania zależy od tego, czy nowy i-węzeł ma być katalogiem czy nie.
Jeśli i-węzeł ma być katalogiem, funkcja wyszukuje grupę z dużą ilością wolnego miejsca oraz niskim stosunkiem liczby katalogów do ogólnej liczny i-węzłów. W tej grupie wyszukiwany jest wolny i-węzeł.
Jeśli i-węzeł nie ma być katalogiem, próbujemy znaleźć wolny i-węzeł w grupie jego katalogu. Jeżeli to się nie uda, próbujemy znaleźć wolny i-węzeł za pomocą algorytmu quadratic hash. Polega on na sprawdzaniu kolejno grup o numerach o 1, 2, 4, 8... większych od numeru grupy katalogu.
Ostatnią deską ratunku jest liniowe przeszukiwanie wszystkich grup.

W tym momencie funkcja powinna znać grupę, w której będzie przydzielony nowy i-węzeł. Jeśli ta grupa nie jest znaleziona, funkcja kończy pracę z błędem.

Następnie ładujemy bitmapę zajętości i-węzłów i szukamy w niej bitu o wartości 0. Będzie on odpowiadał nowemu i-węzłowi. Zapamiętujemy jego numer i przypisujemy mu wartość 1.

Kolejną rzeczą jest przypisanie odpowiednich wartości polom w strukturze i-węzła. Są to np. pola i_ino (numer i-węzła), numer bloku, itp.

Następnie sprawdzana jest quota - jeśli utworzenie i-węzła spowodowałoby przekroczenie quoty, wszystkie operacje są cofane (wywoływana jest funkcja drop), oraz zwracany jest błąd EDQUOT. Na końcu odblokowywany jest superblok.

4. System plików procfs



System plików proc różni się zasadniczo od innych systemów plikowych, takich jak ext2, FAT czy NTFS. Różnica polega na tym, że system proc jest mechanizmem komunikacji z jądrem, nie reprezentuje fizycznych plików. Żaden z "plików" i "katalogów" systemu proc nie jest zapisany na dysku bądź innym nośniku. System proc może być używany do odczytu parametrów komputera i systemu operacyjnego, jak również do zmiany niektórych parametrów.

Jest to podejście alternatywne do bezpośredniego wywoływania funkcji systemowych. Zaletą takiego podejścia jest całkowita unifikacja dostępu do każdej zawartej w systemie proc informacji. Możliwe jest nawet użycie standardowych narzędzi tekstowych (typu cat, grep, wc, cut, sed, itd) do operowania na systemie proc, np ze skryptu bash.

4.1. Struktury danych wykorzystywane przez system proc


Podstawową strukturą jest proc_dir_entry:

struct proc_dir_entry {
	unsigned short low_ino;
		//numer i-węzła
	unsigned short namelen;
		//długość nazwy pliku
	const char *name;
		//nazwa pliku
	mode_t mode;
		//atrybuty pliku
	nlink_t nlink;
		//liczba plików w katalogu
	uid_t uid;
		//właściciel pliku
	gid_t gid;
		//grupa właściciela pliku
	unsigned long size;
		//długość pliku
	struct inode_operations * proc_iops;
		//wskaźnik do struktury z operacjami na i-węźle (create, link, unlink, ...)
	struct file_operations * proc_fops;
		//wskaźnik do struktury z operacjami plikowymi (read, write, ...)
	get_info_t *get_info;
	struct module *owner;
		// nowość w wersji 2.4. - wskaźnik do struktury opisującej moduł - właściciela
	struct proc_dir_entry *next, *parent, *subdir;
		//za pomocą tych pól tworzone jest drzewo
	void *data;
	read_proc_t *read_proc;
	write_proc_t *write_proc;
	atomic_t count;
		//licznik użyć
	int deleted;
	kdev_t	rdev;
};

4.1. Co udostępnia system proc - podstawowe informacje


4.1.1. Katalogi procesów


Każdemu procesowi odpowiada katalog w systemie proc: /proc/PID/
Zawiera on następujące pliki i katalogi:

cwd - odnośnik do bieżącego katalogu procesu
fd - katalog zawierający deskryptory plików otwartych przez proces
root - katalog główny procesu
cmdline - polecenie uruchamiające proces
environ - zmienne środowiskowe widziane przez program
exe - odnośnik do pliku wykonywalnego procesu
maps - mapy pamięci procesu i wykorzystywanych bibliotek (nowość w 2.4)
mem - pamięć używana przez proces
stat - stan procesu
statm - stan pamięci procesu
status - jak stat i statm, ale w zrozmiałej postaci
cpu - bieżący i ostatni CPU, na którym wykonywał się proces (nowość w 2.4)


4.1.2.Inne informacje udostępniane przez proc


/proc/cmdline - informacja o trybie uruchomienia systemu
/proc/cpuinfo - informacja o procesorze (procesorach)
/proc/devices - lista numerów głównych urządzeń
/proc/dma - zarejestrowane kanały DMA
/proc/filesystems - zarejestrowane systemy plików
/proc/interrupts - lista przerwań
/proc/kcore - pamięć fizyczna systemu
/proc/modules - załadowane moduły
i wiele, wiele innych.

4.2.Nowości w wersji 2.4.


/proc/driver - informacje o sterownikach
/proc/fs - parametry systemów plików
/proc/iomem - mapa pamięci
/proc/irq - przypisanie obsługi przerwań różnym procesorom
/proc/isapnp - informacje o PnP
/proc/sysvipc - informacje nt mechaizmów Systemu V