Architektura Linuxu


I still maintain the point that designing a monolithic kernel in 1991 is a fundamental error. Be thankful you are not my student. You would not get a high grade for such a design :-)

-- Andrew Tanenbaum to Linus Torvalds

Na rozdφl od Microsoft Windows a jemu podobn²ch, operaΦnφ systΘm Linux nenφ jednolit², magick², celek. Je tvo°en z mnoha Φßstφ, kde se ka╛dß starß o urΦitou Φßst chodu systΘmu. Ka╛dß tato Φßst je podrobn∞ zdokumentovßna tak, aby ka╛dou z nich mohl vyvφjet odd∞len² t²m. Je podstatnΘ se v tΘto architektu°e orientovat, proto╛e pokud n∞co nefunguje a vy vφte, kdo je za to zodpov∞dn², je vß╣ ·kol mnohem snaz╣φ.

Jßdro systΘmu

Jßdro systΘmu (tedy vlastnφ Linux) se zavßdφ p°i startu systΘmu a zaruΦuje nejzßkladn∞j╣φ operace. Sv∙j nßvrh d∞dφ po operaΦnφm systΘmu Unix, kter² ve svΘ dob∞ zp∙sobil p°evrat tφm, ╛e jßdro jasn∞ odd∞lil od zbytku systΘmu a vypustil z n∞j v∞t╣inu zbyteΦn²ch slu╛eb. To je vlastn∞ d∙vod ·sp∞chu Unixu. Proto╛e je jßdro ·pln∞ hloupΘ, velmi pomalu zastarßvß a tak i dnes, 30 let po svΘm vzniku je Unix °azen mezi modernφ operaΦnφ systΘmy.

Jßdro Linuxu zodpovφdß za:

Zprost°edkovßnφ k p°φstupu k periferiφm.
P°φstup k periferiφm je o╛ehavou zßle╛itostφ. Je mo╛nΘ tφm poΦφtaΦ zablokovat a nebo i zniΦit. Navφc k jednomu za°φzenφ v∞t╣inou nem∙╛e p°istupovat vφce program∙ zßrove≥. To se prochßzφ s filosofiφ Unixu, kde by b∞╛nΘ programy nem∞ly stabilitu systΘmu ohro╛ovat a kde zßrove≥ pracuje mnoho u╛ivatel∙ a b∞╛φ mnoho proces∙.

Proto je nutnΘ, aby jßdro procesy na hardware nepustilo a v╣echny p°φstupy d∞lalo za n∞. Jednou z nejgenißln∞j╣φch my╣lenek Unixu je, ╛e ve╣ker² tento p°φstup sjednotil pod prßci se soubory. Hardwarovß za°φzenφ (t°eba floppy disk) jsou pak pouze specißlnφ soubory. Zßpisem do takovΘho soubory pak pφ╣ete na disketu. To umo╛≥uje, aby i programy, kterΘ nejsou urΦeny pro prßci se za°φzenφm s nφm pracovaly a u╣et°φ se tak Φas programßtorovi, kter² se nemusφ uΦit novΘ API.

Pokud hardware umφ n∞jakΘ triky, kterΘ se ╣patn∞ schovßvajφ pod prßci se souborem, m∙╛e podporovat IOCTL, kter²m se nap°φklad nastavuje formßt diskety, nebo samplovacφ frekvence p°i v²stupu na disk.

O jednotlivΘ za°φzenφ se starajφ ovladaΦe, kterΘ v p∙vodnφm Unixu byly napevno zakompilovanΘ do jßdra. To je pon∞kud nep°φjemnΘ, proto╛e p°i zm∞n∞ hardwaru musφte p°ekompilovßvat jßdro. Linux dnes podporuje dynamickΘ zavßd∞nφ t∞chto ovladaΦ∙ pomocφ modul∙.

Linux mß v poslednφ dob∞ velice dobrou podporu nejr∙zn∞j╣φch periferiφ a mnoho hardwarov²ch firem ji╛ distribuuje jejich v²voj. P°esto je ale dobrΘ konzultovat seznam podporovanΘho hardware, ne╛ si n∞co novΘho koupφte.

