Portál AbcLinuxu, 7. května 2025 20:18

Jaderné noviny - 22. 10. 2008

25. 11. 2008 | Jirka Bourek
Články - Jaderné noviny - 22. 10. 2008  

Aktuální verze jádra: 2.6.27. Citáty týdne: Andres Salomon, Linus Torvalds, Hugh Dickins. Začleňovací okno 2.6.28, část druhá. Příčina chyby poškozující e1000e. Přepracování vmap().

Tento článek je překladem z anglického originálu, a proto vychází se zpožděním.

Obsah

Aktuální verze jádra: 2.6.27

link

Začleňovací okno 2.6.28 je stále otevřené, takže momentálně není žádné vývojové jádro. Vizte článek níže, kde naleznete aktualizaci toho, co bylo ve vývojovém cyklu 2.6.28 začleněno.

Současné stabilní jádro 2.6 je 2.6.27.2 vydané 18. října. Obsahuje přibližně tucet důležitých oprav. Před ním bylo vydáno 2.6.27.1 obsahující jedinou opravu zakazující dynamické sledování funkcí.

Stabilní aktualizace pro jádra 2.6.25, 2.6.26 a 2.6.27 jsou v době psaní tohoto článku v procesu revidování; pravděpodobně budou vydána již v době, kdy toto budete číst.

Citáty týdne: Andres Salomon, Linus Torvalds, Hugh Dickins

link

Toto přidává podporu pro touchpad na OLPC. Ten má spoustu hezkých vlastností, z nichž žádná není povolená, protože hardware je příliš zachybovaný. Místo toho ho používáme jako normální touchpad se spoustou workaroundů, které mají řešit jeho časté křeče. Změny vlhkosti, pot, alobalové spodní prádlo, připojení do zásuvky, pití, zlé kočky, ... to všechno způsobuje, že touchpad začne šílet.

-- Andres Salomon by měl prodávat hardware

Jo, jsem nabručený. Kontrola kvality během tohoto začleňovacího okna byla naprosto nechutná. Mám pocit, že si musím stěžovat na každé přetažení [pull], které udělám, protože lidé mají pocit, že další nové varování není problém. A úplně pokaždé je to nové varování způsobeno naprosto mizerným kódem.

-- Linus Torvalds

Mám obavu, že jakmile se objeví diskuze o bariérách a my je vložíme, budu naprosto paranoidní a bude velmi těžké vytřást ze mě potřebu dát bariéry úplně všude, a to včetně bariéry před a za každou bariéru až do nekonečna, abych se ujistil, že jsou to skutečně bariéry.

-- Hugh Dickins

Začleňovací okno 2.6.28, část druhá

link

V době psaní tohoto článku bylo od vydání 2.6.27 do hlavní řady jádra začleněno něco málo pod 6200 neslučovacích [non-merge] sad změn. Toto začleňovací okno by se mělo blížit ke svému konci, který bude okolo 24. října, takže již vcelku dobře vidíme, jak bude 2.6.28 vypadat. Změny viditelné pro uživatele začleněné od minulého týdne zahrnují:

Změny viditelné jaderným vývojářům zahrnují:

Vizte příští Jaderné noviny, kde najdete shrnutí posledních dnů začleňovacího okna 2.6.28

Příčina chyby poškozující e1000e

link

Když se Jaderné noviny naposledy zabývaly chybou v e1000e, která poškozuje hardware, zdroj problému byl přinejmenším nejasný. Za pravděpodobného viníka byl považován problém v ovladači samotném, ale ti, kteří se ho pokoušeli vysledovat, si brzy uvědomili, že potřebují hledat i mimo ovladač. Po nějakou dobu byl zkoumán X server stejně jako mnoho dalších komponent systému. Když byl ale skutečný problém nalezen, ukázalo se, že šlo o překvapení pro všechny zúčastněné.

Vysledování občasných problémů je obtížné. Když vedou tyto problémy ke zničení hardwaru, je jejich odhalení ještě obtížnější. I ti nejvíc odhodlaní testeři se většinou leknou, když je před nimi možnost, že budou muset svůj systém poslat zpět výrobci k opravě. Úkol vyhledat tento problém tedy spadl na Intel; technici se zamkli v laboratoři s plnou krabicí karet e1000e a pustili se do dělení historie jádra půlením, aby identifikovali patch, který problém způsobil. O nějaký čas (a spoustu zničených karet) později dělící proces ukázal nepravděpodobného viníka: sledovací framework ftrace.

