Buf-Struktur

Zweck

Beschreibt die Pufferung von Datenübertragungen zwischen einem Programm und der Peripherieeinheit

Einführung in Kernelpuffer

Bei Blockeinheiten werden Kernelpuffer verwendet, um Datenübertragungen zwischen einem Programm und dem Peripheriegerät zu puffern. Diese Puffer werden in Blöcken von 4096 Byte zugeordnet. Jeder Speicherblock ist zu einem beliebigen Zeitpunkt Mitglied einer von zwei verknüpften Listen, die der Einheitentreiber und der Kernel verwalten:

Auflisten Beschreibung
Verfügbare Pufferwarteschlange (avlist) Eine Liste aller Puffer, die verwendet werden können Diese Puffer enthalten keine Daten, die auf die Übertragung zu oder von einer Einheit warten.
Belegte Pufferwarteschlange (blist) Eine Liste aller Puffer, die Daten enthalten, die auf die Übertragung zu oder von einer Einheit warten.

Jedem Puffer ist ein Pufferheader zugeordnet, der als Buf -Struktur bezeichnet wird und auf ihn verweist. Jeder Pufferheader besteht aus mehreren Teilen:

  • Informationen zum Block
  • Flags zum Anzeigen von Statusinformationen
  • Besetztliste Vorwärts-und Rückwärtszeiger
  • Verfügbare Vorwärts-und Rückwärtszeiger

Der Einheitentreiber verwaltet dieav_forwundav_backZeiger (für die verfügbaren Blöcke), während der Kernel dieb_forwundb_backZeiger (für die belegten Blöcke).

Buf-Strukturvariablen für blockorientierte Ein-/Ausgabe

Die Struktur buf , die in der Datei /usr/include/sys/buf.h definiert ist, enthält die folgenden Felder:

Element Beschreibung
b_flags Markierungsbits. Der Wert dieses Felds wird durch logisches Verknüpfen von 0 oder mehr der folgenden Werte mit OR erstellt:
B_Schreiben
Diese Operation ist eine Schreiboperation.
B_READ (FEHLERHAFT)
Bei dieser Operation handelt es sich nicht um eine Schreiboperation, sondern um eine Leseoperation für Daten.
B_DONE
Die Ein-/Ausgabe für den Puffer wurde ausgeführt, sodass die Pufferinformationen aktueller sind als andere Versionen.
B_FEHLER
Ein Übertragungsfehler ist aufgetreten und die Transaktion wurde abgebrochen.
B_BUSJ
Der Block befindet sich nicht auf der Liste der freien Blöcke.
B_INFLIGHT
Diese E/A-Anforderung wurde zur Verarbeitung an den physischen Einheitentreiber gesendet.
B_AGE
Da die Daten wahrscheinlich nicht bald wiederverwendet werden, ziehen Sie diesen Puffer für die Wiederverwendung vor. Dieses Flag legt nahe, dass der Puffer am Anfang und nicht am Ende der Liste der freien Puffer steht.
B_ASYNC
Für diesen Block wird asynchrone Ein-/Ausgabe ausgeführt. Wenn die Ein-/Ausgabe abgeschlossen ist, den Block freigeben.
B_DELWRI
Der Inhalt dieses Puffers muss noch ausgeschrieben werden, bevor der Puffer wiederverwendet werden kann, auch wenn sich dieser Block in der Liste freier Blöcke befindet. Dies wird von der Subroutine Schreiben verwendet, wenn das System erwartet, dass bald wieder in denselben Block geschrieben wird.
B_NOHIDE (AUSBLENDEN)
Gibt an, dass die Datenseite während der DMA-Übertragung (Direct Memory Access) nicht ausgeblendet werden soll.
B_SETMOD
Ermöglicht einem erweiterten E/A-Dateisystem, dass eine Seite als geändert betrachtet wird.
B_STALE
Die Daten stehen aufgrund eines E/A-Fehlers in Konflikt mit den Daten auf der Platte.
B_ XREADONLY
Gibt eine schreibgeschützte Seite in der Pufferliste des externen Pagers an
B_MORE_DONE
Wenn diese Option festgelegt ist, gibt sie dem Empfänger dieser Buf -Struktur an, dass weitere Strukturen in der IODONE -Ebene in die Warteschlange eingereiht werden. Dies ermöglicht Einheitentreibern, alle abgeschlossenen Anforderungen zu verarbeiten, bevor neue Anforderungen verarbeitet werden.
B_AUFTEILEN
Ist dieser Parameter festgelegt, gibt er an, dass die Übertragung an einer beliebigen Stelle im Datenpuffer beginnen kann.
b_forw Der Vorwärtszeiger für belegte Blöcke.
b_back Der rückwärts belegte Blockzeiger.
av_forw Der Vorwärtszeiger für eine Treiberanforderungswarteschlange.
av_back Der Rückwärtszeiger für eine Treiberanforderungswarteschlange.
b_iodone Jeder, der die Strategie -Routine aufruft, muss dieses Feld so definieren, dass es auf seine ausgeführte E/A-Routine verweist. Diese Routine wird auf INTIODONE Unterbrechung -Ebene aufgerufen, wenn die Ein-/Ausgabe abgeschlossen ist.
b_dev Die Haupt-und Nebeneinheitennummer.
b_bcount Die Bytezahl für die Datenübertragung.
b_un.b_addr Die Speicheradresse des Datenpuffers.
b_blkno Die Blocknummer auf dem Gerät
b_resid Datenvolumen, das nach einem Fehler nicht übertragen wurde.
b_event Anker für Ereignisliste.
b_xmemd Speicherübergreifender Deskriptor.