do spisu tresci tematu 10



Spis tresci


Wprowadzenie

Wszyscy niejednokrotnie "wykonywali" ladowanie systemu Ta czesc calego projektu ma przyblizyc procedure ladowania systemu operacyjnego Linux.


Na poczatku przedstawie schemat bootowania Linuxa.

(schemat)



  1. Start, komputer musi byc wlaczony aby mogl rozpoczac praca.
  2. Wstepne prace..., procesor "przywoluje" ROM-BIOS, a potem tenze czyta bootsector,... itd.
  3. Wywolanie kilku programow asemblerowych adpowiedzialnych za zaladowanie obrazu(ang image) jadra, wybranie trybu grafiki, dekompresji jadra... itp.
  4. Wywolanie start_kernel() z init/main.c powoduje rozpoczecie stronicowania, obslugi przerwan, inicjalizacje urzadzen takich jak stacje dyskow, twarde dyski, CD,... itp.
  5. Wywolanie funkcji init() z init/main.c.
  6. Koniec pracy systemu.

Krotki opis dzialalnosci procesora oraz BIOS-a

Kiedy komputer jest wlaczany, z pamieci stalej uruchamiane sa procedury testujace poprawne dzialanie wszelkich urzadzen, sprawdzane sa pamiec, karty rozszerzen, czesci skladowe systemu komputerowego.Jest to test zwany POWER ON SELF TEST lub krotko POST. Dopiero potem na podstawie ustawien w BIOS-ie wybierany jest dysk , z ktorego bedzie przeczytany BOOT SECTOR. Przewaznie jest to pierwsza stacja w ktorej znajduje sie dyskietka systemowa; w przeciwnym razie "pierwszy" twardy dysk (kolejnosc twardych dyskow mozna skonfigurowac). Jezeli na dysku jest kilka partycji kazda ma swoj BOOT SECTOR. Jedna z tych partycji jest ustawiona jako aktywna (zamarkowana w tablicy partycji w MASTER BOOT RECORD jako "bootable"), jej BOOT SECTOR bedzie wczytany.
Inne programy ladujace np. LILO (LInux LOader) pozwalaja wybrac jedno sposrod kilku jader systemow (podczas instalacji mozna ustawic, czy LILO zawsze bedzie sie pytac o ktore jadro chodzi, czy domyslnie bedzie wybierac jedno, gdy w poczatkowej fazie nie wcisniemy klawisza CTRL, ALT lub SHIFT).
BOOT SECTOR zawiera maly program (musi przeciez zmiescic sie w jednym sektorze), ktorego zadaniem jest wczytanie i wystartowanie jadra. Tym programem jest przewaznie bootsect.S.


Asembler

Strukture programow napisanych w asemblerze trudno jest przedstawic w "pseudokodzie". (Poza tym zajecia z Programowania Niskopoziomowego odbywaja sie w VI semestrze [drugi semestr trzeciego roku]). Ogranicze sie wiec do slownego omowienia programow asemblerowych.


bootsect.S


Zrodlo: /arch/i386/boot/bootsect.S.

Jedynym dolaczanym plikiem jest linux/config.h, w ktorym zdefiniowane sa:
DEF_INITSEG 0x9000 - miejsce w pamieci (fizyczny adres) gdzie przenoszony jest bootsect.S by nie blokowac pamieci przeznaczonej dla systemu
DEF_SYSSEG 0x1000 - miejsce w pamieci (fizyczny adres) od ktorego rozpoczyna sie segment systemu
DEF_SETUPSEG 0x9020 - miejsce w pamieci (fizyczny adres) gdzie rozpoczyna sie segment dla setupu
DEF_SYSSIZE 0x7F00 - ilosc 16-bajtowych "slow"(odninkow pamieci)(ang. click)ktore moga byc wczytane jako system, 0x7F000 to jest 508kB czyli wiecej niz potrzeba dla obecnej wersji Linuxa ktora kompresuje jadro
oraz
NORMAL_VGA 0xffff dla trybu 80x25
EXTENDED_VGA 0xfffe dla trybu 80x50
ASK_VGA 0xfffd jesli mamy sie pytac o tryb

Poniewaz sa to fizyczne adresy nalezy uwazac jesli chcemy je zmieniac, najlepiej jednak zostawic je nienaruszone
bootsect.S jest ladowany do pamieci od 0x7c00 przez rutynowa procedure startowa BIOS-a, przekazywane jest mu sterowanie. Na poczatku przenosi sie "na ubocze" do miejsca oznaczonego jako DEF_INITSEG czyli 0x90000 i skacze tam. Nie powinien skakac na slepo. Korzystnym moze okazac sie sprawdzenie "konca pamieci", poniewaz moga zdarzyc sie systemy tylko z 512kB pamieci.
Nastepnie laduje setup bezposrednio za siebie (za bootblock) tzn do 0x90200(DEF_SETUPSEG)..

load_setup:
Jesli cos jest nie w porzadku to konczy procedure ladowania, zwracajac kod bledu. Gdy wszystko jest OK wypisuje komunikat Loading i rozpoczyna ladowanie systemu

Po tym wszystkim sprawdza ktory program obslugi roota (ang. root-device) bedzie uzywany. Jesli jest zdefiniowany, nie robi nic dajac ten uzywany. W przeciwnym wypadku dajemy jeden z /dev/fd0H2880 (2,32) lub /dev/PS0 (2,28) lub /dev/at0 (2,8) zaleznie od liczby sektorow do ktorych wiemy, ze ma miec dostep.
Potem skacze do setupu.


