Hlavní navigace

Co před námi tají /proc (5)

26. 7. 2001
Doba čtení: 4 minuty

Sdílet

Dnešní díl bude o trojici souborů kolem periferií, dozvíte se tedy (snad i něco nového) o přerušeních, vstupně/výstupních portech a mapované paměti pro ovládání periferií.

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:

Cloud 24 - tip 1

  .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>/ker­nel/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 :)

Byl pro vás článek přínosný?