MegaLab.it
Stampa Articolo
Aperiodico gratuito di informatica
 
20080829222917

Alla scoperta del Master Boot Record (MBR)

a cura di masterz3d
21/01/2010 - articolo
Tecniche Avanzate - MBR - Master Boot Record, il settore LBA 0 di un disco rigido o di un qualsiasi dispositivo di memorizzazione di massa riscrivibile non ottico. Un solo settore che trattiene in sé poche ma importantissime informazioni sulla struttura primaria del dispositivo fisico.

Nota introduttiva 1

Questo articolo copre esclusivamente la struttura del MBR; non intende essere una guida per la sua modifica.

Essendo il MBR un insieme di dati estremamente importante per i sistemi operativi installati sul sistema, modificarlo senza criterio può portare conseguenze più o meno gravi, tra cui l'impossibilità di accedere ai filesystem od ai dati in essi contenuti.

Declino pertanto qualsiasi responsabilità sulla perdita di dati derivante da una eventuale modifica, voluta o non voluta, al Master Boot Record, né MegaLab.it può essere ritenuto, in qualsiasi modo, responsabile di tali perdite.

Nota introduttiva 2

Con l'espressione "disco" o "disco rigido" mi riferirò a una qualsiasi unità di memorizzazione tra le seguenti:

Glossario

Introduzione

Il MBR (Master Boot Record) è conosciuto anche come settore 0, identificato come primo settore dell'indirizzamento logico (LBA) dei blocchi di una unità di immagazzinamento, o primo settore secondo il vecchio ordinamento CHS.

Esso contiene il primo stage del bootloader (ovvero il primo programma che viene caricato dal BIOS subito dopo il POST), la tabella di partizione ed una signature che definisce il tipo di partizionamento. È il settore più importante di un disco. (Non che gli altri siano meno importanti, però se il MBR si danneggia tutte le partizioni diventano inaccessibili da un sistema operativo, se non tramite utility particolari come editor di dischi.)

Per spiegare un po' meglio la sua struttura sarà opportuno entrare più "a fondo" nelle caratteristiche di un disco.

Generalità dei dischi rigidi

Un disco rigido può essere suddiviso in due modi. Uno è attraverso le coordinate CHS, e uno è la mappatura LBA.

Coordinate CHS

Un disco rigido può essere pensato come una serie di superfici circolari piane a doppia faccia cosparse di minuscoli domini magnetici.

Queste superfici vengono chiamate "piatti", e sono lette da una testina ciascuna. Ogni piatto è letto da due testine, e nell'esempio in figura è presa in considerazione un'unità con quattro piatti e otto testine.

Hd_layout.png

La notazione CHS suddivideva i piatti in molti "anelli"; più anelli sovrapposti sui piatti sulla stessa verticale formavano un cilindro, e la coordinata per distinguere un piatto dall'altro sullo stesso cilindro erano le testine. Il settore è una piccola porzione di un anello, e nella figura è rappresentato dalle intersezioni dei due lati più lunghi del triangolo con i limiti dei cilindri.

Con questa notazione era possibile identificare in modo univoco un settore in un disco rigido. Ma la particolare struttura del MBR permetteva di indirizzare al massimo 1024 cilindri, 63 settori e 255 testine. Moltiplicando tra loro questi valori si ottiene 16450560, il numero massimo di settori indirizzabili. Ogni settore ha una capacità di 512 byte, quindi usando CHS si possono avere al massimo 8422686720 byte (8.4GB circa).

Due parole a proposito della geometria fisica

I valori di cilindri, testine e settori che definiscono un disco si chiama "geometria". E avrete sicuramente notato che nell'esempio in schema non ci sono 255 testine, non ci sarebbe abbastanza spazio per metterle tutte in un disco reale.

Per questo il chipset del disco permette una cosa che si chiama "traduzione di geometria" o "conversione di geometria", dalla geometria fisica (quella dove un disco ha realmente, per esempio, quattro testine, due piatti, diverse decine di migliaia di cilindri, eccetera) alla geometria logica (dove vediamo effettivamente un disco come un insieme di testine, settori e cilindri compatibile con i software di partizionamento e anche con il BIOS).

Ciononostante i limiti sono sempre quelli, e forse ora voi vi starete chiedendo com'è possibile che si riesca a partizionare un disco da 1TB. La soluzione è rappresentata dall'indirizzamento logico dei blocchi, ovvero LBA.

