CARDSPEED - Kartenleser und Speicherkarten

Cluster-Ausrichtung und Karten-Performance

In meinem  Artikel über das Formatieren  (im Moment nur als Englische Fassung) habe ich bereits die  Cluster-Ausrichtung  erwähnt. In den meisten Fällen muss man sich darüber aber keine Gedanken machen: Viele Karten-Standards - ganz besonders SD und SDHC - haben bereits strenge Regeln, wie die Karte formatiert werden soll, um die Cluster auszurichten. Viele Karten werden durch nicht ausgerichtete Cluster kaum beeinflusst, aber es scheint ein paar Ausnahmen zu geben.

Um die naheliegende Frage zu beantworten: Ich habe keine speziellen Tools zum Formatieren, ich bearbeite die Partitionstabelle und die Sektoren des Dateisystems mit einem Hex-Editor.

Warum ist die Cluster-Ausrichtung so Wichtig?

Flash-Speicherkarten sind Random-Access Speichermedien mit einer Sektorgröße von 512 Bytes. Aber das ist nur die logische Repräsentation nach außen. Flash-Speicher kann Byte für Byte ausgelesen werden, muss aber vor dem Schreiben gelöscht werden. Dieser Löschvorgang wirkt auf eine gesamte Speicherseite, die damit "blitzartig" gelöscht wird, daher der Name Flash-Speicher. Selbst wenn man nur ein einziges Bit ändern möchte, muss eine Speicherseite gelesen, gelöscht, und verändert zurückgeschrieben werden. Die Größe solch einer Seite entspricht einer Zweierpotenz größer oder gleich 512 Bytes, meinen Beobachtungen und Messungen zufolge in den meisten Fällen wohl ein Wert im Bereich von 4kB bis 32kB.

Wenn die Schreibgröße kleiner als die Seitengröße ist, muss trotzdem die gesamte Speicherseite geflasht und zurückgeschrieben werden. Wenn ein Schreibvorgang über eine Seitengrenze hinweg erfolgt, müssen beide Speicherseiten gelesen, geflasht, und zurückgeschrieben werden. Der Speicher-Controller könnte zwar aufeinanderfolgende nicht-ausgerichtete Schreibvorgänge zu einer Folge von ausgerichteten Schreibvorgängen kombinieren, aber es scheint Controller zu geben, bei denen die Schreibperformance durch nicht-ausgerichtete Schreibvorgänge stark leidet.

Dies bedeutet, dass man die beste Leistung erhält, wenn Cluster 2 (der erste Cluster im Dateisystem) an einer Seitengrenze ausgerichtet ist, und die Clustergröße der Seitengröße oder einem ganzzahligen Vielfachen davon entspricht.

Auslegung der Dateisysteme auf Speicherkarten

Außer für CompactFlash scheint es bestimmte Regeln zu geben, wie eine Speicherkarte formatiert werden soll. Die folgende Aufstellung basiert auf einer detaillierten Analyse der Dateisysteme von ungefähr 100 Speicherkarten. Ich habe keinen Zugriff auf die entsprechenden Spezifikationen, die Dokumente scheinen nur den Mitgliedern der jeweiligen Speicherkarten-Organisation zugänglich zu sein.

Die Basis ist natürlich die FAT-Spezifikation von Microsoft (fatgen103.doc). Dieses Dokument beschreibt aber nur die empfohlenen Standardkonfigurationen, und weist auf die Risiken hin, wenn von dieser Konfiguration im Rahmen der Spezifikation abgewichen wird.