╪φzenφ proces∙
Ka╛d² program b∞╛φcφ v Linuxu je proces. Tento proces je samostatnß entita a jßdro mu zprost°edkovßvß svΘ slu╛by. Linux mß preemptivnφ multitasking a pou╛φvß ochranu pam∞ti a tak proces se v podstat∞ cφtφ, jako kdyby b∞╛el sßm na ΦistΘm poΦφtaΦi. N∞kterΘ operace jsou mu v╣ak odep°eny (jako u╛ zmφn∞n² p°φstup k periferiφm), o kterΘ musφ po╛ßdat jßdro.

Mezi zßkladnφ operace pro prßci s procesy, kterΘ jßdro umφ je rozd∞lenφ procesu na dva b∞╛φcφ zßrove≥ (fork) a vym∞n∞nφ k≤du b∞╛φcφho procesu (exec) - dan² proces se ukonΦφ a je nahrazen nov²m programem.

Na rozdφl od klasickΘho Unixu, Linux podporuje i multithreading.

Sprßva pam∞ti
Jßdro pou╛φvß strßnkovßnφ k vytvo°enφ virtußlnφ pam∞ti. Ka╛d² proces mß sv∙j odd∞len² adresnφ prostor a tak si programy nevidφ navzßjem "do karet" a nem∙╛ou se navzßjem ohrozit. TakΘ nevidφ do pam∞ti jßdra a tak nemohou ohrozit ani to. Jßdro dovoluje procesu jeho adresnφ prostor modifikovat. Umφ "namapovat" soubor na danou pozici - v pam∞ti je pak vid∞t obsah danΘho souboru, kter² jßdro v p°φpad∞ pot°eby nahraje, nebo obnovφ na disku (pokud program pam∞╗ modifikoval). Sdφlet urΦitou Φßst pam∞ti mezi procesy apod.

Standardn∞ se pam∞╗ procesu sklßdß z jeho k≤du (kter² program nem∙╛e m∞nit), neomezen∞ rostoucφho zßsobnφku a z druhΘ strany adresnφho prostoru rostoucφ haldy.

Navφc jßdro vytvß°φ virtußlnφ pam∞╗ a odklßdß Φßsti na disk, pokud to je t°eba.

Jßdro Linuxu obsahuje velmi kvalitnφ sprßvu pam∞ti. Mezi jeho p°ednosti pat°φ:

  • Diskovß cache, kterß se dynamicky m∞nφ podle velikosti volnΘ pam∞ti.
  • Zavßd∞nφ programu "po kouskßch" - p°i startu programu se jeho k≤d nenahraje cel² do pam∞ti. Nahraje se pouze jeho prvnφ strßnka a program se spustφ. Pokud pot°ebuje dal╣φ strßnky, tak se mu nahrajφ pozd∞ji. Toto zrychluje start program∙ a ╣et°φ pam∞╗.
  • Zpo╛d∞nΘ p°id∞lovßnφ pam∞ti - pokud program po╛ßdß o volnou pam∞╗, jßdro si to pouze zapamatuje a p°id∞lφ ji a╛ v dob∞, kdy ji program zaΦne pou╛φvat.
  • Zpo╛d∞nΘ kopφrovßnφ pam∞ti - kdy╛ se b∞╛φcφ proces rozd∞lφ na dva, jeho pam∞╗ by se m∞la zkopφrovat. To se ale nestane a kopie se vytvß°φ se zpo╛d∞nφm a╛ v situaci, kdy╛ jeden z programu zaΦne do ni zapisovat.
Plßnovßnφ proces∙
Unix od poΦßtku podporuje preemptivnφ multitßsking a tak m∙╛e b∞╛et vφce program∙ zßrove≥. Linux p°epφnß procesy 100 krßt do sekundy (a multitßsking je tak plynulej╣φ, ne╛ na v∞t╣in∞ ostatnφch systΘm∙).
BezpeΦnost
Unix je navr╛en jako multiu╛ivatelsk² operaΦnφ systΘm a tak jßdro musφ zpracovßvat p°φstupovß prßva. BezpeΦnostnφ model Unixu je velmi jednoduch² a dnes trochu zastaral². Pro b∞╛nΘ pou╛itφ v╣ak pln∞ postaΦuje.

Unix zavßdφ pojem u╛ivatele a skupiny, kterΘ se v jßd°e udßvajφ jako Φφsla. Ka╛d² proces mß svΘho u╛ivatele a skupinu. Prost°edky pak majφ svΘ vlastnφky a skupiny majφ nastavena p°φstupovß prßva zvlß╣╗ pro svΘho majitele, svoji skupinu a ostatnφ. U soubor∙ jsou v╛dy t°i zßkladnφ parametry - p°φstup ke Φtenφ, zßpisu a spu╣t∞nφ.

