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