CompactFlash Karten
Dies sind die einzigen Karten ohne besondere oder seltsame Regeln. Die meisten CF-Karten haben einen "klassischen" Partitionsstart bei CHS 0/1/1, und Karten mit mehr als 256MB verwenden ein Mapping von C/16/63. In vielen Fällen ist am Ende ein kleiner ungenutzer Bereich aufgrund von Extended Translation und/oder der alten (und seltsamen) "Last Cylinder" Regel. Normalerweise haben alle Dateisystem-Parameter ihre Standard-Werte, und Cluster 2 ist mehr oder weniger gut ausgerichtet. Mit einem Partitions-Anfang von LBA 63 und einem FAT16-Dateisystem mit Standard-Werten beginnt Cluster 2 an einer 1kB-Grenze.
SD Karten
Durch das Register-Layout könnten die meisten SD Karten auf C/16/32 gemappt werden. Gewöhnlich wird aber LBA mit einem Mapping von C/255/63 verwendet, was in den meisten Fällen zu einem ungeraden Partitions-Ende führt (also keine Zylindergrenze). Der Startpunkt der Partition ist auf einen bestimmten Wert gelegt, so dass Cluster 2 in den meisten Fällen bei Adresse 0x40000, 0x50000 oder 0x60000 beginnt, also einer 64kB-Grenze.
SDHC Karten
Es sieht so aus, als hätten SDHC Karten den Beginn der Partition auf LBA 8192 (0x400000) gesetzt. Durch erhöhen von BPB_RsvdSecCnt von 32 (der Standardwert für FAT32) auf einen viel höheren Wert, wird die Adresse von Cluster 2 auf die Adresse 0x800000 verschoben, ein Offset von 8MB. Die Clustergröße beträgt dabei 32kB.
MMC
MMC verwenden ein Mapping von C/16/32 oder Extended Translation mit einem Partitionsbeginn bei CHS 0/1/1 (LBA 32). Bei MMC mit 512MB oder weniger ist BPB_RsvdSecCnt etwas höher, um Cluster 2 an die Adresse 0x48000 zu verschieben. Für MMC mit 1GB oder oder 2GB liegen keine Daten vor, aber durch Erhöhen der Clustergröße kann dieses Layout auch für diese Kartengrößen beibehalten werden. Die einzige 4GB MMCplus die ich bisher zu sehen bekommen habe, war im "SDHC-Stil" partitioniert und mit FAT32 bei 32kB Clustergröße formatiert.
Memory Sticks
Die meisten Memory Sticks haben am Ende einen kleinen ungenutzten Bereich aufgrund von Extended Translation und/oder der "Last Cylinder" Regel. Die Größe kann auf C/16/32 gemappt werden, aber der Beginn der Partition ist auf einen bestimmten Wert verschoben, um Cluster 2 auszurichten: Ein Vielfaches von 64kB für größere Karten, oder ein Vielfaches von 16kB für kleinere Karten. Die Clustergröße scheint auf 16kB für Memory Sticks bis 64MB festgelegt, und auf 32kB für Memory Sticks mit 256MB oder größer. Der Wert für 128MB Memory Sticks ist mangels Beispieldaten nicht bekannt.
SmartMedia und xD-Picture Cards
Während andere Karten der gleichen beworbenen Größe leicht unterschiedliche tatsächliche Größe aufweisen, ist die Größe von SmartMedia und xD auf 1000 Sektoren multipliziert mit einer Zweierprotenz festgelegt, also beispielsweise 16.000 Sektoren für 8MB Karten bis hin zu 4.096.000 Sektoren für 2GB Karten. SmartMedia und xD können auf C/16/32 gemappt werden, aber die Karten haben den Start der Partition so gelegt, dass Cluster 2 auf ein Vielfaches von 16kB fällt. SmartMedia und xD von 32MB bis 1GB verwenden auch eine Clustergröße von 16kB. Im Gegensatz zu anderen Karten ist die Anzahl der Einträge im FAT 16 Stammverzeichnis auf 256 anstatt dem Standardwert von 512 festgelegt. Das spart 8kB Platz, der Grund dafür ist nicht bekannt.

Nach dem Durchlesen und Verstehen der oben aufgeführten Beobachtungen sollte es offensichtlich sein, warum Speicherkarten niemals außerhalb eines speziell für den entsprechenden Speicherkarten-Typ vorgesehenen Geräts formatiert werden sollten.

Ungewöhnliche Karten-Konfigurationen

Wie oben aufgezeigt, sind CompactFlash die einzige Kartenfamilie ohne spezielle Regeln bezüglich der Formatierung und der Ausrichtung der Cluster. Bei den meisten CF-Karten hat die Ausrichtung der Cluster auch keine nennenswerten Auswirkungen, aber insbesondere SanDisk CF-Karten haben offensichtlich einen Controller, bei dem nicht ausgerichtete Cluster zu einer deutlichen Reduzierung der Geschwindigkeit führen können. Es kommt aber noch schlimmer: Es gibt Karten mit Standard-Formatierung und nicht ausgerichteten Clustern, bei denen der Controller angepasst ist, um mit der nun gegebenen Position von Cluster 2 beste Leistung zu erzielen. Bei einer Formatierung mit regulär ausgerichteten Clustern erzielt man dann eine Reduzierung anstatt einer Erhöhung der Geschwindigkeit!

Die folgende Liste ist nur eine kurze Zusammenfassung, weitere Information zu den erreichten Geschwindigkeiten folgt...

SanDisk Extreme IV CF 4GB
Meine SanDisk Extreme IV CF 4GB zeigt die beste Schreibperformance ab einem Offset von 1536 Bytes und Vielfachen von 2kB, also Adressen die auf 0x600 oder 0xE00 enden. Bei werksseitiger Formatierung hat Cluster 2 die Adresse 0xFFE00, hier liegt also eine bewusste Konfiguration des Controllers vor.
SanDisk Extreme III CF 16GB
Meine SanDisk Extreme III CF 16GB zeigt die beste Schreibperformance ab einem Offset von 0 und Vielfachen von 32kB, also Adressen die auf 0x0000 oder 0x8000 enden. Bei werksseitiger Formatierung hat Cluster 2 die Adresse 0x3DCE00, dadurch wird also die Karte gebremst.
SanDisk Extreme III CF 1GB
Meine SanDisk Extreme III CF 1GB zeigt die beste Schreibperformance ab einem Offset von 1kB und Vielfachen von 2kB, also Adressen die auf 0x400 oder 0xC00 enden. Bei werksseitiger Formatierung hat Cluster 2 die Adresse 0x49400, hier liegt also eine bewusste Konfiguration des Controllers vor.


Hans-Jürgen Reggel   ·   http://www.hjreggel.net/cardspeed/   ·   2007-05-31 ~ 2007-07-12