PDA

Pogledaj cijelu verziju : Učionica >> Razvoj OS-a



RayDX
31-05-2008, 00:18
S obzirom da me operacijski sustavi već neko vrijeme opsjedaju, odlučio sam napisati tekst da se malo oslobodim stresa i da mislim na nešto učinkovito. Sutra ispit iz engleskog, CPE. I mogu reći da me je trta... Nazad na operacijske sustave... Najlogičnija ulazna točka u ovaj tekst jest odgovoriti što je to operacijski sustav, pa ćemo krenuti od toga...

http://www.ocf.berkeley.edu/~joyoung/msnetclnt/Pictures/NoOs.jpg

Operacijski Sustav je softverska komponenta računalnog sustava koja u osnovi sadrži osnovni set sistemskih programa koji zajedno u cjelini upravljaju i dijele resurse podležnog hardvera. Cijelo računalo, u nadi da omogući lagano korištenje računalnih laicima, dizajnirano je koristeći apstrakcijske slojeve. Sam OS nalazi se na vrhu HALa (ne, HAL 9000 nego Hardware Abstraction Layer). HAL se sastoji od hardvera, firmwarea, assemblera, kernela i na vrhu OSa i aplikacija koje se na njemu vrte. Možemo zamijetiti da OS zapravo služi kao domaćin aplikacijama koje se vrte na njemu, tj. on radi sav prljavi posao sa low level komuniciranjem sa hardverom te nudi ljepuškast set funkcija koji olakšavaju kreiranje aplikacija. Većinom su aplikacije ovisne o određenom OS, ali postoje neke koje su dovoljno fleksibilne da mogu skakati između OS-ova (cross-platform). OS nudi mnoštvo korisnih rutina i servisa aplikacijama i samim korisnicima koji omogućuju olakšano služenje računalom. Aplikacije, naravno, do tih servisa/rutina dolaze kroz APIe (Application Programming Interface) ili različitih poziva sustava. Također, jedna od posebnosti operacijskih sustava je interakcija na ljudima ugodniji način. Kako su se računala razvijala, tako i ljudska domišljatost rasla... Prvobitno smo imali tekstualni UI koji se svodio na puko unošenje naredbi na koje nam je računalo vraćalo proračune tj. podatke, a danas imamo nešto jako lijepo što se zove GUI (Graphical User Interface) koji omogućuju veoma zadovljavajuću i jednostavnu interakciju između čovjeka i računala.

Danas najpoznatiji OS-ovi su: Microsoft Windows, Mac OS X, Linux i Solaris... No, Windows uvjerljivo drži prvo mjesto na listi najpopularnijeg OS-a... S obzirom da bi ovo trebao biti kratki uvod, sutra ujutro ću prije ispita još malo doći se smiriti pa baciti tekst o kernelima, tipovima istih, teoriji izrade OS-a, pogledat ćemo ispod haube te na kraju koncentrirati se na praktični rad koristeći programski jezik C++, iako je C veoma poznat u svijetu OS-ova i njihova razvoja.

fps_gamer
31-05-2008, 09:38
lijepo... ja znam win maaaaalo... jako maaaaaaaalo...

koji fakin ispit??

Luka
31-05-2008, 11:26
zanimljivo .. jedva čekam drugi dio

btw, što je s RayLibom ?

RayDX
31-05-2008, 13:43
zanimljivo .. jedva čekam drugi dio

btw, što je s RayLibom ?

RayLib je još uvijek aktivan samo što ja stalno nešto novo eksperimentiram pa malo ću vjerojatno promijeniti spektar stranice... Ispričavam se što nisam jutros napisao drugi dio, malo sam duže odspavao... Inače, ispit... Ispit je CAE (Certificate in Advanced English), sad sam se vratio, uzrujah se zbog gluposti, bilo je jednostavno ^^

RayDX
31-05-2008, 20:14
Napravio sam si mali ledeni kakao i evo, krećemo... Dakle, prva tema su kerneli...

KERNEL

