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_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. |