Navφc Unix p°edpoklßdß existenci sprßvce - specißlnφho u╛ivatele "root", s identifikaΦnφm Φφslem 0. Tento u╛ivatel m∙╛e d∞lat v╣e, bez p°ihlΘdnutφ k p°φstupov²m prßv∙m. Navφc jßdro zprost°edkovßvß n∞kolik slu╛eb pouze pro n∞j - nap°φklad jako jedin² mß prßvo rebootovat systΘm.

N∞kdy v╣ak n∞kdy chce sprßvce (nebo i jin² u╛ivatel) "prop∙jΦit" u╛ivateli n∞jakß prßva. Nap°φklad mu chce dovolit rebootovat systΘm, existuje je╣t∞ jedna berliΦka jmΘnem "sbit". Mß-li soubor s programem tento bit nastaven, program mß povoleno na sebe p°evezmout p°φstupovß prßva vlastnφka souboru. Tak nap°φklad program "reboot" spu╣t∞n normßlnφm u╛ivatelem na sebe m∙╛e vzφt prßva superu╛ivatele a restartovat systΘm.

Toto je pon∞kud nebezpeΦn² trik, proto╛e v p°φpad∞, ╛e program oznaΦen² sbitem obsahuje chybu, a u╛ivatel jej m∙╛e donutit k tomu, aby ud∞lal co pot°ebuje, vznikne bezpeΦnostnφ dφra v systΘmu. Je tedy t°eba si na takovΘ programy dßt zvlß╣tnφ pozor.

Dφky tomu n∞kterΘ pozd∞j╣φ systΘmy existenci takto v╣emocn²ch u╛ivatel∙ ru╣φ a zavßd∞jφ flexibiln∞j╣φ systΘm u╛ivatelsk²ch prßv. Linux zatφm nic takovΘho standardn∞ neumφ, i kdy╛ se na tom pracuje. Tyto p°φstupy v╣ak majφ jinß ·skalφ.

Obsluha filesystΘmu
Unix jako jeden z prvnφch zavedl systΘm adresß°∙. Na rozdφl od Windows rozli╣uje malß a velkß pφsmena a podporuje n∞kterΘ dal╣φ triky - jeden soubor m∙╛e mφt n∞kolik nßzv∙, je mo╛nΘ vytvß°et symbolickΘ linky (kterΘ ukazujφ na jin² soubor a p°i jejich otev°enφ se vlastn∞ otev°e odkazovan² soubor) a podporuje vytvß°enφ specißlnφch soubor∙ - "devices", kterΘ odkazujφ na ovladaΦe v jßd°e a pomocφ kter²ch pak p°istupujete na periferie, a FIFO - pojmenovanΘ fronty pou╛φvanΘ pro komunikaci mezi procesy.

Na rozdφl od Unixu, Linux obsahuje abstrakci mezi vlastnφm ovladaΦem filesystΘmu a systΘmov²m volßnφm. Umo╛≥uje tak vyjma svΘho vlastnφho filesystΘmu (ext2) i pracovat s jin²mi filesystΘmy: adfs, affs, coda, efs, msdos, vfat, hfs, hpfs, isofs minix, ncpfs, nfs, ntfs, qnx4, sysv, ufs, romfs, smbfs. A tak se domluvφ s v∞t╣inou ostatnφch operaΦnφch systΘm∙.

Na rozdφl o Windows v Unixu neexistujφ pojmenovanΘ disky (a:, c: apod.). V╣echny disky jsou "naroubovßny" do podadresß°∙ hlavnφho filesystΘmu. Roubovßnφ a odroubovßvßnφ filesystΘmu se provßdφ volßnφm mount a umount.

Podpora sφt∞
Unix byl jeden z prvnφch operaΦnφch systΘm∙, kterΘ se adaptovaly na pou╛itφ protokolu TCP/IP. A proto Linux mß dnes velmi dobrou podporu Internetov²ch protokol∙. Jeho TCP/IP stack pat°φ k nejspolehliv∞j╣φch a nejrychlej╣φm v∙bec.

Linux podporuje mnoho specißlnφch trik∙, jako je firewall, nebo Masquerading, kter² dokß╛e p°ipojit celou sφ╗ k internetu pomocφ jednΘ IP adresy. Proto je Linux jeden z nejlep╣φch operaΦnφch systΘm∙ pro sφ╗ovΘ servery.

