2010-11-21 3 views
1

Ist es möglich, ein Linux (2.6) Block-Gerät (z. B. ein Loopback-Gerät) mit einer ungeraden Größe zu erstellen? Ich konnte es nicht schaffen. losetup scheint auf 512-Byte-Grenze zu runden. Die ubd Geräte von User-Mode Linux ubd Geräten scheinen bis zu 512 Byte Grenze zu runden. In struct request haben wir sector_t __sector für den Block-Offset für Lese-/Schreiboperationen.Linux-Block-Gerät mit Odd (nicht gerade) Größe

Ich stelle diese Frage nur für Bildungszwecke. Ich kann die Grenze von 512 Byte bewältigen, aber ich bin immer noch daran interessiert, ob es möglich wäre, sie zu umgehen. In dieser Frage interessiere ich mich nicht für andere Abstraktionsschichten (wie zum Beispiel normale Dateien oder Zeichengeräte).

Antwort

1

Nein. Die Linux 2.6-Block-Schicht versteht nichts kleiner als 512 Bytes. Alles kleinere (insbesondere keine Zweierpotenz) würde eine große Menge Code neu schreiben müssen.

1

Dies ist, was ein Blockgerät anstelle eines Zeichengeräts macht: die Blockgranularität. Die Dichotomie existiert, weil es wesentlich effizienter ist, reale Hardware zu modellieren, die einen Block zu einer Zeit als eine Abstraktion arbeitet, die auch Blöcke behandelt. Andernfalls würde jede Operation zu einer viel teureren Berechnung werden.

Der Weg, um es zu umgehen, ist, wie Sie erwähnen, ein zeichenorientiertes Gerät oder Abstraktion zu verwenden. Dies ist zentral für das Unix-Gerätemodell: Alles ist eine Reihe von Oktetten, mit Ausnahme der Dinge, die nur als eine Einheit virtualisiert werden können.

+0

Mir geht es gut mit der Block Granularität - aber damit könnten wir immer noch eine seltsame Gerätegröße haben: einfach den letzten Block kleiner als die anderen machen. Der Fokus auf meine Frage ist jedoch nicht philosophisch: Ich bin an der Implementierung des Linux Kernel 2.6 interessiert. – pts

+0

Genau das meinte ich mit "teureren Berechnungen". Umgeben Sie jeden Zugang mit "Ist das der letzte Teilblock?" Prädikate sind teuer, wenn sie auf jede IO-Operation angewendet werden. – msw