Log in


Forgot your password?
prijatelji LUGoNSa
gnu.gif
linuxzasve.jpg
hulk.jpg
zextras_logo.png
 
You are here: Home / Uputstva / Teorija / Linux boot proces

Linux boot proces

by Bojan Delić last modified Apr 15, 2008 10:48 PM
Možda izgleda jednostavno, ali u pozadini se odvija mnogo stvari!

Ovde ću pokušati da objasnim šta se dešava od trenutnka kada pritisnete dugme za paljenje na vašem računaru do trenutnka kada se pokrene prvi program.

Ograničiću se na x86 arhitekturu, ali mnogi delovi podizanja sistema su identični za mnoge druge arhitekture.

Paljenje računara

U trenutku kada upalite računar prve instrukcije koje se izvršavaju predstavljaju BIOS (Basic Input/Output System) koji se nalazi na adresi 0xFFFF0. BIOS se sastoji iz dva dela. Prvi deo, POST (power-on self test) ima zadatak da proveri sav hardware. Drugi deo BIOS-a (izvorni servisi - runtime services) treba da napravi spisak svih lokalnih uređaja i uradi njihovu inicijalizaciju. Nakon što obavi svoj deo posle, POST se briše iz memorije, a servisi ostaju da bi pružili usluge operativnom sistemu.

Da bi boot-ovao operativni sistem, BIOS traži uređaje koji su aktivni i bootabilni (kako otkriva bootabilne uređaje biće objašnjeno u sledećoj sekciji). U te uređaje spadaju diskete, CD-ROM, HDD, uređaj na mreži, Flash disk...

Uobičajeno je da se Linux boot-uje sa HDD-a, gde MBR (Master Boot Record) sadrži primarni boot loader. MBR je oblast od 512 bajtova koji se fizički nalazi u prvom sektoru diska. Nakon što je MBR učitan u RAM, BIOS mu prepušta kontrolu.

Boot loader - faza jedan

Primarni boot loader iz MBR-a veličine 512 bajta sadrži i kod i tabelu particija. Prvih 446 bajtova predstavlja primarni boot loader koji sadrži izvorni kod i tekst poruka o greškama. Sledeća 64 bajta su tablela particija koja sadrži podatke o svakoj od 4 primarne particije (po 16 bajta za svaku). MBR završava sa 2 bajta koja predstavljaju magičnu vrednost 0xAA55. Po ovoj vrednosti BIOS zna da li je uređaj bootabilan, ali takođe predstavlja validaciju MBR-a.

MBRMBR

Posao primarnog boot loadera je da pronađe sekundarni boot loader. Ovo se radi tako što primarni boot loader pretražuje tabelu particija tražeći aktivnu particiju. Kada je pronađe, proveri da li su sve ostale particije neaktivne i kopira boot zapis aktivne particije u RAM i izvršava ga.

Boot loader - faza dva

Sekundarni boot loader ima zadatak da učita kernel u memoriju i opciono da učita RAM disk.

Primarni i sekundarni boot loader zajedno se zovu Linux Loader (LILO) ili GRand Unified Bootloader (GRUB). Pošto LILO ima neke mane koje su popravljene u GRUB-u, ovde ćemo razmatrati GRUB.

Dobra stvar u vezi GRUB-a je to što je on svestan filesystem-a. Umesto da pamti sirove podatke o sektorima na disku (kao što to LILO radi) GRUB može da učita kernel sa ext2, ext3 ili nekog drugog filesystema. Ovo je urađeno tako što je ubačen još jedan sloj u boot loader. Primarni bootloader iz MBR-a učitava ovaj dodatni (stage 1.5) koji je svestan filesystema na kom se nalazi kernel koji treba učitati. Na primer ovaj fajl može da se zove reiserfs_stage1_5 (za učitavanje iz Reiser filesystema). Sve fajlove koje GRUB koristi za fazu 1.5 možete videti u /boot/grub. Kada je ovaj među - boot loader učitan, boot loader iz faze 2 može da se učita.