Vývojáři pracující na sledování obvykle investují mnoho snahy do toho, aby minimalizovali dopad svého kódu na výkonnost systému. I ten nejposlednější kousek režie běhu je pečlivě zkoumán a zlikvidován, pokud je to trochu možné. Obecným pravidlem je, že rozbití hardwaru znamená tak velkou úroveň režie, že to naprosto jasně překračuje přijatelné parametry. Vývojáři ftrace tedy, jakmile byli informováni o výsledku dělení, sami věnovali hodně snahy na to, aby zjistili, co se to děje.

Jedna z možností, které ftrace nabízí, je jednoduché sledování volání funkcí; ftrace vypíše řádku s volanou funkcí (a tím, kdo ji volá) pokaždé, když k nějakému volání dojde. Toto sledování je zajištěno použitím starobylého profilovacího mechanismu zabudovaného v gcc (a většině ostatních unixových překladačů). Když je kód překládán s volbou -pg, překladač na začátek každé funkce vloží volání mcount(). Verze mcount(), kterou poskytuje ftrace, potom vypisuje všechny relevantní informace při každém volání.

Jak bylo poznamenáno výše, vývojáři sledování se starají o režii. Na většině systémů je téměř jisté, že v daném čase nikdo nebude sledovat volání funkcí. Kdyby tedy byla mcount() volána i tak, znamenalo by to měřitelné zbrzdění systému. Programátoři ftrace tedy hledali způsob, jak tuto režii eliminovat, když jí není zapotřebí. Naivní řešení tohoto problému by mohlo vypadat nějak takto: místo vložení nepodmíněného volání mcount() přimět gcc, aby přidávalo takovýto kód:

if (function_tracing_active)
    mcount();

Jádro ale volá spoustu funkcí, takže i tato verze by znamenala znatelné zbrzdění; navíc by všemi těmi testy narostla velikost jádra. Preferovaný přístup tedy bývá jiný: patchování za běhu. Když se nepoužívá sledování funkcí, jádro přepíše všechna volání mcount() instrukcí no-op. Jak se tak stává, na současných procesorech je nicnedělání velmi optimalizovanou operací, takže režie několika no-op je téměř nulová. Když se někdo rozhodne sledování funkcí zapnout, jádro projde a patchuje všechna tato volání zpět.

Patchování za běhu může vyřešit problém s výkonností, ale samo o sobě zavádí vlastní problém. Změna kódu pod běžícím jádrem je nebezpečná záležitost; je zapotřebí extrémní opatrnosti. Je nutné dávat pozor na to, aby jádro v daném čase nespouštělo daný kód, cache procesorů musí být zneplatněny a tak dál. Kvůli bezpečnosti je nutné zastavit všechny ostatní procesory v systému a počkat, dokud není patchování dokončeno. Konečným důsledkem je, že patchování kódu je drahá záležitost.

Způsob, kterým bylo ftrace naprogramováno, znamenal, že každé odstranění volání mcount() se provedlo poté, co bylo objeveno pomocí skutečného zavolání mcount(). Nicméně, jak je zmíněno výše, patchování za běhu je velmi drahé, obzvláště pokud se dělá pro jedinou funkci. Proto ftrace vytváří seznam míst, odkud se mcount() volá, a později odstraní víc volání naráz. Tímto způsobem je cena za patchování významně redukována.

Problém nyní spočívá v tom, že mezi tím, kdy si kód všimne volání mcount() a kdy se jádro dostane k jeho odstranění, se věci mohly změnit. Bylo by velmi nešťastné, kdyby chtělo jádro odstranit volání mcount(), které by na daném místě již neexistovalo. Aby bylo naprosto jisté, že nebudou poškozena nesouvisející data, používá kód ftrace k vložení no-op operaci cpmxchg. cmpxchg atomicky testuje obsah cílové paměti oproti tomu, co volající předpokládá, že v ní najde; v případě neshody je na daném místě ponechána původní hodnota. Do paměti se no-opy zapíší jedině v případě, že je současný obsah paměti volání mcount().