LBA - Indirizzamento logico

Il Logical Block Addressing è un metodo molto semplice per localizzare un settore di un disco. La numerazione LBA è un singolo numero, e parte da 0 (il MBR) e termina con l'ultimo settore disponibile del disco rigido. Su una tabella di partizione odierna lo spazio riservato per la numerazione dei settori è molto più ampio di quello dedicato alla numerazione CHS, ed è possibile avere partizioni grandi fino a 2TB.

Struttura logica di un MBR

Adesso che abbiamo definito tutta la teoria necessaria possiamo finalmente andare a vedere di che cos'è fatto un MBR e che importanza ha per un disco.

Il MBR è un settore come un altro, e quindi ha una capacità di 512 byte. Ciò che importa è capire come sono strutturati questi byte e quali campi vanno presi in considerazione.

Mbr_str_01a.png

Vediamo ora sommariamente la struttura di una voce interna alla tabella di partizione.

Voce di partizione

Le "voci di partizione" sono dei gruppi di codici esadecimali che descrivono una partizione: dicono se è attiva, quale tipo di partizione contiene, qual è la sua dimensione. Nella figura seguente vediamo i campi presenti in una voce di partizione. Tra parentesi sono presenti i valori estratti dallo schema.

Voci_di_partizione.png

I più attenti tra voi si saranno sicuramente accorti che le dimensioni dei settori tra parentesi e quelli scritti realmente nella tabella di partizione sono invertiti, casella per casella. Quindi, prima di andare avanti, è doveroso introdurre un concetto particolare di memorizzazione dati su supporti esterni, chiamato endianness.

Endianness

Ovvero: possibili disposizioni dei dati, atomo (ovvero, struttura minima di memorizzazione, in questo caso byte) per atomo su un supporto di memorizzazione di massa come un disco rigido.

Nello schema precedente abbiamo visto che nella tabella di partizione reale gli ultimi due campi di una voce di partizione sono disposti in un modo, ma tra parentesi ho messo i campi invertiti, casella per casella. Questa strana "inversione" di memorizzazione prende il nome di little-endian.

Normalmente ci si aspetterebbe che su un disco i dati vengano memorizzati con lo stesso verso con cui vengono letti da un essere umano, almeno qui in Occidente, ovvero da sinistra verso destra. Questo succede con il big-endian. Con il little-endian, invece, succede il contrario.

Questi termini prendono il nome dal tipo di bit (o byte) che viene depositato a sinistra nel campo. Se l'atomo che contiene il most significant bit (MSB, bit più significativo) viene depositato più a sinistra si parla di big-endian. Viceversa, avendo un atomo con il least significant bit (LSB, bit meno significativo) posto a sinistra avremo una notazione little-endian. Si può anche pensare al fatto che con il little-endian, all'aumentare della posizione di memoria, aumenti il "valore" dei bit che veniamo a trovare.

Dal grafico della pagina precedente possiamo vedere che gli ultimi due campi, siccome invertiti nella voce di partizione, hanno il byte (in questo caso) meno significativo a sinistra, e quindi questa memorizzazione è di tipo little-endian. La tipologia little-endian è utilizzata dalle più conosciute architetture attualmente in commercio, tra cui la diffusissima x86 (nelle sue varianti, comprese x86_64 o EM64T/IA64, ovvero rispettivamente CPU AMD o Intel, single o multi-core).

Di seguito illustro un semplice schema sull'interpretazione dell'endianness.

Mbr_str_01b.png

Il "Registro" identifica uno o più registri di una CPU che riversano il contenuto della memoria su disco. La "Memoria" è invece una porzione della memoria di massa (che può essere anche una memoria RAM) in cui i dati vengono riversati. Il verso di lettura dei dati è indicato dalle frecce che puntano verso il basso nel registro e, rispettivamente, verso destra e verso sinistra nelle notazioni big-endian e little-endian.

La notazione little-endian viene usata per la rappresentazione dei numero dei settori nella tabella di partizione.

Trasformazione HSC -> CHS

Un discorso a parte va fatto per la rappresentazione di cilindri, testine e settori nella tabella di partizione. Non è facile come sembra, e bisogna procedere per gradi per spiegare accuratamente la conversione che va fatta per tradurre le informazioni in un formato comprensibile.

