GNU/Linux >> Znalost Linux >  >> Linux

Jak linuxové jádro zpracovává přerušení

Přerušení jsou nezbytnou součástí fungování moderních CPU. Například pokaždé, když stisknete klávesu na klávesnici, CPU se přeruší, takže PC může číst uživatelský vstup z klávesnice. To se děje tak rychle, že si nevšimnete žádné změny nebo zhoršení uživatelského dojmu.

Kromě toho klávesnice není jedinou součástí, která může způsobit přerušení. Obecně existují tři typy událostí, které mohou způsobit přerušení CPU:Hardwarová přerušení , softwarová přerušení a výjimky . Než se pustím do různých typů přerušení, definuji některé pojmy.

Definice

Požadavek na přerušení (IRQ ) je požadováno programovatelným řadičem přerušení (PIC ) s cílem přerušit CPU a provést rutinu služby přerušení (ISR ). ISR je malý program, který zpracovává určitá data v závislosti na příčině IRQ. Normální zpracování je přerušeno, dokud ISR neskončí.

V minulosti byly IRQ zpracovávány samostatným mikročipem – PIC – a I/O zařízení byla připojena přímo k PIC. PIC spravoval různá hardwarová IRQ a mohl hovořit přímo s CPU. Když došlo k IRQ, PIC zapsal data do CPU a vyvolal požadavek na přerušení (INTR ) připnout.

V dnešní době jsou IRQ řešeny pokročilým programovatelným řadičem přerušení (APIC ), který je součástí CPU. Každé jádro má svůj vlastní APIC.

Typy přerušení

Jak jsem již zmínil, přerušení lze rozdělit do tří typů v závislosti na jejich zdroji:

Hardwarová přerušení

Když chce hardwarové zařízení CPU sdělit, že určitá data jsou připravena ke zpracování (např. zadání z klávesnice nebo když paket dorazí na síťové rozhraní), odešle IRQ, aby signalizoval CPU, že data jsou dostupná. To vyvolá specifické ISR, které bylo zaregistrováno ovladačem zařízení během startu jádra.

Softwarová přerušení

Další zdroje pro Linux

  • Cheat pro příkazy Linuxu
  • Cheat sheet pro pokročilé příkazy systému Linux
  • Bezplatný online kurz:Technický přehled RHEL
  • Síťový cheat pro Linux
  • Cheat sheet SELinux
  • Cheat pro běžné příkazy pro Linux
  • Co jsou kontejnery systému Linux?
  • Naše nejnovější články o Linuxu

Při přehrávání videa je nezbytné synchronizovat přehrávání hudby a videa, aby se rychlost hudby neměnila. Toho je dosaženo prostřednictvím softwarového přerušení, které je opakovaně spouštěno přesným systémem časovače (známým jako jiffies). Tento časovač umožňuje synchronizaci vašeho hudebního přehrávače. Softwarové přerušení lze také vyvolat speciální instrukcí pro čtení nebo zápis dat do hardwarového zařízení.

Softwarová přerušení jsou také zásadní, když je vyžadována funkce v reálném čase (jako například v průmyslových aplikacích). Další informace o tom najdete v článku Linux Foundation Úvod do Linuxu v reálném čase pro embedded vývojáře .

Výjimky

Výjimkou je typ přerušení, o kterém pravděpodobně víte. Když CPU provede příkaz, který by vedl k dělení nulou nebo k chybě stránky, jakékoli další provádění se přeruší. V takovém případě budete o tom informováni vyskakovacím oknem nebo zobrazením chyby segmentace (vyřazení jádra) ve výstupu konzole. Ale ne každá výjimka je způsobena chybnou instrukcí.

Výjimky lze dále rozdělit na Chyby , Pasti a Přeruší .

  • Chyby: Chyby jsou výjimkou, kterou může systém opravit, například když se proces pokouší o přístup k datům z paměťové stránky, která byla odložena na pevný disk. Požadovaná adresa je v adresovém prostoru procesu a přístupová práva jsou správná. Pokud se stránka nenachází v paměti RAM, je zvýšeno IRQ a spustí se obslužný nástroj výjimky chyby stránky pro načtení požadované stránky paměti do paměti RAM. Pokud je operace úspěšná, provádění bude pokračovat.
  • Pasti: Pasti se používají hlavně pro ladění. Pokud v programu nastavíte bod přerušení, vložíte speciální instrukci, která způsobí, že spustí past. Past může spustit přepínač kontextu, který vašemu debuggeru umožní číst a zobrazovat hodnoty místních proměnných. Provádění může pokračovat poté. Pasti jsou také výchozím způsobem provádění systémových volání (jako je zabíjení procesu).
  • Zruší: Přerušení jsou způsobena selháním hardwaru nebo nekonzistentními hodnotami v systémových tabulkách. Přerušení nehlásí umístění instrukce, která způsobila výjimku. Toto jsou nejkritičtější přerušení. Přerušení vyvolá systémovou obslužnou rutinu výjimek přerušení , který ukončí proces, který to způsobil.

Začněte pracovat

IRQ jsou seřazeny podle priority ve vektoru na APIC (0 =nejvyšší priorita). Prvních 32 přerušení (0–31) má pevnou sekvenci, která je specifikována CPU. Jejich přehled najdete na stránce Výjimky OsDev. Následná IRQ mohou být přiřazena odlišně. Tabulka deskriptoru přerušení (IDT ) obsahuje přiřazení mezi IRQ a ISR. Linux pro přiřazení definuje vektor IRQ od 0 do 256.

Chcete-li vytisknout seznam registrovaných přerušení ve vašem systému, otevřete konzolu a zadejte:

cat /proc/interrupts

Měli byste vidět něco takového:

Zleva doprava jsou sloupce:Vektor IRQ, počet přerušení na CPU (0 .. n ), zdroj hardwaru, informace o kanálu zdroje hardwaru a název zařízení, které způsobilo IRQ.

Ve spodní části tabulky jsou některá nenumerická přerušení. Jsou to přerušení specifická pro architekturu, jako je přerušení místního časovače (LOC ) na IRQ 236. Některé z nich jsou specifikovány ve vektorovém rozložení IRQ pro Linux ve zdrojovém stromu jádra Linuxu.

Chcete-li získat živé zobrazení této tabulky, spusťte:

watch -n1 "cat /proc/interrupts"

Závěr

Správné zpracování IRQ je nezbytné pro správnou interakci hardwaru, ovladačů a softwaru. Naštěstí linuxové jádro odvádí opravdu dobrou práci a běžný uživatel PC si stěží ničeho všimne na celém zpracování přerušení v jádře.

To může být velmi komplikované a tento článek poskytuje pouze stručný přehled tohoto tématu. Dobrými zdroji informací pro hlubší ponor do tématu jsou Linux Inside eBook (CC BY-NC-SA 4.0) a úložiště Linux Kernel Teaching.


Linux
  1. Linux – Jak povolit prostory uživatelských jmen v jádře? (pro nepřivilegované `unshare`.)?

  2. Jak vyčistit mezipaměti používané linuxovým jádrem

  3. Jak vypočítat využití CPU procesu pomocí PID v Linuxu z C?

  1. Jak linuxové jádro určuje pořadí volání __init?

  2. Jak zkontrolovat HZ v terminálu?

  3. Jak kódovat modul jádra Linuxu?

  1. Jak se Linux dostal k sálovému počítači

  2. Životní cyklus testování linuxového jádra

  3. Jak se v Linuxu řeší přerušení?