To se zdá být poměrně bezpečné, ale selže to v jednom neobvyklém, nicméně důležitém případě. Jedním zjevným místem, kde může volání mcount() zmizet, jsou nahrávatelné moduly. To se samozřejmě může stát v případě, kdy je modul odstraněn, je zde ale také ještě jeden důležitý případ: jakýkoliv kód označený jako inicializační se odstraní ve chvíli, kdy je inicializace dokončena. Inicializační funkce modulu (a jakýkoliv jiný kód označený __init) tedy za sebou může zanechat přebytečný odkaz v seznamu "volání mcount(), která se mají odstranit", který si ftrace udržuje.

Poslední díl skládačky pochází z tohoto malého faktu: na 32bitových architekturách sdílí paměť vrácená vmalloc() a ioremap() stejný adresový prostor. Obě funkce vytvářejí mapování ze stejného rozsahu adres. Prostor pro nahrávatelné moduly je alokován pomocí vmalloc(), takže veškerý kód modulu je k nalezení v tomto sdíleném prostoru. Ovladač e1000e přitom používá ioremap(), aby mapoval I/O paměť adaptéru a jeho NVRAM do jaderného adresového prostoru. Konečným výsledkem je tato osudná sekvence událostí:

  1. Modul je nahrán do systému. Součástí inicializace modulu je mnoho volání mcount(); místa, odkud tato volání pochází, se zaznamenají po pozdější patchování.

  2. Inicializace modulu je dokončena a __init funkce modulu je odstraněna z paměti. Adresový prostor, který obsazovala, je uvolněn pro pozdější použití.

  3. Ovladač e1000e mapuje svou I/O paměť a NVRAM do adresového prostoru nedávno používaného výše zmíněným inicializačním kódem.

  4. Ftrace se dostane k patchování položek nashromážděných v seznamu volání mcount(). Některé z těchto "volání" jsou však ve skutečnosti I/O paměť patřící e1000e.

Vzpomeňme, že kód ftrace je při patchování velmi opatrný, používá cmpxchg, aby se vyhnul přepsání čehokoliv, co není volání mcount(). Nicméně, jak Steven Rostedt poznamenal ve svém shrnutí problému:

cmpxchg nás mohlo ve většině případů zachránit (se štěstím) - ale s ioremapovanou pamětí to byla přesně ta špatná věc, kterou udělat - výsledky cmpxchg na zařízení jsou nedefinované (a pravděpodobně vedou k zápisu).

Na konci je tedy zápis do špatného kousku I/O paměti - a zničené zařízení.

Při zpětném ohlédnutí je tato chyba rozumně jasná a pochopitelná, ale není žádné překvapení, že trvalo tak dlouho ji najít. Mělo by se poznamenat, že ve skutečnosti zde byly dvě různé chyby. Jednou z nich byl pokus ftrace zapisovat do neplatného ukazatele. Druhá byla ale stejně důležitá: ovladač e1000e by nikdy neměl nechávat svůj hardware konfigurovaný v režimu, kde ho jediný zbloudilý zápis může změnit v těžítko. Jeden nikdy neví, kde se věci mohou pokazit; hardware by nikdy neměl být ponechán v takto zranitelném stavu, pokud je možné tomu zabránit.

Dobrá zpráva je, že obě chyby byly opraveny. Hardware e1000e byl zamčen předtím, než bylo vydáno jádro 2.6.27 a aktualizace 2.6.27.1 vypíná dynamické ftrace sledování. Kód ftrace byl pro 2.6.28 významně přepsán; již nezaznamenává místa, kde se volá mcount() za běhu, již nepoužívá cmpxchg a, doufejme, obecně není schopný znovu způsobit takový chaos.

Přepracování vmap()

link

Jaderná paměť je obvykle alokována v relativně malých kouscích - obvykle jde o jedinou stránku naráz. Jak velikost alokace roste, uspokojení této alokace fyzicky spojitou pamětí se postupně ztěžuje. Většina jádra je proto napsána s ohledem na to, aby se vyhnulo velkým spojitým alokacím. Jsou ale momenty, kdy musí být velká oblast paměti virtuálně spojitá, ale ne nezbytně fyzicky spojitá. Jedním příkladem je alokace prostoru pro nahrávatelné moduly; jakýkoliv modul by měl žít v jediném spojitém adresovém rozsahu, ale nikoho nezajímá, jak je tento rozsah rozvržen ve fyzické RAM. Pro případy, jako je tento, poskytuje jádro sadu funkcí jako vmalloc() a vmap().