Partiamo dal semplice dato HSC iniziale della voce di partizione della pagina precedente: 01 01 00.

Scomponiamo il campo nei suoi elementi fondamentali: il primo byte a sinistra identifica le testine, ed è un valore che può andare da 1 a FE in notazione esadecimale (la testina 0 è una testina generalmente riservata a metadati o dati di servizio), ovvero da 1 a 254 in notazione decimale.

I due campi rimanenti, invece, vanno letti in modo particolare. Innanzitutto dobbiamo sempre tenere presente che i numeri sono in notazione esadecimale. In secondo luogo, dobbiamo convertire i due numeri esadecimali in notazione binaria, e infine dobbiamo separare i primi 6 bit di sinistra dai 10 bit di destra.

Vi mostro uno schema per semplificare le cose.

Chs_notation.png

Dallo schema convertiamo i due byte di destra da esadecimale in binario. Dunque i due campi, affiancati, assumono il valore 00000001 00000000. Ma non è finita qui: i settori sono rappresentati da un numero a 6 bit (2^6 = 64, il numero massimo di settori per cilindro più 1) e i cilindri da un numero a 10 bit (2^10 = 1024, il numero massimo di cilindri indirizzabili, da 0 a 1023), e dobbiamo traslare tutti i bit dall'ottavo da sinistra verso sinistra; quindi prendiamo i due bit più a sinistra e li trasportiamo subito a sinistra degli 8 bit che compongono il terzo byte.

Il risultato è come vedete in schema: i sei bit più a sinistra definiscono il settore (1); i dieci bit a destra definiscono il cilindro (0). Per una più chiara visualizzazione rivedremo la conversione HSC -> CHS quando convertiremo il valore di HSC finale nell'analisi dettagliata della voce di partizione.

Analisi dettagliata di una voce di partizione

Prenderemo ora in considerazione, uno alla volta, i campi nella voce di partizione evidenziata. Ne analizzeremo i dettagli e vedremo come possa essere relativamente semplice, una volta che si conoscano i metodi, determinare le proprietà delle partizioni primarie del disco, e del disco stesso, partendo solo dai 64 byte della tabella di partizione.

Per semplicità mostrerò di nuovo la voce di partizione presa in esame.

Voci_di_partizione.png

Chs_notation_02.png

La geometria HSC finale è dunque testina 254, settore 63, cilindro 303, ovvero la partizione finisce quando termina il cilindro 303.

E la seguente è la prova di lettura della tabella tramite sfdisk:

Sfdisk_proof_odg_crop.png

Inoltre, se guardate nella colonna "Boot", l'asterisco, che identifica la partizione avviabile, è allineato alla seconda riga, corrispondente alla seconda partizione. In poche parole, la prima partizione non è avviabile, come dedotto dalla tabella.

Alcuni ID di partizione

Elenco di seguito alcuni ID di partizione tra i più comunemente utilizzati nei sistemi operativi più diffusi, di modo che li possiate riconoscere solo con un'occhiata, ormai sapete dove sta l'ID di partizione sulla tabella.

Conclusioni

In teoria (e anche in pratica) è possibile creare una tabella di partizione manualmente, soltanto con un disk editor e aprendo in scrittura il settore 0, dall'offset 01BE all'offset 01FD. Ciononostante lo sconsiglio, se non per una forte curiosità di scoprire che cosa succede se si va a giocare con le tabelle di partizione. Esistono programmi apposta che fanno questo, e solitamente non sbagliano.

In ogni caso avete avuto modo di vedere nel dettaglio la struttura di una tabella di partizione, e avete gli strumenti per andare a curiosare nel MBR per sapere se esistono delle partizioni nascoste, o semplicemente per vedere da un'altra prospettiva com'è partizionato il vostro disco rigido. Sapete ora che cosa potete cancellare e che cosa, invece, dovete lasciare: ad esempio, cancellando solo i primi 440 byte del MBR (ovvero, il bootloader) non correte alcun pericolo di perdere la tabella di partizione.

MegaLab.it rispetta la tua privacy. Per esercitare i tuoi diritti scrivi a: privacy@megalab.it .

Copyright 2008 MegaLab.it - Tutti i diritti sono riservati