Prošli put smo spominjali HAL i među nabrojanim, susreli smo se i sa kernelom koji se nalazi odmah ispod OSa. U osnovi, kernel je jezgra svakog OS-a, njegova centralna komponenta. Rekli smo da OS treba moći raspolagati resursima računala, a upravo tome kerneli služe. Kernel upravlja memorijom, uređajima, nudi sučelje za aplikacije da dođu do resursa računala itd. Ono što kernel često radi jest i multitasking s kojim smo upoznati vjerojatno svi (Alt Tab ^^).

Što zasad možemo zaključiti jest činjenica da je kernel najniži apstrakcijski sloj za manipuliranje resursima koji aplikacija mora koristiti da bi izvršila svoj zadatak. Navedene zadatke moguće je obaviti na više načina jer kernel nije strogo zacrtan da se mora napraviti to i to, nego je više otvoren programeru da on odabere kako želi rješiti problem. Imamo dva glavna tipa kernela... Monolitički kernel i mikrokernel. Dakako, ima varijacija između ta dva koji pokušavaju uravnotežiti "uloženo i dobiveno". Pa krenimo po redu...

Monolitički kernel

Glavni cilj ovakvog kernela jest efikasnost rada cjelokupnog sustava. Monolitički kernel funkcionira zajedno sa svim driverima uređaja i kernela unutar prostora jedne adrese koji se vrti u kernel modu. Kao što sam rekao, ovakav pristup daje poprilično dobre performanse, ali činjenica da se sve događa u prostoru jedne adrese znači da ako krepa jedan driver, cijeli sustav pada. Većini najpoznatiji sustav koji je koristio ovakav kernel jest Windows 9x.

Mikrokernel

Ovakav kernel nastoji vrtiti većinu svojih servica i drivera uređaja u userspaceu što rezultira u povećanoj stabilnosti i sigurnosti na računalima koji imaju zadovoljavajuću memorijsku zaštitu. Problem kod modernih, ali i starijih implementacija ovakvog kernela je katastrofalno spora brzina.

Definitivno ste zamijetili da svaki od ponuđenih rješenja dakako ima mnoštvo mana tako da uspješan OS programer će definitivno implementirati neke svoje solucije na predstojeći problem. Od ostalih modela kernela možemo spomenuti hibridne kernele, modularne kernele, nanokernele, exokernele koji su u svojoj osnovi zapravo pomiješani monolitički i mikro kernel. Nemojte se zavarati, imaju i oni svojih mana... No njima se trenutno nećemo baviti. U sljedećem tekstu, pozabavit ćemo se ekstenzivno čim se kernel zapravo bavi jer smo ovdje pokrili tek kratku definiciju kernela.

RayDX
31-05-2008, 22:08
Pokrili smo ukratko što je to kernel... Vrijeme je da se zadubimo u fascinirajuću jezgru operacijskog sustava! Rekli smo da se većina OS-ova bazira na konceptu kernela, a to je direktna posljedica potrebe da se računalni sustav podijeli na apstrakcijske slojeve (HAL!) te da nam kernel služi kao najniži apstrakcijski sloj za manipuliranje resursima računalnog sustava. Dakle, ukratko, ako se prisjetimo HALa

{
- OS i njegove aplikacije
- Kernel
- Assembler
- Firmware
- Hardver
}

vidimo da je kernel zapravo najniži sloj koji je implementiran u softveru. Osobno vjerujem da bi programer bez dizajniranja kernela i korištenja apstrakcijskih slojeva poludio i završio u Vrapčevu. A to ne želimo, ne? Mislim da sam već rekao u prošlom tekstu, ali da ponovimo, kernel se također naziva jezgra (eng. core) OS-a.