Funkce jako vmalloc() jsou dlouho známy tím, že je jejich použití poněkud drahé. Musí pracovat s jediným sdíleným (a omezeným) rozsahem adres a potřebují provádět změny v jaderné tabulce stránek. Změny tabulky stránek následně vyžadují vyprázdnění bufferu překladů adres [translation lookaside buffer, TLB], což je drahá operace na všech CPU. Jaderní vývojáři se tedy obecně pokoušeli vyhýbat používání těchto funkcí v částech jádra kritických pro výkon.

Nick Piggin si však všiml, že nás výkonnostní charakteristiky vmalloc() a přátel dostihly. Adresový prostor vmalloc() je uchováván ve spojovém seznamu [linked list] a chráněn globálním zámkem, který neškáluje moc dobře. Skutečná cena ale spočívá v uvolňování oblastí v tomto prostoru; následující vyprázdnění TLB se musí provést meziprocesorovým přerušením všech CPU, každé z nich poté musí zahodit svůj vlastní TLB. Lidé obvykle nekupují víc CPU, pokud pro ně nemají víc práce, která se na nich má spustit, takže systémy s více procesory budou obecně provádět více mapování a uvolňování v oblasti vmalloc(). Jak systémy rostou, bude v nich více globálních vyprazdňování TLB, každé z nich vyruší více procesorů. Jinými slovy množství práce roste úměrně k druhé mocnině počtu procesorů - což znamená, že to nakonec všechno padne.

Aby byly věci ještě horší, Nick má již dlouho sérii patchů, které mezi jinými hodně volají vmap(), aby mohly podporovat větší velikosti bloků ve vrstvě souborových systémů a cache stránek. Začlenění těchto patchů by významně zvýšilo čas, který systém stráví správou prostoru vmalloc(), což by nebyla dobrá věc. Zdá se tedy jako dobrý nápad nejprve opravit vmalloc(). Správu jaderných virtuálních alokací Nick skutečně v 2.6.28 vylepšil.

Prvním krokem je zbavit se spojového seznamu a odpovídajícího globálního zámku. Pro sledování rozsahů dostupného adresového prostoru se místo toho používá červeno-černý strom; nalezení vhodné oblasti lze nyní provést bez nutnosti procházet dlouhý seznam. Strom je stále chráněn globálním zámkem, což naznačuje potenciál pro problémy se škálovatelností. Aby se této záležitosti vyhnul, vytváří Nickův patch oddělené seznamy malých adresových rozsahů pro každé CPU, které lze alokovat a uvolnit bezzámkovým způsobem. Aby se využilo této vlastnosti, je potřeba volat nové funkce:

void *vm_map_ram(struct page **pages, unsigned int count, 
                 int node, pgprot_t prot);
void vm_unmap_ram(const void *mem, unsigned int count);

Volání vm_map_ram() vytvoří virtuálně spojité mapování pro dané pages (stránky). S tímto mapováním spojené datové struktury budou alokovány v daném NUMA node (uzlu); paměť bude mít ochranu specifikovanou v prot. S verzí patche, která byla začleněna do 2.6.28, lze z těchto seznamů pro jednotlivá CPU vytvořit mapování až 64 stránek.

Všimněte si, že tyto funkce nealokují paměť, pouze vytvoří virtuální mapování pro danou sadu stránek. Jsou náhradou pro vmap() a vunmap(), ne pro vmalloc() a vfree(). Je pravděpodobně možné přepsat vmalloc(), aby tento mechanismus používal, ale to se nestalo. Volání vmalloc() tedy stále potřebuje získání globálního zámku.

V této sadě je použit další trik, který využívají všechny jaderné funkce správy virtuálních adres. Nick si uvědomil, že není skutečně nutné vyprázdnit TLB v systému okamžitě poté, co je uvolněn rozsah adres. Vzhledem k tomu, že tyto adresy jsou systému vraceny zpět, žádný kód je poté nebude používat, takže nezáleží na tom, jestli TLB v procesoru obsahuje jejich neplatné mapování. Ve skutečnosti záleží pouze na tom, aby byla TLB pročištěna předtím, než se tyto adresy použijí někde jinde. Je tedy možné nechat odmapované oblasti hromadit a poté je všechny vyprázdnit jednou operací. To významně snižuje počet vyprazdňování TLB.

