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