U ovom trenutku, GRUB prikazuje listu dostupnih kernela (čita iz /boot/grub/grub.conf) i birate koji od njih hoćete da učitate. Možete čak proslediti neke parametre kernelu ovom trenutku. Sada se učitava kernel i initrd u RAM memoriju i izvršava se kernel.

Kernel

Sada kad je slika kernela u memoriji i kernel ima kontrolu (sekundarni boot loader mu je prepustio), on počinje da se izvršava. Slika kernela nije izvršna, nego je kompresovana. Ovo je obično bzImage, prethodno kompresovana pomoću zlib-a. Na početku slike kernela postoji mali deo koda koji minimalno istražuje hardware, zatim raspakuje kernel i smešta ga memoriju sa višim adresama.

Kada bzImage počne sa izvršavanjem, izvršavanje počinje od rutine start u fajlu ./arch/i386/boot/head.S. Ovde se vrši minimalna inspekcija hardware-a i poziva se startup_32 rutina iz fajla ./arch/i386/boot/compressed/head.S. U ovom delu koda se između ostalog inicijalizuje stack i čisti se BSS (Block Started by Symbol). Zatim se kernel dekompresuje pozivom decompress_kernel rutine koja je pisana u C-u (iz fajla ./arch/i386/boot/compressed/misc.c). Sad kada je kernel raspakovan, prepušta mu se izvršavanje. Ovo se radi još jednom startup_32 funkcijom, ali ovog puta iz fajla ./arch/i386/kernel/head.S.

U ovoj funkciji (koja se još zove swapper ili process 0 - jedini proces u Linuxu koji ne nastaje fork-ovanjem) se inicijalizuju tabele za stranice i uključuje se korišćenje stranica za memoriju. Detektuje se tip CPU-a, kao i FPU-a (floating point unit) i čuva za kasniju upotrebu. Zatim se poziva start_kernel funkcija iz fajla ./init/main.c koja izvršava deo kernela koji nije vezan za arhitekturu na kojoj se izvršava. Ovo je praktično main funkcija Linux kernela.

U izvršavanju funcije start_kernel se poziva mnogo funkcija za inicijalizaciju mnogih stvari (prekida, još memorijskih podešavanja, učitava se inicijalni RAM disk) i na kraju se poziva kernel_thread (iz ./arch/i386/kernel/process.c) koji dalje pokreće init funkciju koja predstavlja prvi proces u korisničkom prostoru. Konačno, nakon poziva funkcije cpu_idle, sheduler može da preuzme preiodičnu kontrolu i koristeći mehanizam prekida omogućava multitasking.

Za vreme bootovanja (piše gore tačno gde), u RAM je učitan inicijalni RAM-disk (initrd). Initrd služi kao privremeni root filesystem u RAM-u i zbog njega kernel može da se boot-uje bez montiranja fizičkih uređaja. Pošto moduli neophodni za komunikaciju za periferijama mogu biti deo initrd-a, sam kernel može biti izuzetno mali, a da i dalje podržava mnogo uređaja. Nakon što je kernel boot-ovan, root filesystem se rotira (pomoću pivot_root, man 8 pivot_root), initd je odmontira, a pravi root filesystem se montira.

Init

Nakon što je kernel boot-ovan i inicijalizovan, on poziva prvu aplikaciju u korisničkom prostoru. To je prvi program koji se poziva a da je kompajliran sa standardnom C bibliotekom. Do ovog trenutka ni jedna standardna C aplikacija nije izvršena.

Uglavnom je prva aplikacija koja se izvršava /sbin/init i šta će ona uraditi zavisi od podešavanja u fajlu /etc/inittab. Ovo se razlikuje za svaku distribuciju, i ako vas zanima šta vaša distribuija radi na dalje, pročitajte init skripte.

Document Actions