Již tradičně opět výpis základního adresáře /proc. Tečka před názvem znamená, že jsme daný soubor/adresář již probrali:
.840 .devices kcore modules stat ide/ .842 .dma kmsg mounts swaps irq/ .847 .execdomains ksyms mtrr uptime net/ .848 .filesystems loadavg partitions version nv/ .apm interrupts locks pci bus/ sys/ .cmdline iomem meminfo self@ driver/ sysvipc/ .cpuinfo ioports misc slabinfo fs/ tty/
Na začátek si musím trochu sypat popel na hlavu. Posledních pár dílů jsem vás trochu zanedbával, času bylo pořád míň a míň, ale pokusím se s tím něco udělat. Putování po horách už jsem si užil dost, tak budu mít nyní na články (doufám) víc času. Tak co nás čeká tentokrát:
- interrupts
-
Obsah souboru na použitém počítači. Pro ty, co nečtou od začátku, nebo již pozapomněli (obojí je škoda), opakuji, že se jedná o PIII na Abitu VP6. Výbavu je možno vyčíst z výpisu:
CPU0 0: 460943 IO-APIC-edge timer 1: 21161 IO-APIC-edge keyboard 2: 0 XT-PIC cascade 9: 460757 IO-APIC-level nvidia 10: 0 IO-APIC-level ESS Solo1, eth0 12: 83236 IO-APIC-edge PS/2 Mouse 14: 9901 IO-APIC-edge ide0 15: 5 IO-APIC-edge ide1 NMI: 0 ERR: 0
Jak je z názvu souboru patrné, jedná se o informace o využití přerušení. V prvním sloupci je číslo přerušení, v Dalším počet obsloužených přerušení pro jednotlivé procesory (zde pouze jeden – zatím :). Následuje typ obsluhy a ovladač, který obsluhu provádí. Poslední dva řádky určují počet nemaskovatelných přerušení a chyb při obsluhách přerušení.
Nejprve trochu teorie. Desky pro více procesorů (a možná i některé novější jednoprocesorové) obsahují vylepšený řadič přerušení – APIC (Advanced Programmable Interrupt Controller), v Linuxu nazývaný IO-APIC. Jedná se o systém doručování přerušení k procesoru/ům a také příslušný hardwarový prvek. Oproti klasickému řadiči přerušení umí obsluhovat více procesorů (každý z procesorů může obsluhovat přerušení) a také zvládá například sdílení jednoho přerušení více zařízeními (v našem případě přerušení 10 se zvukovkou a síťovkou).
Zbývá ještě říci pár slov o tom, co to je nemaskovatelné přerušení. Obecně lze přerušení rozdělit na několik typů. Prvním typem jsou přerušení procesoru. Jedná se o způsob oznámení fatálních chyb za běhu počítače. Příkladem buďtěž dělení nulou, chybná instrukce, výpadek stránky a další. Většina z nich způsobuje neopravitelnou chybu (někdy v rámci procesu – dělení nulou v uživatelském kódu, někdy celého jádra při chybě v jeho kódu). Jiné (jako výpadek stránky) jsou standardně obslouženy jádrem a nemusí vést k chybě (výpadek stránky vede k chybě SIGSEGV, pokud ho nelze ošetřit). Dalším typem jsou přerušení pro kontakt s periferiemi. Jsou vyvolávána signálem INTR a zpracovávána procesorem za účasti řadiče přerušení. Řadič řeší například priority přerušení, zachytávání do front(y) a další. Tento typ přerušení je popisován v souboru interrupts. Posledním typem jsou takzvaná softwarová přerušení vyvolávaná instrukcí INT. Ta se používají například jako prostředek pro volání služeb jádra. Z důvodů zachování konzistentního stavu operačního systému je možno v kritických situacích pomocí instrukce CLI (x86) zakázat obsluhu přerušení. Existují ale situace, které je třeba řešit okamžitě (chyba paměti atd.), proto exituje přerušení NMI, které nelze zakázat (jinak též maskovat). To slouží pro oznamování právě těchto chybových stavů. V současném jádře (2.4.5) jsou rozpoznávány chyby 0×80 a 0×40, tedy chyba parity paměti a chyba IO_CHECK. Další chyby mohou být případně rozpoznávány ovladači periferních zařízení na sběrnici MCA (MicroChannel).
Posledním využitím přerušení NMI je takzvaný NMI Watchdog. Je to způsob, jak ladit situace úplného zatuhnutí systému. Generováním nemaskovatelných přerušení lze jistým způsobem přimět systém (občas) k nějaké činnosti. Více informací naleznete v dokumentaci k jádru v souboru mni_watchdog.txt.
A teď o tom, co konkrétně náš výpis říká. Počítač obsahuje pouze jeden procesor (přesněji přerušení obsluhuje pouze jeden procesor). V počítači máme 16 linek přerušení (hardwarových) a prozatím jsme se obešli bez chyby. Počet nemaskovatelných přerušení (dále NMI) je rovněž nulový. Jde o čítač všech přerušení procesoru číslo 0×02. V předposledním sloupci je možné nalézt tři typy přerušení. XT-PIC je standardní řadič přerušení a dnes je používán téměř výhradně pro kaskádové spojení jednotlivých prvků řadiče (podobně jako DMA řadič). Potom tu máme IO-APIC přerušení obsluhovaná řadičem APIC. Ta jsou buď edge, což znamená samostatné přerušení pro každé zařízení (IDE disky) s poměrně složitým ovládáním handleru, nebo level, což je kromě jiného přerušení pro PCI sběrnice s možností sdílení přerušení. Základní rozdíl je v tom, že obsluha přerušení typu edge musí dospět do určité své části (edge), než je možno jednoduže zakázat další přerušení téhož typu. Pro podrobnosti odkazuji na soubory arch/<xxx>/kernel/io_apic.c a další z něj vyplývající. Názvy ovladačů zařízení jsou snad dostatečně vysvětlující, a tak jen dodám, že počet přerušení u přerušení časovače je počet tiků časovače od spuštění počítače s přetočením na hodnotě max(unsigned int). Také si lze udělat obrázek o využití zbývajících zařízení. Je vidět, že se nepoužily (od spuštění) zvukovka ani síťovka a disky na ide1 nejsou připojeny (případně využívány, ale to by těch přerušení bylo asi přece jen víc).
No trošku jsem se rozšoupl, tak iomem a ioports přesunu do dalšího dílu. A místo závěrečného proslovu se do něj radši rovnou pustím :)