setup.S


Zrodla: /arch/i386/boot/setup.S
Setup jest odpowiedzialny za pobranie z BIOS-u danych systemowych i umieszczenie ich w odpowiednich miejscach w pamieci systemu. Ten program pyta BIOS o pamiec, dyski, inne parametry i uklada je w "bezpieczne" miejsce: 0x90000-0x901FF, tam znajdowal sie boot-block.

Te ustawienia powinny byc zgodne z ustawieniami z bootsect.S

INITSEG = DEF_INITSEG -------------------------------- 0x9000, tu jest bootsect (na uboczu)
SYSSEG = DEF_SYSSEG --------------------------------- 0x1000, tu wczytany system
SETUPSEG = DEF_SETUPSEG ------------------------------- 0x9020, to jest biezacy segment
DELTA_INITSEG = SETUPSEG - INITSEG -------------------- 0x0020


Tu jest typ i wersja programu ladujacego :
type_of_loader:	.byte	0
		
jesli rowny 0 to jest jeden ze starych programow ladujacych(LILO, Loadlin, Bootlin, SYSLX, bootsect...) w przeciwnym razie zostal ustawiony przez program ladujacy 0xTV: T=0 przez LILO T=1 przez Loadlin T=2 przez bootsect-loader T=3 przez SYSLX T=4 przez ETHERBOOT V =wersja


Tu program ladujacy wklada adresy startowe
code32_start: .long 0x1000 Po sprawdzeniu czy stary program ladujacy nie probowal uruchomic "big kernela", jesli cos jest nie w porzadku wychodzi drukujac komunikat "Wrong loader, giving up...", jesli jest OK. to: Potem setup przechodzi w tryb chroniony.
Nastepnie przenosi system w jego prawidlowe miejsce, ale tylko wtedy gdy nie mamy do czynienia z "big kernelem"-duzym jadrem. Jesli kod setupu nie jest w tym momencie w 0x90000, umieszcza sie tam, przenoszac rowniez za siebie parametry (commandline)
Teraz musi przeprogramowac przerwania; wstawiamy je zaraz za przerwaniami sprzetowymi zarezerwowanymi przez intela w 0x20-0x2F.
Pobiera z zegara CMOS-u czas.
Potem dolaczamy video.S i kod wykrywania trybu wyswietlania obrazu. Od tego miejsca jest pewien obszar wolnej pamieci zarezerwowany do uzytku tylko do obslugi obrazu (nie uzywane przez jadro).



head.S


Zrodla: /arch/i386/kernel/head.S
Program ten zawiera 32-bitowy kod startowy. Niektore rzeczy musza byc zrobione powtornie, bo byly wykonane w 16-bitowym trybie. Na koniec wola funkcje SYMBOL_NAME z parametrem start_kernel()(dziala podobnie do exec, tylko nie powoduje wyjscia z trybu jadra). Po jej wywolaniu sterowanie nigdy nie wraca do head.S, kontynuacja nastepuje w start_kernel() z pliku init/main.c .


start_kernel()

Zrodla: /init/main.c

Kiedy uruchamiamy funkcje start_kernel() obsluga przerwan jest nadal wylaczona, zostanie wlaczona przez funkcje sti() po dokonaniu koniecznych ustawien. Jej glownym celem jest inicjalizacja wszelkich niezbednych struktur i sterownikow urzadzen.

Ponizej krotko omowie poszczegolne funkcje wywolywane w start_kernel()

Po wszystkich inicjalizacjach i wczytaniu potrzebnych sterownikow, start_kernel()robi forka dla procesu init uzywajac funkcji kernel_thread (funkcja tworzy proces potomny i nie wychodzi potem z trybu jadra) sam wchodzi do petli niekonczonej for(;;) idle().
Ten proces (task[0]) nie ma okreslonego stanu, wiec jadro nie ma nad nim zadnej kontroli, jego rola ogranicza sie tylko do zarzadzanie procesami wywolujacymi funkje systemowe.


Init w main.c

W ostatnim kroku start_kernel() tworzy nowy proces poprzez wywolanie funkcji kernel_thread(init,NULL,0); (-funkcja napisana w asemblerze, ktora tworzy proces potomny nie wychodzac z trybu jadra) przekazuje potomkowi miejsce skad ma zaczac wykonanie w tym przypadku - funkcja init() w init/main.c. Nowo powstaly proces jest procesem 1 (proces init). Algorytm jego pracy omowiony jest w init.html


Koniec

Dzialalnosc Linuxa konczy sie wraz z zatrzymaniem pracy komputera. Nie jest jednak zalecane "brutalne wyciaganie wtyczki". To moze spowodowac: Czasem jednak zdarzaja sie sytuacje(pozdrowienia dla pracownikow elektrowni) gdy nie mamy kontroli nad odcieciem zasilania. Pozostaje nam wtedy nadzieja, ze nic zlego sie nie stalo i po ponownym wlaczeniu pradu i zaladowaniu systemu zaczac prace od nowa.


Bibliografia

  1. Pliki zrodlowe Linuxa
  2. Linux Kernel Hackers' Guide
  3. Inne zrodla

Pytania i odpowiedzi


Autor : Adam Pustola