Gerätetreibern unter Linux stehen diverse Funktionen zur Allokation und Freigabe von Speicherblöcken mit festgelegten Eigenschaften und unterschiedlicher Granularität zur Verfügung.
|
Nach Tab. 3.2 können Seiten von Speicherbereichen, die mit vmalloc() allokiert wurden, frei im physischen Speicher verteilt sein, solange sie virtuell fortlaufend sind. Die virtuellen Speicherblöcke können aufgrund dieser Eigenschaft nicht für DMA verwendet werden.
Kernel Memory hingegen kann für DMA-Transfers genutzt werden. Somit müssen die verbleibenden drei Gruppen Blöcke allokieren, die fortlaufend im physischen Adreßraum auch über Seitengrenzen hinaus sind. Weiterhin muß ein schneller Weg existieren, eine virtuelle in eine physische Adresse und umgekehrt umzusetzen, da Peripheriegeräte nicht mit virtuellen Adressen umgehen können.
Ich werde hier nicht näher auf die slabs eingehen, welche eine spezielle Funktionalität zur Verfügung stellen, die selten direkt genutzt wird. Slabs werden in [Bon94] genau beschrieben, hier nur soviel: Slabs implementieren einen Objekt-Cache, sind also eine Optimierung für gleichförmige Speicherallokationen3.3.
Da die Schnittstelle zum Speichermanagement von Linux vorgegeben wird, bleibt nun noch zu klären, welchen Weg das DDE einschlägt um die genannten Anforderungen zu erfüllen.