.png)
Vor LBA gab es lediglich die physische Zuordnung einer Festplatte. Der Festplattenzugriff über das BIOS auf einem alten IBM-PC-kompatiblen Computer sah ursprünglich ungefähr so aus:
- Zylindernummer:(10b)
- 0-1024 (1024 = 2^10)
- Kopfnummer: (8b)
- 0-256 (256 = 2^8)
- Sektornummer: (6b)
- 0 ist typischerweise reserviert für das "Bootsektor" (C-0,H-0,S-0)
- 1-64 (63 = 2^6 - 1) *0 ist reserviert
Gesamte CHS-Adresse:24b (10+8+6)
Damals betrug die durchschnittliche (Datei|Block|Sektor)-Größe 512 B.
Beispiel ausWikipedia:
512(bytes) × 63(sectors) x 256(heads) × 1024(cylinders) = 8064 MiB (yields what is known as 8 GiB limit)
Was mich verwirrt ist, was einKopfeigentlich bedeutet, wenn es in der LBA-Formel erwähnt wird heads-per-cylinder
. Es macht für mich keinen Sinn, denn soweit ich weiß, ist ein KopfKopfund es sei denn, es ist Wechseldatenträger jederTellerhat zwei davon (oben, unten), einen für jede seiner Oberflächen.
Meiner Ansicht nach wäre es sinnvoller, sie als heads-per-disk
oder zu bezeichnen heads-per-surface
, da ein Zylinder durch die gesamte Platte (mehrere Platten) geht.
Logische Blockadressierung:
Formel:A = (c ⋅ Nheads + h) ⋅ Nsectors + (s − 1)
A
- Logische BlockadresseNheads
- Anzahl der Köpfe auf einer Platteheads-per-disk
Nsectors
- Anzahl der Sektoren auf einer Spursectors-per-track
c,h,s
- sind die Zylinder-, Kopf- und Sektornummern24-bits total (10+8+6)
Betrachtet man das erste Beispiel aufHier:
For geometry 1020 16 63 of a disk with 1028160 sectors CHS 3 2 1 is LBA 3150=(3× 16+2)× 63
Geometrie:(dies wird vom Hersteller festgelegt)
- Zylinder - 1020
- Köpfe- 16
- Sektoren - 63
Antwort1
Insgesamt gehen Sie ziemlich schlampig mit der Terminologie um, was zu noch größerer Verwirrung führt.
1024 Bit adressierbare Zahl (1024 = 2^10)
Der IBM PC/XT verwendete einen Western Digital WD1010-Festplattencontroller, der (in Hardwareregistern) eine 10-Bit-Zylindernummer verwendete.
Der erste Zylinder hat die Adresse 0, es gibt also 1024 Zylinderadressen
.Adressierbare Nummer" ist unsinnig.
-1 für den „Bootsektor“ (c-0,h-0,s-0)
63 Bit adressierbare Zahl (63 = 2^6 - 1)
Der erste Sektor (jeder Spur) hat die Adresse 1, sodass eine 6-Bit-Sektornummer bis zu 63 Sektoren (Sektornummern 1 bis 63) auf jeder Spur adressieren kann.
Es gibt keine Sektoradresse Null. Sie ist nicht reserviert. Sie existiert nicht.
Die Subtraktion dieses Offsets ist eine arithmetische Notwendigkeit und hat nichts mit dem Bootsektor zu tun. Die Verwendung des ersten Sektors (oder eines beliebigen Sektors) des Laufwerks zum Booten (oder für eine beliebige Funktion) ist für die Notwendigkeit der Subtraktion des Startoffsets irrelevant.
Ich verstehe also, dass Sie theoretisch die folgende Maximaladresse erhalten können:
512 (Bytes) × 63 (Sektoren) x 256 (Köpfe) × 1024 (Zylinder) = 8064 MiB
Nein, das ist die maximale Kapazität.
Festplattenadressen beziehen sich auf Sektoren, nicht auf Bytes.
Ich verstehe, dass die Kopfnummer eine adressierbare 246-Bit-Nummer ist …
Hä??? Eine „adressierbare Nummer“???
Einer der Laufwerksparameter ist die Anzahl der Köpfe (in einem Zylinder).
Eine der Zahlen in einer CHS-Adresse ist die Kopfnummer.
246 Bit???
Was mir nicht klar ist, ist, was ein Kopf eigentlich ist, wenn er als bezeichnet wird
heads-per-track
.
Heads-per-track
ist etwas, das Sie erfunden haben, da es für die typische Festplatte, die in einem PC verwendet wird, keinen solchen Parameter gibt (d. h. diese Zahl wäre immer eins).
Eine bestimmte Spur würde nur von einem bestimmten Schreib-/Lesekopf gelesen und geschrieben werden.
Es gibt einen Schreib-/Lesekopf pro Oberfläche. (Sie werden wahrscheinlich kein Dual-Port-Laufwerk verwenden.)
Der Schreib-/Lesekopf ist am Ende eines Arms montiert.
Alle Schreib-/Leseköpfe und -arme bilden eine Baugruppe, die von einem Aktuator bewegt/gedreht wird.
(Aber es gab auchFest-Kopf-Festplattenlaufwerke, z. B. ein Kopf pro Spur, die eine Suchzeit von null haben.)
Diese Begriffe ergeben für mich keinen Sinn, denn soweit ich weiß, ist ein Kopf (der eigentliche Arm, der die Lese-/Schreibvorgänge durchführt) und sofern es sich nicht um Wechselmedien handelt, hat jede Platte zwei davon (oben, unten). Daher wäre es sinnvoller, von Köpfen pro Platte oder Köpfen pro Disk zu sprechen … und eigentlich müsste es doch Sektoren pro Spur heißen, oder?
Dann sind Sie offensichtlich verwirrt, was ein Kopf ist.
Sie verwechseln auch „Platte“ mit „Oberfläche“.
Es gibt keine Anforderung, dass beide Seiten einer Platte verwendet werden müssen, daher wird jede Oberfläche als Einheit behandelt und nicht die Platte als Einheit.
Es gibt einen Laufwerksparameter namens sectors per track
.
Dieser Begriff taucht jetzt
heads-per-track
auf, wenn man sich die Konvertierung von CHS zu LBA ansieht.
Auch das scheint etwas zu sein, was Sie sich ausgedacht haben. Köpfe pro Spur sind eins.
aber wie lässt sich die Geometrie 1020,16,63 in CHS 3,2,1 übersetzen? Kann mir das bitte jemand erklären?
LBA ist eine Sektoradresse.
CHS ist auch eine Sektoradresse.
Um eine Adressart in die andere umzuwandeln, müssen Sie die Laufwerksgeometrie angeben:
. number of cylinders
. number of heads (per cylinder)
. number of sectors per track
Sie können die Geometrie nicht in eine Adresse *übersetzen*; Sieverwendendie Geometrie zum Konvertieren einer Adresse.
Die CHS-Adresse 3,2,1
entspricht der LBA-Adresse, 3150
wenn die Laufwerksgeometrie ist 1020,16,63
.
ANHANG zur überarbeiteten Frage
Meiner Ansicht nach wäre es sinnvoller, von Köpfen pro Platte oder Köpfen pro Oberfläche zu sprechen, da ein Zylinder durch die gesamte Platte (mehrere Platten) geht.
Von den zahlreichen technischen Dokumenten (von den Festplattenherstellern), die ich gelesen habe, listet die Spezifikationstabelle für ein (Single-Port-)Laufwerk dieAnzahl Schreib-/Leseköpfeund dasAnzahl der Platten. Es gab nie ein Verhältnis von heads per disk
, heads per surface
, oder heads per platter
.
Bei meiner Arbeit als Software-/Firmware-Ingenieur, der Controller-Firmware, Gerätetreiber für Festplatten und Dateisystem-Handler entwickelt, habe ich mich nie mit der Anzahl der Platten beschäftigt oder sie verwenden müssen. Die Anzahl der Platten oder die Tatsache, dass eine Platte zwei mögliche Oberflächen hat, sindmechanische Eigenschaftendie für die Laufwerksgeometrie zur CHS-Adressierung völlig irrelevant sind.
Das C in CHS steht für die Zylinderadresse. Das Laufwerk muss (elektromechanisch)suchenan die gewünschte Zylinderadresse/Position, damit die Schreib-/Lesekopfbaugruppe richtig positioniert ist.
Das H in CHS bezieht sich auf die R/W-Kopfadresse. Der Plattencontroller (elektrisch)wähltder angeforderte Schreib-/Lesekopf (nach Abschluss des Suchvorgangs) anhand seiner Adresse, um auf die richtige Spur zuzugreifen. Alle anderen Schreib-/Leseköpfe werden (elektrisch) deaktiviert.
Das S in CHS bezieht sich auf die Sektoradresse. Der Festplattencontroller scannt (programmgesteuert) jeden Sektor (nach der Suche und Kopfauswahl), während er unter dem (ausgewählten) R/W-Kopf rotiert, bis der angeforderte Sektor gefunden ist (liest z. B. den ID-Datensatz des Sektors und führt einen Adressvergleich durch).
Wenn Sie mit der Dimensionsanalyse vertraut sind, ist es für Sie außerdem sinnvoller,
die Anzahl der Köpfe eines Festplattenlaufwerks als anzugeben als .heads per cylinder
heads per drive
Ich verstehe die geometrischen CHS-Zahlen, aber woher kommen die (3,2,1)-Tupel-CHS-Zahlen?
Dies ist lediglich eine beliebige CHS-Adresse, die zur Verwendung in Beispielen für die Konvertierung in LBA-Adressen ausgewählt wurde.
Übrigens
Im Endbenutzerjargon ist „Disk“ == Festplattenlaufwerk.
Im professionellen HDD-Jargon ist „Disk“ == Festplattenplatte.
Antwort2
Hier ist eine praktische Kurzzusammenfassung der Konvertierung, der historischen Eigenheiten und der richtigen Terminologie, die in Python implementiert ist. Großbuchstaben geben die Geometrie an, Kleinbuchstaben die (c,h,s)
Komponenten einer Sektoradresse.
Die Standardgeometrie (C,H,S)
gibt Werte an, die typischerweise für moderne große Festplatten beim frühen Booten für das Booten im MBR/BIOS-Stil verwendet werden.
def chs(lba,C=1024,H=255,S=63):
"""
'lba' linearly addresses sector, indexing from zero.
'C','H','S' specify geometry - fixed for a given disk:
1 <= C <= 1024 (10 bits)
1 <= H <= 255 (8 bits) not 256 due to WD1010 quirk
1 <= S <= 63 (6 Bits) not 64 due to WD1010 quirk
Returns address as c,h,s tuple:
0 <= c <= 1023 (10 bits) modulo C
0 <= h <= 255 (8 bits) modulo H
1 <= s <= 63 (6 Bits) not 64 due to WD1010 quirk
"""
if C<1 or H<1 or S<1 or C>1024 or H>255 or S>63:
raise ValueError, \
"Invalid (C,H,S) geometry: ({},{},{})". \
format(C,H,S)
t,s = divmod(lba,S); s+=1 # tracks, sector offset
c,h = divmod(t,H)
if c>=C: raise ValueError, \
"Unaddressable lba value: {} for ({},{},{}) geometry.". \
format(lba,C,H,S)
return (c,h,s)
def lba(c,h,s,C=1024,H=255,S=63):
"""
'C','H','S' specify geometry as for function 'chs'.
'c','h','s' address a sector in this geometry.
"""
if C<1 or H<1 or S<1 or C>1024 or H>255 or S>63:
raise ValueError, \
"Invalid (C,H,S) geometry: ({},{},{})". \
format(C,H,S)
if c<0 or h<0 or s<1 or c>=C or h>=H or s>S:
raise ValueError, \
"Unaddressable (c,h,s) value: ({},{},{}) for ({},{},{}) geometry.". \
format(c,h,s,C,H,S)
return (c*H+h)*S+(s-1)