Zeichenlistenstruktur
Zeicheneinheitentreiber und andere zeichenorientierte Unterstützung, die eine zeichenorientierte Ein-/Ausgabe durchführen kann, können implementiert werden, indem eine allgemeine Gruppe von Services und Datenpuffern verwendet wird, um Zeichen in Form von Zeichenlistenzu verarbeiten. Ein Zeichenliste ist eine Liste oder Warteschlange mit Zeichen. Einige Routinen stellen Zeichen in eine Liste und andere entfernen die Zeichen aus der Liste.
Zeichenlisten, bekannt als Clists, enthalten einen Klist -Header und eine Kette von einem oder mehreren Datenpuffern, die als Zeichenblöcke bezeichnet werden.. Durch das Einreihen von Zeichen in eine Warteschlange wird Speicherbereich (Zeichenblöcke) aus dem allgemeinen Pool zugeordnet und der Zeichenblock wird mit der Datenstruktur verknüpft, die die Zeichenwarteschlange definiert. Wenn Sie Zeichen aus einer Warteschlange abrufen, wird der entsprechende Speicherbereich an den Pool zurückgegeben.
Eine Zeichenliste kann zur Kommunikation zwischen der oberen und unteren Hälfte eines Zeichentreibers verwendet werden. Der Header Klist und die Zeichenblöcke, die von diesen Routinen verwendet werden, müssen im Speicher fixiert werden, da auf sie in Interruptumgebungzugegriffen wird.
Benutzer der Zeichenlistenservices müssen (normalerweise in der ddopen -Routine des Einheitentreibers) die Anzahl der Zeichenblöcke registrieren, die gleichzeitig verwendet werden sollen. Dadurch kann der Kernel die Anzahl der fixierten Zeichenblöcke im Zeichenblockpool verwalten. Wenn die Verwendung beendet wird (z. B. wenn der Einheitentreiber geschlossen wird), sollte die verwendete Routine ihre Registrierung von Zeichenblöcken entfernen. Der Pincf -Kernel-Service ermöglicht die Registrierung für die Zeichenblockverwendung.
Der Kernel stellt vier Services zum Abrufen von Zeichen oder Zeichenblöcken aus einer Zeichenliste bereit: die Kernel-Services Getc, Getcb, Methode 'getcbp'und Getcx . Es gibt auch vier Services, die Zeichenlisten Zeichen oder Zeichenblöcke hinzufügen: die Kernel-Services Putc, Putcb, Putcbpund Putcx . Die GetCF -Kernel-Services ordnet einen freien Zeichenblock zu, während der Putcf -Kernelservice einen Zeichenblock an die Liste der freien Blöcke zurückgibt. Darüber hinaus gibt der Putcfl -Kernel-Service eine Liste der Zeichenpuffer an die Liste der freien Puffer zurück. Der Wartestatusfrei -Kernelservice bestimmt, ob Zeichenblöcke in der Liste der freien Blöcke enthalten sind, und wartet auf einen, wenn keiner verfügbar ist.
Zeichenliste verwenden
Für jede Zeichenliste, die Sie verwenden, müssen Sie eine Klist -Headerstruktur zuordnen. Diese clist -Struktur ist in der Datei /usr/include/sys/cblock.h definiert.
Sie müssen sich nicht um die Pflege der Felder im Klist -Header kümmern, da die Zeichenlistenservices dies für Sie tun. Sie sollten jedoch diec_ccZählfeld auf 0 und beide Zeichenblockzeiger (c_cfundc_cl) auf null, bevor der Klist -Header zum ersten Mal verwendet wird. Die Struktur Klist definiert diese Felder.
Jeder Puffer in der Zeichenliste ist eine cblock -Struktur, die auch in der Datei /usr/include/sys/cblock.h definiert ist.
Ein Zeichenblockdatenbereich muss nicht vollständig mit Zeichen gefüllt sein. Die Felder C_first und _Letzter sind nullbasierte Offsets im Array C_data , das die Daten enthält.
Für Zeichenpuffer ist nur eine begrenzte Speicherkapazität verfügbar. Alle Zeichentreiber nutzen diesen Pufferpool gemeinsam. Daher müssen Sie die Anzahl der Zeichen in Ihrer Zeichenliste auf einige hundert begrenzen. Wenn die Einheit geschlossen wird, sollte der Einheitentreiber sicherstellen, dass alle Zeichenlisten gelöscht werden, damit die Puffer an die Liste der freien Puffer zurückgegeben werden.