O kolik rychleji věci běží? Nickovy patche (začleněnou verzi lze nalézt zde) obsahují nějaké výsledky benchmarků. V umělém testu zaměřeném na předvedení rozdílu běží nový kód 25× rychleji. Změnou kódu vmap() v souborovém systému XFS tak, aby používal vm_map_ram(), byly některé zátěže zrychleny dvacetkrát. Zdá se tedy, že to funguje.

Související články

Jaderné noviny - 15. 10. 2008
Jaderné noviny - 8. 10. 2008
Jaderné noviny - 1. 10. 2008
Jaderné noviny - 24. 9. 2008

Odkazy a zdroje

Kernel coverage at LWN.net: October 22, 2008

Další články z této rubriky

Jaderné noviny – přehled za březen 2025
Jaderné noviny – přehled za únor 2025
Jaderné noviny – přehled za leden 2025
Jaderné noviny – přehled za prosinec 2024
Jaderné noviny – přehled za listopad 2024

Diskuse k tomuto článku

25.11.2008 00:40 Dworkin
Rozbalit Rozbalit vše Re: Jaderné noviny - 22. 10. 2008
Odpovědět | Sbalit | Link | Blokovat | Admin

Dekuji moc za clanek,

opet kvalitni pocteni (tedy ne, ze bych vetsinu technicky pobral:) ale clovek ma pocit , ze mu dali kounout tam kam se nikdy nema sanci dostat.

 

 

25.11.2008 09:53 Xerces
Rozbalit Rozbalit vše Re: Jaderné noviny - 22. 10. 2008

Souhlas, zvlášť o e1000e to byla hotová detektivka. :-)

25.11.2008 10:55 alium | skóre: 38 | blog: Category 1100
Rozbalit Rozbalit vše Re: Jaderné noviny - 22. 10. 2008

+1

grubber avatar 25.11.2008 19:04 grubber | skóre: 6 | blog: grubber | Břeclav / Brno
Rozbalit Rozbalit vše Re: Jaderné noviny - 22. 10. 2008

Zrovna jsem říkal to samé přítelkyni :-)

25.11.2008 21:42 Jan Přech
Rozbalit Rozbalit vše Re: Jaderné noviny - 22. 10. 2008

Jo, taky jsem to četl se zatajeným dechem. Jenom mi běhá mráz po zádech, když si představím ty maníky od Intelu, klobouk dolů.

A taky mi celé to povídání tak nějak připomnělo, jak to asi vypadalo v dobách, kdy ještě převládali opravdoví programátoři nad pojídači koláčů... :-)

 

...ham... :-D

Godot používá GNU/Hurd.
25.11.2008 00:56 trekker.dk | skóre: 72
Rozbalit Rozbalit vše Re: Jaderné noviny - 22. 10. 2008
Odpovědět | Sbalit | Link | Blokovat | Admin
již nezaznamenává místa, kde se volá mcall()
mcount()
Tato vlastnost byla již nějaký čas označena za zastaralou (ve prospěch vyvažování z uživatelského prostoru).
To by mě zajímalo proč? Kdo jiný než jádro by měl vědět, jak jsou mezi procesory rozdělena přerušení a tudíž i jak je vyrovnat
Quando omni flunkus moritati
25.11.2008 07:52 Filip Jirsák | skóre: 68 | blog: Fa & Bi
Rozbalit Rozbalit vše Překlep

A ještě jeden překlep: "není skutečné nutné" - má být s"kutečně".

25.11.2008 08:45 Zdenek
Rozbalit Rozbalit vše Re: Jaderné noviny - 22. 10. 2008
Treba proto, ze byste v jednu chvili chtel mit radeji bezchybny zvukovy vystup a to ze usb flaska bude kopirovat mensi rychlosti vas trapit nebude. A to samo jadro tezko zjisti.
25.11.2008 16:37 trekker.dk | skóre: 72
Rozbalit Rozbalit vše Re: Jaderné noviny - 22. 10. 2008
To jako že by nastala situace, že jádro nestíhá obsluhovat přerušení? Tak to je v tom počítači něco shnilého. Nehledě na to, že i jádro je schopné přijímat instrukce, jak má něco dělat, takže by nebyl takový problém říct mu "toto přerušení zpracuj vždy tady" a podobně.

Odpadlo by tím nesmyslné "Démon se z userspace zeptá jádra, jak to vypadá s přerušeními - démon se zamyslí, jak to upravit - démon řekne jádru, co má změnit - démon se uspí."
Quando omni flunkus moritati
25.11.2008 06:29 Peter Tuhársky
Rozbalit Rozbalit vše Re: Jaderné noviny - 22. 10. 2008
Odpovědět | Sbalit | Link | Blokovat | Admin