Vyjma TCP/IP Linux podporuje i n∞kterΘ dal╣φ protokoly nap°φklad appletalk, nebo ipx. Proto poslou╛φ t°eba i jako "Novellov²" server.

Pro prßci v sφti Linux pou╛φvß API BSD soket∙, kterΘ je dnes nejroz╣φ°en∞j╣φ.

Komunikace mezi procesy
Klasick² Unix podporoval komunikaci pomocφ signßl∙ a pipe (fronta, do kterΘ jeden proces zapisuje a druh² Φte). Dne╣nφ UnixovΘ systΘmy podporujφ mnoho dal╣φch primitiv, jako je sdφlenß pam∞╗, zßmky, semafory, zprßvy apod.

Standardnφ knihovna

Rozhranφ mezi jßdrem a programem tvo°φ standardnφ knihovna jmΘnem glibc. Ta na rozdφl od jßdra sφdlφ v pam∞ti procesu a tak jejφ v²voj u╛ nenφ tak slo╛it². Proto se v Linuxu starß i o n∞kterß volßnφ, kterß v klasickΘm Unixu provßdφ jßdro. Knihovna navφc obsahuje standardnφ funkce po╛adovanΘ pro jazyk C a mnoho dal╣φch vymo╛enostφ. Knihovna je sdφlenß a proto nenφ zalinkovßna do ka╛dΘho programu a je v pam∞ti pouze jednou. O jejφ zavedenφ se starß p°i startu programu dynamick² loader. Na disku ji najdete v adresß°i /lib.

Standardnφ utlity a start systΘmu

Hned po startu jßdra p°evezme °φzenφ program init, kter² pomocφ souboru /etc/inittab mß za ·kol nastartovat systΘm. K tomu se pou╛φvß bezpoΦet mal²ch Unixov²ch utilit se kter²mi se seznßmφte pozd∞ji. Mezi nejd∙le╛it∞j╣φ asi pat°φ shell - interpretr p°φkaz∙, kter² zpracovßvß startovacφ skripty (ulo╛enΘ v∞t╣inou v /etc/rc.d) a se kter²m se setkßte po p°ihlß╣enφ. V Linuxu se pou╛φvß nejΦast∞ji bash z GNU projektu. Shell standardn∞ najdete v /bin/sh.

SytΘm p°i startu d∞lß n∞kolik d∙le╛it²ch v∞ci:

KonfiguraΦnφ soubory Linuxu najdete v adresß°i /etc. Na rozdφl od Windows jsou to normßlnφ textovΘ soubory a tak je m∙╛ete opravovat textov²m editorem. To dodßvß velkou kontrolu na systΘmem a konfiguraci znaΦn∞ zjednodu╣uje. Pokud mßte v oblib∞ user friendly okΘnka, existuje n∞kolik nßstroj∙, kterΘ soubory zm∞nφ za Vßs.

Prßce v Unixu

Narozdφl od Windows a MS-DOSu Unix obsahuje mocnou p°φkazovou °ßdku. Jeho interpretr p°φkaz∙ je mnohem chyt°ej╣φ, a podporuje zßkladnφ programßtorskΘ obraty - smyΦky, funkce apod. TΘm∞° v╣echny standardnφ utility v Unixu jsou jednoduchΘ filtry, kterΘ Φtou text ze vstupu, provßdφ operaci a posφlajφ ji na v²stup. Jejich kombinacφ m∙╛ete snadno d∞lat velmi komplikovanΘ operace a proto ka╛dΘmu doporuΦuji nauΦit se p°i kazovou °ßdku dob°e pou╛φvat. Oproti cvakßnφ my╣φ u╣et°φ mnoho Φasu a prßce.

Pokud tou╛φte po grafice a user friendly vymo╛enostech, m∙╛ete ale Φφst dßl.

X window system

Do samotnΘ filosofie Unixu grafika moc nezapadß. Proto je °e╣ena odd∞len²m systΘmem zvan²m X Window system (krßtce X, nebo X11). Jednß se o jedno z nejstar╣φch okennφch prost°edφ (1985), ale dφky zajφmavΘmu nßvrhu se pou╛φvß dodnes.