Kad upalimo računalo, prva stvar koja se budi jest kernel koji se izvršava u nadzornom modu (eng. supervisor mode) nakon čega sam kernel izvrši inicijalizaciju samoga sebe i pokreće prvi proces i parkira se u pozadini i čeka sistem da ga pozove na dužnost. Što je pisac htio reći, kada aplikacija na OS-u pozove nešto što zahtjeva pažnju kernela, on uskače na principu interrupta. Dakle, hardver javlja kernelu da ima eventova oko kojih se treba pobrinuti. Sam razvoj kernela je jedan od najzahtjevnijih programskih izazova u računalnoj industriji te uključuje mnogo oranja moždanih vijuga. Nema mjesta za pogreške, svaka može i jest kobna za sustav, kao kula od karata, ako je jedan zid nestabilan sve pada. Esencijalno o čem se kernel skrbi jesu low level sređivanje procesa, komunikacija između procesa, manipulacija PCBa (Process Control Block, u biti to je podatkovna struktura u kernelu koja sadrži podatke potrebne za upravljanjem određenim procesom), rukovanje interruptovima, sinkronizacija procesa...

Down the road we go...

Možda ste primijetili da cijelo vrijeme laprdekam o resursima... A što su to zapravo resursi? Resursi... Resursi sustava su njegova memorija, CPU, I/O uređaji u osnovi...

CPUSilitiga procesor je centralni dio hardvera računala, koji je odgovoran za vršenje programa na njemu. Povezan je s kernelom na simbiotičan način. Kernel ima odgovornost tj. dužnost da odluči za koje će se programe alocirati procesor ili jezgre jednog procesora ili više procesora...

Ulazni/Izlazni uređaji (I/O), tu naravno ulaze tipkovnica, miš, HDD-ovi, printeri, zasloni, kamere, zvučnici itd. Kernel alocira zahtjeve od aplikacija da izvrše neki I/O na zahtjevanom uređaju i da ponudi metode na koji se može koristiti uređaj.

Memorija računala koristi se da bi se na nju pohranili programske instrukcije ili podaci, logično, oboje se mora nalaziti u memoriji da bi se program uspješno izvršavao. Često više programa će zahtjevati pristup memoriji, i tražiti sve više memorije (daš im prst, pojedu ruku) dok ne preliju čašu. Tu uskače kernel koji sa svojom čeličnom šakom odlučuje koliko će memorije dobiti svaki proces i donijeti odluku kad dođe do nestašice memorije.

Ono što je od velike važnosti jest domena samog kernela odakle se sve izvršava (poznato kao address space) i zaštitni mehanizam koji odlučuje dokle koji program smije ići (kasnije ću vas upoznati sa "prstenjem"). Kernel također nudi metode sinkronizacije i komunikacije između procesa koje smo spomenuli u prethodnom tekstu (ovo je poznato kao IPC iliti Inter-process communication)

Upravljanje procesima

Da bi objasnili osnovno, najlogičnije bi bilo krenuti od upravljanja procesima... Pa nek bude tako pošto je glavni zadatak kernela da dozvoli izvršavanje aplikacija i ponudi im podršku sa mogućnostima poput hardverskih apstrakcija... Proces definira kojim dijelovima memorije aplikacija može pristupiti. Dakle, dio kernela koji upravlja procesima mora uzeti u obzir hardversku opremu za zaštitu memorije. Da bi se aplikacija izvršila, kernel mora postaviti adresni prostor za aplikaciju, učitati file koji sadrži kôd aplikacije (strojni jezik jer je kompiliran) u memoriju, postavlja stack za program i grana ga u danu lokaciju unutar programa dok pokreće njegovo izvršavanje. Objašnjavati multitasking zasad je nepotrebno i samo bi zasitilo količinu teksta tako da ćemo njemu kasnije posvetiti temu. Naravno raspravit ćemo i teoriju multithreadinga kasnije...

Upravljanje memorijom

