Antworten:
Jede E / A wird von einem Systemaufruf verarbeitet, der von einem Prozess aufgerufen wird. Irgendwann wird ein solcher Systemaufruf zu einer geeigneten Gerätetreiberfunktion auf niedriger Ebene gelangen, um die eigentliche E / A-Operation auszuführen.
E / A kann schwierig sein - um tatsächlich Daten in das Gerät und aus dem Gerät zu holen, müssen möglicherweise verschiedene Schritte ausgeführt werden, in der Reihenfolge und möglicherweise mit zeitlichen Anforderungen. Wenn diese Schritte beim nächsten Versuch nicht atomar ausgeführt werden, reagiert das Gerät möglicherweise nicht, verhält sich nicht schlecht oder führt sogar zum Absturz des Systems. Diese Schritte können für jedes Gerät unterschiedlich und eindeutig sein, weshalb es so viele Gerätetreiber gibt.
Ein gut geschriebener Gerätetreiber sollte wissen, wie er mit dem Gerät umgeht, das er warten möchte. Daher sollten normalerweise keine Probleme auftreten, es sei denn, es liegt ein Treiberfehler vor, Sie verwenden den falschen Treiber für das Gerät oder das physische Gerät fällt aus.
Nachdem ich das Buch "Das Design der Unix-Betriebssysteme" von Maurice Bach gelesen habe, möchte ich diese Frage selbst beantworten.
Kurz gesagt, die Unterbrechung der E / A dient dazu, die E / A-Aufgabe so schnell wie möglich zu beenden, ohne durch Signale gestört zu werden.
Einige verwandte Kenntnisse, die ich aus dem Buch gewonnen habe:
Einige Codepfade im Kernel sind als unterbrechungsfrei markiert, hauptsächlich weil der Code einem strengen Timing entsprechen muss (um auf ein Gerät zu antworten) oder weil er etwas tut, das keine Interferenzen zulässt. Im Fall von Linux wurde der größte Teil des ersteren auf unabhängige In-Kernel-Laufflächen verschoben, und die zweiten wurden größtenteils gelöscht (ich vermute, dass sie größtenteils unter dem Druck der aktuellen Multi-CPU-Maschinen stehen). Das heißt, es ist einige Zeit her, dass ich keinen Prozess im ununterbrochenen Schlaf gesehen habe.
write(2)
darf vorzeitig zurückkehren und die tatsächlich geschriebene Byteanzahl zurückgeben, die kleiner sein kann als die als 3. Argument übergebene Pufferlänge.