Zßkladem X je grafick² server, kter² je navr╛en tak, aby komunikoval s aplikacφ pomocφ sφ╗ov²ch soket∙. To umo╛≥uje, aby aplikace b∞╛ela na jednom poΦφtaΦi, ale zobrazovala se na druhΘm. P∙vodn∞ auto°i zam²╣leli, ╛e aplikace pob∞╛φ na sßlovΘm poΦφtaΦi a Xserver bude specißlnφ hardware. To se sice dnes moc nepou╛φvß, p°esto ale nenφ od v∞ci mφt mo╛nost spustit program p°es sφ╗. Navφc do dßvß mo╛nost, aby se k poΦφtaΦi p°ipojilo vφce klßvesnic a monitor∙ a pracovalo na n∞m tak vφce u╛ivatel∙.

Server obsahuje pouze nejzßkladn∞j╣φ primitiva pro prßci s grafikou (i kdy╛ v pr∙b∞hu let se dφky snaze stßle odpovφdat modernφm vymo╛enostem znaΦn∞ zkomplikoval). Vzhled aplikace u╛ nenφ jeho starost. Dokonce se nestarß ani o dekorace oken, kterΘ ma na starosti zvlß╣tnφ aplikace jmΘnem WindowManager. O vzhled tlaΦφtek a menu se zase starß specißlnφ knihovna, kterou obsahuje aplikace.

Dßle X systΘm obsahuje knihovnu Xlib, kterß se starß na aplikaΦnφ stran∞ o sφ╗ovou komunikaci, n∞kolik zßkladnφch utilit a dnes zcela zastaral² window-manager twm a GUI toolkit Athena (kter² ale na svoji dobu obsahoval revoluΦnφ objektov∞ orientovanou technologii a umo╛≥oval vytvß°et dialogy bez pevn∞ zadrßtovan²ch sou°adnic, tak aby se p°izp∙sobovaly velikosti pφsma a dΘlce text∙)

Flexibilnφ nßvrh X je sice moc p∞kn², ale vedl k problΘm∙m. Vzniklo toti╛ mnoho Window manager∙ a mnoho GUI toolkit∙ a tak ka╛dß aplikace vypadala dost jinak a aplikace spolu moc nespolupracovaly. To se poda°ilo °e╣it a╛ v poslednφ dob∞, kdy dφky projekt∙m GNOME a KDE, se prosadily jako defakto standard prosadily dv∞ knihovny (GTK a QT) a pou╛φvß se jen n∞kolik mßlo Window manager∙, jejich╛ schopnosti jsou tΘm∞° identickΘ.

Proto doufßm, ╛e tento odv∞k² problΘm X se brzy stane minulostφ. Dal╣φ nev²hodou je pom∞rn∞ velkß slo╛itost (a tφm i nßroΦnost na pam∞╗), kterß vznikla snahou p°izp∙sobit se v╣em grafick²m vymo╛enostem za 30 let. Jeho komplikovanost ale nenφ v∞t╣φ, ne╛ u Windows Φi MacOS.

O spoleΦnou Φßst k≤du X se starß organizace Open Group (d°φve X consorcium), kterß svΘ k≤dy zp°φstup≥uje dal╣φm firmßm, kterΘ dod∞lßvajφ podporu pro danou platformu. Free softwarovou implementace X vyvφjφ organizace XFree86.

GNOME a KDE

U╛ivatelsky p°φtulnΘ grafickΘ desktopy dlouho Linuxu chyb∞ly. Zhruba p°ed rokem v╣ak vznikly dva konkurenΦnφ projekty GNOME a KDE, kterΘ oba majφ za ·kol takov² desktop vytvo°it. Prvnφ stabilnφ verze obou projekt∙ vznikly jen p°ed n∞kolika mßlo m∞sφci. Dnes jsou to v╣ak velmi pokroΦilΘ projekty, kterΘ snad uspokojφ ka╛dΘho okennφho u╛ivatele.

Tyto projekty byly pom∞rn∞ d∙le╛it²m meznφkem ve v²voji Linuxu, proto╛e v podstat∞ odstartovaly seri≤znφ snahy ud∞lat Linux vhodn² pro "normßlnφ u╛ivatele". Za poslednφ rok vznikl grafick² program GIMP, kter² odpovφdß znßmΘmu Photoshopu a rozjelo se n∞kolik projekt∙ o vytvo°enφ kancelß°skΘho balφku pro Linux. Uvidφme, jak budou ·sp∞╣nΘ.