A ako dopadla utilita na opravu kariet? Spomínam si, že vývojári Intelu na nej pracovali..

25.11.2008 17:02 Jiri Kosina
Rozbalit Rozbalit vše Re: Jaderné noviny - 22. 10. 2008

Karty opravit umime snad vsechny. Pokud vlastnite nejakou ktera byla postizena timto bugem, ozvete se.

25.11.2008 09:39 Jirka
Rozbalit Rozbalit vše Re: Jaderné noviny - 22. 10. 2008
Odpovědět | Sbalit | Link | Blokovat | Admin

Ftrace je implicitne zapnuty, nebo ne?

25.11.2008 09:57 Roger
Rozbalit Rozbalit vše Re: Jaderné noviny - 22. 10. 2008
Odpovědět | Sbalit | Link | Blokovat | Admin

Taky nejdriv jedna opravicka: "Stabilní aktualizace ... jsou V době psaní tohoto článku"

 

Zaujala me uprava "Další vylepšení VM způsobuje, že systém uvolní odkládací prostor stránky poté, co je stránka načtena zpět do RAM; to efektivně zvyšuje velikost swapu, který je v systému k dispozici."

Neni to zbytecne/skoda? Nesla by naopak takova stranka pouzit spis pro rychlejsi odswapovani, kdy se nebude muset cekat na jeji opetovne ulozeni? Samozrejme v pripade, ze se na ni nezapise – v takovem pripade je zahozeni neplatne kopie na disku pochopitelne.

25.11.2008 12:14 Tom K | skóre: 22
Rozbalit Rozbalit vše Re: Jaderné noviny - 22. 10. 2008

Ono by se tezko zjistovalo, jestli se na stranku zapisuje nebo ne. A preventivni vkladani moc dlouho nepouzivanych stranek do swapu tusim existuje (takze v pripade odswapovani se stranka jen zneplatni).

echo -n "u48" | sha1sum | head -c3; echo
25.11.2008 14:40 moira | skóre: 30 | blog: nesmysly
Rozbalit Rozbalit vše Re: Jaderné noviny - 22. 10. 2008

Tezko? Neslouzi prave k tomu priznak Dirty v Page Extension Fields?

Překladač ti nikdy neřekne: "budeme kamarádi"
25.11.2008 16:24 Tom K | skóre: 22
Rozbalit Rozbalit vše Re: Jaderné noviny - 22. 10. 2008

jasne. a poznam to kdyz obsluhuju vypadek stranky? Ja mel za to, ze to poznam az po zapisu.

echo -n "u48" | sha1sum | head -c3; echo
25.11.2008 10:04 ByCzech
Rozbalit Rozbalit vše Re: Jaderné noviny - 22. 10. 2008
Odpovědět | Sbalit | Link | Blokovat | Admin

vertikální zatemněné cykly

zatemňovací

25.11.2008 16:38 trekker.dk | skóre: 72
Rozbalit Rozbalit vše Re: Jaderné noviny - 22. 10. 2008
Jo, to by asi bylo lepší.
Quando omni flunkus moritati
25.11.2008 13:48 Hynek (Pichi) Vychodil | skóre: 43 | blog: Pichi | Brno
Rozbalit Rozbalit vše Re: Jaderné noviny - 22. 10. 2008
Odpovědět | Sbalit | Link | Blokovat | Admin

Nová formátovací direktiva %pR umožní printk() a přátelům vypsat obsah struktur resource.

... printk() a podobné ... nebo ... printk() a obdobné ...

XML je zbytečný, pomalý, nešikovný balast, znovu vynalézané kolo a ještě ke všemu šišaté, těžké a kýčovitě pomalované.
progdan avatar 25.11.2008 19:27 progdan | skóre: 34 | blog: Archař | Teplice/Brno
Rozbalit Rozbalit vše Re: Jaderné noviny - 22. 10. 2008
Odpovědět | Sbalit | Link | Blokovat | Admin

Asi jeste dlouho me neprestane udivovat komplikovanost jadra a to, jak se v tom kluci muzou jeste vyznat :-)

PS: noflame, vim ze ten kod je prehlednej a podobne, ale i tak ;-) 

Collecting data is only the first step toward wisdom, but sharing data is the first step toward the community.

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.