PDA

View Full Version : Come tradurre valori LBA in esadecimale?


Blisset
01-10-2006, 00:05
Salve,
ho un hard disk da 186 Gb, la geometria esatta è 125231 cilindri, 65 heads, 48 settori.
Purtroppo a causa di un crash l'MBR, compresa la tabella delle partizioni, è andato perduto.
Ora, io so i valori delle partizioni per cui potrei anche editarla a mano, ma non so come convertire i valori LBA in esadecimale, poichè il mio sistema usa un indirizzamento a 48bits (l'hard disk è più di 137 Gb) e non ho proprio capito come infilare 48 bits in 3 bytes!

Ad esempio la partizione primaria attiva C: parte al settore 63 ed è lunga esattamente 16595081 settori.

A parte il primo valore e quello del file system (che so già)
Devo definire:
Start sector (3 bytes): Head (8 bits), Sectors (6 bits), Cylinders (10bits)
End sector (3 bytes): Head (8 bits), Sectors (6 bits), Cylinders (10bits)
Starting offset sector (4 bytes)
Total sectors (4 bytes)

C'è nessuno che sa come tradurre queste informazioni in esadecimale da inserire nel primo record (01BEh-01CDh) della partition table? Soprattutto non ho capito come infilare un indirizzo a 48 bits in 24 bits. Qual è il trucco?

CRL
01-10-2006, 21:32
Non so bene come si comporti l'indirizzamento, ma credo che se aggiorni il bios con l'lba48 avrai un indirizzo più lungo, chiaramente, non so se c'è modo (cioè direi di no) di metterlo in un indirizzo 24bit.
Per convertire il numero, la "h" minuscola finale indica solo che trattasi di numero esadecimale, il resto si calcola con la calcolatrice di windows.
Ad esempio, il settore di partenza è il 63, che in esadecimale diventa: 03Fh.

Non credo di aver risposto alla tua domanda, però, perchè tu vuoi sapere come trasformare il CHS in LBA, e viceversa.
Un aiuto può venirti da queste relazioni:

LBA = ( (cylinder * heads_per_cylinder + heads ) * sectors_per_track ) + sector - 1

where heads_per_cylinder and sectors_per_track are the current translation mode values.


This algorithm can be reversed such that an LBA can be converted to a CHS:


cylinder = LBA / (heads_per_cylinder * sectors_per_track)
temp = LBA % (heads_per_cylinder * sectors_per_track)
head = temp / sectors_per_track
sector = temp % sectors_per_track + 1

Vedi se questo può esserti utile.
Riguardo la dimensione di un indirizzo in un sistema a 48bit, qui dovresti trovare ciò che ti serve:

http://www.48bitlba.com/overview.htm

- CRL -

Blisset
03-10-2006, 15:32
Non so bene come si comporti l'indirizzamento, ma credo che se aggiorni il bios con l'lba48 avrai un indirizzo più lungo, chiaramente, non so se c'è modo (cioè direi di no) di metterlo in un indirizzo 24bit.
Per convertire il numero, la "h" minuscola finale indica solo che trattasi di numero esadecimale, il resto si calcola con la calcolatrice di windows.
Ad esempio, il settore di partenza è il 63, che in esadecimale diventa: 03Fh.

Non credo di aver risposto alla tua domanda, però, perchè tu vuoi sapere come trasformare il CHS in LBA, e viceversa.
Un aiuto può venirti da queste relazioni:

LBA = ( (cylinder * heads_per_cylinder + heads ) * sectors_per_track ) + sector - 1

where heads_per_cylinder and sectors_per_track are the current translation mode values.


This algorithm can be reversed such that an LBA can be converted to a CHS:


cylinder = LBA / (heads_per_cylinder * sectors_per_track)
temp = LBA % (heads_per_cylinder * sectors_per_track)
head = temp / sectors_per_track
sector = temp % sectors_per_track + 1

Vedi se questo può esserti utile.
Riguardo la dimensione di un indirizzo in un sistema a 48bit, qui dovresti trovare ciò che ti serve:

http://www.48bitlba.com/overview.htm

- CRL -

Ok, grazie ho risolto, ho scritto i bytes giusti e ho recuperato tutto.
Praticamente l'LBA 48bit ha effetto solo nel BIOS.
La parte (a sinistra) della Partition Table che si occupa dei settori iniziale e finale in CHS è completamente ignorata negli hard disk più grossi di 8Gb.
Windows guarda solo la parte destra i cui valori arrivano fino a 2040 Gb.
Per i prossimi 4 anni quindi non avremo problemi con le Partition Table. :D