Kernel, po svojim standardnim parametrima i specifikacijama, ima potpun pristup memoriji sustava i mora dozvoliti procesima siguran način da pristupe memoriju koju zahtjevaju. Vritual addressing je jedan od načina da se to uradi, uglavnom koristeći paging ( ili swapping ) i segmentation ( koji se također koristi uz ili sam za zaštitu memorije ). Virtualno adresiranje dozvoljava kernelu da napravi danu fizičku adresu virtualnom, a svaki virtualni adresni prostor može biti različit, varira od procesa... Memorija koju jedan proces koristi na određenoj trenutnoj virtualnoj adresi može biti drugačija od one koju drugi proces koristi na točno istoj adresi. Što ovo omogućuje jest da se program ponaša kao da je sam samcat, standalone, što posljedično sprečava urušavanje drugih aplikacija ako jedna od njih naleti na fatalnu grešku.

Virtualna adresa programa može imati referencu prema nečemu što nije trenutno u (radnoj) memoriji. Sloj indirekcije ustupljen korištenjem virtualnog adresiranja prostora dozvoljava OSu da koristi neke drugi načine da pohrani podatke te čita iz njih, naravno, radi se o HDDu... On će pohraniti ono što bi inače ostalo u memoriji. Takvim pristupom, OS je sposoban dozvoliti programima da koriste više memorije nego što sustav ima dostupno. Iz toga možemo izvući pitanje, što kad je podatak potreban trenutno van memorije, na HDDu npr... U tom slučaju CPU signalizira kernel da se to dogodilo (interrupt ^^) i onda kernel reagira ispisivanjem sadržaja sa inaktivnog memorijskog bloka na disk i zamjenjuje ga sa onim potrebnim... Ova šema poznata je kao demand paging o kojem ćete saznati više kroz ovaj "kurs". Još jedna čarolija virtualnog adresiranja jest stvaranje virtualnih particija memorije u dva nespojena područja, jedan rezerviran za kernel, a drugi za aplikacije (userspace)... Ako se sjetite, o ovom smo ukratko raspravili kada smo govorili o modelima kernela (monolitički i mikrokerneli). Aplikacije ne mogu pristupiti memoriji kernela, što osigurava stabilnost, o čemu smo već raspravili prije isto...

Upravljanje uređajima

Softver bez hardvera tj. različitih vanjskih HID uređaja ili periferija nema baš nekog smisla, tako da bi neke korisne stvari radili, potrebno je razviti segment kernela kojeg poznajemo kao menadžmentom uređaja. A kernel kao posrednik između OS i aplikacija te podležnog hardvera služi kao kurir. Ono što je kernel dužan raditi jest kontrolirati i stalno nadgledati trenutno dostupne uređaju, tako da zna reagirati na određene interrupte... Svi smo upoznati sa P'n'P sustavom (Plug 'n' Play)... Jednostavno "upiknemo" uređaj i sustav ga indentificira skeniranjem dotad slobodnih ulaznih portova. Hardverski ih poznajemo kao Universal Serial Bus ilitiga USB i Peripheral Component Interconnect ilitiga PCI. Ovaj segment uvelike ovisi o programeru i nema nekih općih smjernica tako da jednostavno nema potrebe za filozofiranjem na ovu temu.

----------------------------------------------

Sad kad smo pokrili plitke dubine razvoja kernela, vrijeme je da raspravimo sistemske pozive koji su prijeko potrebni da bi OS mogao raditi išta korisno... Dakle, možemo implementirati/ponuditi API (Application Programming Interface) što je u biti biblioteka koja u osnovi nudi pozive koje obrađuje naš ljepuškasti kernel. Trenutačno ovo je sve što trebate znati o ovome... Kasnije ćemo definirati različite načine na koje može stimulirati neki event i probuditi kernel koji voli zadrijemati na posla kad se ništa ne događa.

----------------------------------------------

Evo, proširili smo naše poznavanje kernela, nadam se da ste uživali u ovom tekstu i da će vam koristiti u budućnosti, a sljedeća tema koju ćemo pokriti jest sigurnosni elementi dizajna kernela, zaštitno prstenje i tako dalje... A nakon toga... Monolitički kernel u detalje... S varijacijama...

fps_gamer
31-05-2008, 22:22
procitat cu sutra ;)

Tracer
01-06-2008, 09:54
bravo bravo ;)