Betriebssystem und Hardware

Warum wird beim Lesen eines Statusregisters eines Geräts per Memory-Mapped I/O wie oben volatile angegeben und der Bereich als nicht gecacht konfiguriert?

#define STATUS (*(volatile unsigned int *)0x40001000)
while ((STATUS & 1) == 0)
    ;   /* 装置の準備ができるまで待つ */
  1. AWeil volatile die Leseoperationen auf eine einzige zusammenfasst und es schneller wird
  2. BWeil beim Cachen der Wert des Geräteregisters automatisch auf 0 zurückgesetzt wird
  3. CWeil das Gerät den Wert ändert und eine Änderung übersehen würde, wenn nicht jedes Mal tatsächlich neu gelesen wird
Antwort und Erläuterung anzeigen

Antwort: C. Weil das Gerät den Wert ändert und eine Änderung übersehen würde, wenn nicht jedes Mal tatsächlich neu gelesen wird

Der Wert eines Geräteregisters wird vom Gerät unabhängig vom Programm umgeschrieben. Ohne volatile kann der Compiler annehmen, dass sich der Wert in der Schleife nicht ändert, und nur einmal lesen, wodurch Code entsteht, der ewig wartet. Würde der Bereich gecacht, läse die CPU weiter den veralteten Wert im Cache, und Änderungen des Geräts blieben unsichtbar. volatile verhindert, dass Lesezugriffe weggelassen werden, und wirkt dem Zusammenfassen zu einem Zugriff entgegen. Dass der Wert durch Cachen 0 wird, trifft nicht zu.

Dieses Thema üben Zur Themenseite

Weitere Fragen zu Betriebssystem und Hardware

  1. In welchem Fall ist Polling, bei dem die CPU den Gerätezustand ohne Interrupts wiederholt abfragt, vorteilhaft?
  2. Was muss bei einem System, in dem die Hardware die Cache-Kohärenz nicht gewährleistet (nicht kohärent), vor dem Lesen von per DMA vom Gerät in den Hauptspeicher geschriebenen Daten durch die CPU von der Software erledigt werden?
  3. Welche Hauptaufgabe der IOMMU ist richtig?
  4. Welche Aufgabe eines Gerätetreibers ist richtig?
  5. Was ist der Hauptgrund dafür, dass in üblichen Betriebssystemen Anwendungen Geräteregister nicht direkt lesen und schreiben können?

Vergleiche zu diesem Thema