Autor Thema: IRQs im Kernel  (Gelesen 5811 mal)

oern

  • Beiträge: 44
    • Profil anzeigen
Gespeichert
« am: 01. May 2013, 14:41 »
Hallo,

ich habe mal wieder einen Kernel begonnen (modularer Monolith). Dabei habe ich mir folgendes Problem überlegt:
Der Kernel nicht unterbrechbar ist, d.h. alle Interrupts sind in der IDT als "Interrupt Gate" eingetragen. Ein Programm ruft eine Kernelfunktion per Syscall auf (danach sind HW-Interrupts deaktiviert). In dieser Kernelfunktion (z.B. Lesen aus einer Datei) muss auf einen Block eines Massenspeichermediums zugegriffen werden, der nicht im Cache ist. Dies soll per DMA geschehen, d.h. der Storage-Controller löst nach Abschluss des Transfers einen IRQ aus. Wie soll der Kernel davon erfahren?
Die Lösung wäre natürlich, zumindest den Syscall und eventuell die IRQs unterbrechbar zu machen, aber das erfordert ja sehr viel Locking (was für SMP aber ja eh notwendig wird). Gibt es einfachere Lösungen oder existiert dieses Problem überhaupt nicht?

oern

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 01. May 2013, 16:42 »
Du willst sowieso nicht im Kernel warten, bis die Platte fertig ist, die braucht nämlich ewig. Stattdessen schickst du den Request ab und schedulst dann den nächsten Task, der durch den Interrupt auch wieder ganz normal unterbrochen werden kann.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

oern

  • Beiträge: 44
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 01. May 2013, 17:03 »
Oh... Ok, Danke. Da hätte ich auch selbst drauf kommen müssen.
Und falls der nächste oder übernächste Task irgendwo im Kernel sein sollte, programmiert man ein Timeout, oder? Langfristig (falls es dazu kommen sollte; siehe http://xkcd.com/844/), sollte ich mir eh Gedanken machen, wo ich Locks brauche, besonders bei der Taskverwaltung und der virtuellen Speicherverwaltung scheint das recht kompliziert zu werden.

oern

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 02. May 2013, 09:15 »
Du meinst, dass er im Kernel ist (und Interrupts deswegen aus sind) während der Interrupt kommt? Dann wird der Interrupt ausgelöst sobald IF wieder gesetzt ist, d.h. direkt nach dem nächsten Wechsel in den Userspace. Und weil du nie im Kernel blockierst, ist das immer so ziemlich sofort. Oder falls du später doch mal Interrupts in Teilen des Kernels zulässt, darfst du nie in denen Bereichen blockieren, in denen Interrupts deaktiviert sind.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

 

Einloggen