Il master boot record, o MBR, è il primo settore di un disco (cilindro 0, testina 0, settore 1) ed è destinato a contenere le informazioni essenziali per l’avvio del sistema dal bios (vedi Note sul bios e codici errore del bios).
0000H | 446 bytes | MBP | MBR 512 bytes | |
. | ||||
. | ||||
01BDH | ||||
01BEH | 64 bytes | Master partition table | ||
01FDH | ||||
01FEH | 2 bytes | Master Boot Signature | ||
01FFH |
Come ogni settore del disco, il MBR ha una dimensione di 512 byte, di cui i primi 446 sono destinati a contenere il MBP (Master Boot Program), cioè le istruzioni da eseguire quando viene avviato il disco, altri 64 byte costituiscono la master partition table, ovvero le informazioni sul partizionamento del disco, mentre i rimanenti costituiscono il master boot signature, cioè il numero "magico" che decreta la fine e la validità dell'MBR.
Offset | Dimensione | Contenuto | |
---|---|---|---|
01BEH-01CDH
|
16 bytes | Partizione primaria n°1 |
Partition table
|
01CEH-01DDH
|
16 bytes | Partizione primaria n°2 | |
01DEH-01EDH
|
16 bytes | Partizione primaria n°3 | |
01EEH-01FDH
|
16 bytes | Partizione primaria n°4 |
In particolare la partition table vera e propria si compone di 4 elementi (entry), di 16 byte l’uno, che descrivono le partizioni primarie (al massimo 4 partizioni primarie, o 3 primarie ed una estesa) in cui può essere suddiviso il disco. Ogni elemento contiene le seguenti informazioni:
Byte | Contenuto |
---|---|
0 | Indicatore di boot(contiene il valore 80h se la partizione è attiva, altrimenti 0 =not bootable) |
1-3 | Testina, settore e cilindro del primo blocco della partizione |
4 | Identificazione del filesystem contenuto nella partizione (elenco codici) |
5-7 | Testina, settore e cilindro dell'ultimo blocco della partizione |
8-11 | Numero blocchi prima della partizione |
12-15 | Numero blocchi che costituiscono la partizione |
Non è detto che i valori di testina, settore e cilindro del primo e dell’ultimo blocco di ogni partizione siano ognuno memorizzati su un byte. Considerando hard disk con capacità di 10 MiB, si possono avere architetture con 256 testine, 64 settori e 1220 cilindri. Pertanto il numero di testine sarà rappresentato esattamente su un byte, mentre per i settori saranno sufficienti 6 bit, cosicché, visto che un byte non sarebbe sufficiente per rappresentare i cilindri, vengono utilizzati i 2 bit più significativi del byte che riporta i settori e considerati come i 2 bit più significativi da aggiungere ad un byte per formare così 10 byte per memorizzare il numero di cilindri. Ma con 10 byte si possono memorizzare soltanto valori da 0 a 1023. Quindi, per com’è stato realizzato il MBR, lo MBP dovrebbe essere contenuto nei primi 1024 cilindri del disco (cioè nei primi 8 GiB), altrimenti il BIOS non sarà in grado di raggiungerlo e quindi il sistema operativo non potrà essere caricato. Per ovviare questo problema, nelle versioni più recenti dei BIOS è possibile utilizzare la traduzione dell’indirizzamento dei settori LBA(Logical Block Assignment). Questo permette di oltrepassare il limite sull’indirizzamento dei cilindri suddetto.
Una cosa molto importante da far notare e che se è presente una partizione estesa con all'interno delle partizioni logiche, i dati su queste ultime non risiederanno nella master partition table, quindi copiando o facendo il backup del solo MBR potreste perdere queste informazioni! Vedi il paragrafo sull'EBR.
Gli ultimi 2 byte delle partition table sono un identificativo di riconoscimento della fine del MBR e contengono il valore AA55H (si ricordi che i PC utilizzano la convenzione little endian per la memorizzazione delle informazioni).
Facciamo un esempio di tabella delle partizioni con un'unica partizione:
Offset 0 1 2 3 4 5 6 7 8 9 A B C D E F ASCII characters
1B0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 01 ................
1C0 01 00 0B 1F 3F 33 3F 00 00 00 41 99 01 00 00 00 ....?3?...A.....
1D0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
1E0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
1F0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 55 AA ..............U.
Vediamo che con questo colore _ sono evidenziati i 16 byte che vanno dall' 1BEh all' 1CDh e che contengono le informazioni sull'unica partizione primaria presente nella tabella. Come si può notare il primo byte "80" ci indica che la partizione è attiva, mentre in una partizione estesa questo sarà "00". Di seguito troviamo i 3 byte che indicano nella codifica CHS (Cilinder Head Sector) la posizione dell'inizio dell partizione, cioè "01,01,00".
Il byte successivo indica il typo di partizione ed in questo caso è "0B" che indica una partizione FAT32. Dopo altri 3 byte che indicano la fine della partizione, cioè "1F,3F,33".
I blocchi restanti indicano il numero di blocchi prima della partizione (3F,00,00,00) che per la convenzione little-endian diventa 0000003Fh cioè 63, quindi la nostra partizione inizierà dal 64esimo settore LBA del disco.
Infine avremo il numero di blocchi della partizione (41,99,01,00) ->00019941h->104769 settori, che a 512 bytes per settore fanno 53,641,728 bytes (o circa 51 MiB).
Gli ultimi due byte colorati _ sono il master boot signature.
Un esempio del contenuto di un intero MBR è riportato di seguito:
00000000 eb 48 90 d0 bc 00 7c fb 50 07 50 1f fc be 1b 7c |.H....|.P.P....||
00000010 bf 1b 06 50 57 b9 e5 01 f3 a4 cb be be 07 b1 04 |...PW...........|
00000020 38 2c 7c 09 75 15 83 c6 10 e2 f5 cd 18 8b 14 8b |8,|.u...........|
00000030 ee 83 c6 10 49 74 16 38 2c 74 f6 be 10 07 03 02 |....It.8,t......|
00000040 80 00 00 80 64 6b ce 00 00 08 fa ea 50 7c 00 00 |....dk......P|..|
00000050 31 c0 8e d8 8e d0 bc 00 20 fb a0 40 7c 3c ff 74 |1....... ..@|<.t|
00000060 02 88 c2 52 be 76 7d e8 34 01 f6 c2 80 74 54 b4 |...R.v}.4....tT.|
00000070 41 bb aa 55 cd 13 5a 52 72 49 81 fb 55 aa 75 43 |A..U..ZRrI..U.uC|
00000080 a0 41 7c 84 c0 75 05 83 e1 01 74 37 66 8b 4c 10 |.A|..u....t7f.L.|
00000090 be 05 7c c6 44 ff 01 66 8b 1e 44 7c c7 04 10 00 |..|.D..f..D|....|
000000a0 c7 44 02 01 00 66 89 5c 08 c7 44 06 00 70 66 31 |.D...f.\..D..pf1|
000000b0 c0 89 44 04 66 89 44 0c b4 42 cd 13 72 05 bb 00 |..D.f.D..B..r...|
000000c0 70 eb 7d b4 08 cd 13 73 0a f6 c2 80 0f 84 f3 00 |p.}....s........|
000000d0 e9 8d 00 be 05 7c c6 44 ff 00 66 31 c0 88 f0 40 |.....|.D..f1...@|
000000e0 66 89 44 04 31 d2 88 ca c1 e2 02 88 e8 88 f4 40 |f.D.1..........@|
000000f0 89 44 08 31 c0 88 d0 c0 e8 02 66 89 04 66 a1 44 |.D.1......f..f.D|
00000100 7c 66 31 d2 66 f7 34 88 54 0a 66 31 d2 66 f7 74 ||f1.f.4.T.f1.f.t|
00000110 04 88 54 0b 89 44 0c 3b 44 08 7d 3c 8a 54 0d c0 |..T..D.;D.}<.T..|
00000120 e2 06 8a 4c 0a fe c1 08 d1 8a 6c 0c 5a 8a 74 0b |...L......l.Z.t.|
00000130 bb 00 70 8e c3 31 db b8 01 02 cd 13 72 2a 8c c3 |..p..1......r*..|
00000140 8e 06 48 7c 60 1e b9 00 01 8e db 31 f6 31 ff fc |..H|`......1.1..|
00000150 f3 a5 1f 61 ff 26 42 7c be 7c 7d e8 40 00 eb 0e |...a.&B|.|}.....|
00000160 be 81 7d e8 38 00 eb 06 be 8b 7d e8 30 00 be 90 |..}.8.....}.0...|
00000170 7d e8 2a 00 eb fe 47 52 55 42 20 00 47 65 6f 6d |}.*...GRUB .Geom|
00000180 00 48 61 72 64 20 44 69 73 6b 00 52 65 61 64 00 |.Hard Disk.Read.|
00000190 20 45 72 72 6f 72 00 bb 01 00 b4 0e cd 10 ac 3c | Error.........<|
000001a0 00 75 f4 c3 00 00 00 00 00 00 00 00 00 00 00 00 |.u..............|
000001b0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 01 |................|
000001c0 01 00 0b fe ff 47 3f 00 00 00 09 e9 cd 00 00 00 |.....G?.........|
000001d0 c1 48 83 fe ff 51 48 e9 cd 00 8a 73 02 00 00 00 |.H...QH....s....|
000001e0 c1 52 83 fe ff ff d2 5c d0 00 54 58 53 00 00 fe |.R.....\..TXS...|
000001f0 ff ff 0f fe ff ff 26 b5 23 01 20 d8 07 00 55 aa |......&.#. ...U.|
Prima di effettuare qualsiasi operazione sul MBR è caldamente consigliato di effettuarne una copia di backup in modo da poterlo eventualmente ripristinare nel caso in cui le modifiche effettuate dessero dei problemi. Il backup e l’eventuale ripristino del MBR può essere effettuato per mezzo del comando dd (man page dd(1)) che copia fisicamente i byte da un media in un altro.
Comando: dd
Path: /bin/ddSINTASSI
# dd [option]
DESCRIZIONEoption indica la modalità di funzionamento di dd. Può assumere i seguenti valori:
- bs=bytes specifica la dimensione dei blocchi di lettura e scrittura secondo quanto indicato da bytes;
- cbs=bytes specifica la dimensione dei blocchi nella conversione secondo quanto indicato da bytes;
- conv=type specifica la conversione da effettuare sui byte letti secondo quanto indicato da type
- ascii Converte EBCDIC in ASCII.
- ebcdic Converte ASCII in EBCDIC.
- ibm Converte ASCII in EBCDIC alternato.
- block Per ogni riga d'input, scrive cbs byte in uscita, sostituendo le newline con spazi e aggiungendo spazi alla fine se necessario.
- unblock Sostituisce gli spazi finali di ciascun blocco da cbs byte in ingresso con una newline.
- lcase Cambia le maiuscole in minuscole.
- ucase Cambia le minuscole in maiuscole.
- swab Scambia ognia copia di byte in ingresso. A differenza degli altri, il dd GNU funziona anche se legge un numero dispari di byte: l'ultimo è semplicemente copiato (non essendoci niente con cui scambiarlo).
- noerror Continua dopo un errore di lettura.
- notrunc Non tronca il file di output.
- sync Aggiunge byte nulli alla fine di ogni blocco di input per una lunghezza totale di ibs.
- count=num specifica il numero di blocchi da leggere secondo quanto indicato da num;
- ibs=bytes specifica la dimensione dei blocchi di lettura secondo quanto indicato da bytes;
- if=file specifica il file dal quale leggere, secondo quanto indicato da file (se non viene indicato viene considerato lo standard input);
- obs=bytes specifica la dimensione dei blocchi di scrittura secondo quanto indicato da bytes;
- of=file specifica il file nel quale scrivere, secondo quanto indicato da file (se non viene indicato viene considerato lo standard output);
- seek=num specifica di saltare num blocchi in scrittura;
- skip=num specifica di saltare num blocchi in lettura;
- --help visualizza un aiuto sommario di dd;
- --version visualizza la versione di dd;
bytes e num possono essere valori numerici seguiti dai suffissi moltiplicativi:
- xM = M
- (default)c = 1
- w = 2
- b = 512
- kB = 103
- K = 1024
- MB = 106
- M = 1024*1024
- GB = 1000*1000*1000
- G 1024*1024*1024
e così via per T, P, E, Z, Y.
Le informazioni contenute nel MBR di un disco possono essere salvate in un file con un comando analogo a quello seguente
# dd if=/dev/hda of=/boot/boot.MBR bs=512 count=1
In questo modo vengono fisicamente copiati i byte contenuti nel primo settore (512 byte) del primo disco ATA (/dev/hda) nel file /boot/boot.MBR.
Per ripristinare successivamente il MBR con le informazioni contenute in un file si può utilizzare il comando seguente
# dd if=/boot/boot.MBR of=/dev/hda bs=512 count=1
In questo modo vengono rimpiazzati i byte contenuti nel primo settore (512 byte) del primo disco ATA (/dev/hda) con quelli contenuti nel file /boot/boot.MBR. Così facendo viene ripristinato quindi sia il MBP che la partition table. Nel caso in cui non si voglia ripristinare la partition table occorre ripristinare soltanto i primi 446 byte del MBR (ovvero non considerare gli ultimi 66 byte, contenenti appunto la partition table), con il seguente comando
# dd if=/boot/boot.MBR of=/dev/hda bs=446 count=1
È possibile ripristinare il MBR anche da DOS, lanciando il comando:
C:\>FDISK /MBR
oppure
C:\>FIXMBR
dipendentemente dallo specifico sistema operativo considerato.
Per cancellarlo nei comandi linux come file di input basta mettere il "/dev/zero" :
# dd if=/dev/zero of=/dev/hda bs=446 count=1
Nel caso si voglia cancellare anche la partition table allora usare questo:
# dd if=/dev/zero of=/dev/hda bs=512 count=1
È evidente che per far ciò deve essere possibile avviare il sistema. Visto che il MBR è il settore di boot necessario per l’avvio del sistema, è opportuno creare un dischetto di avvio, in maniera da poter avviare il sistema senza aver bisogno del MBR.
Subito dopo il POST, viene generalmente chiamato l’interrupt 19H, che tenta di leggere il boot sector dal primo disco avviabile (in genere la sequenza dei dischi consultati per l’avvio è: floppy disk, CD-ROM, hard disk). Il primo settore di boot disponibile (nella sequenza dei dispositivi consultati) viene caricato in memoria a partire dalla locazione 7C00H e viene eseguito (il registro SI viene inizializzato con il valore dell’indirizzo della prima locazione relativa alla riga della partition table che descrive la partizione dalla quale è stato caricato il boot record).
Se la word contenuta a partire dalla locazione 0000 : 0472H è diversa da 1234H l’interrupt 19H effettuerà un test della memoria centrale prima di caricare il boot sector.
Il boot di un sistema basato su architettura Intel X386 è un processo piuttosto complesso, poiché inizialmente la CPU funziona in modalità reale, potendo accedere soltanto al primo MiB di memoria, quindi il boot loader caricherà il sistema operativo (nel caso di GNU/Linux, si tratta del kernel) all’interno del primo MiB di memoria, che una volta avviato in esecuzione, provvederà a far passare la CPU alla modalità protetta e quindi avere a disposizione tutta la memoria fisicamente installata sul sistema.
Di seguito sono riportate, sia la parte dati che le istruzioni assembly X386, secondo lo standard Intel, corrispondenti al codice macchina del MBR visto precedentemente (già rilocato a partire dall’indirizzo 7C00H), per meglio illustrarne il funzionamento.
0000:7c00 eb 48 90 d0 bc 00 7c fb 50 07 50 1f fc be 1b 7c |.H....|.P.P....||
0000:7c10 bf 1b 06 50 57 b9 e5 01 f3 a4 cb be be 07 b1 04 |...PW...........|
0000:7c20 38 2c 7c 09 75 15 83 c6 10 e2 f5 cd 18 8b 14 8b |8,|.u...........|
0000:7c30 ee 83 c6 10 49 74 16 38 2c 74 f6 be 10 07 03 02 |....It.8,t......|
0000:7c40 80 00 00 80 64 6b ce 00 00 08 fa ea 50 7c 00 00 |....dk......P|..|
0000:7d70 7d e8 2a 00 eb fe 47 52 55 42 20 00 47 65 6f 6d |}.*...GRUB .Geom|
0000:7d80 00 48 61 72 64 20 44 69 73 6b 00 52 65 61 64 00 |.Hard Disk.Read.|
0000:7d90 20 45 72 72 6f 72 00 bb 01 00 b4 0e cd 10 ac 3c | Error.........<|
0000:7da0 00 75 f4 c3 00 00 00 00 00 00 00 00 00 00 00 00 |.u..............|
0000:7db0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 80 01 |................|
0000:7dc0 01 00 0b fe ff 47 3f 00 00 00 09 e9 cd 00 00 00 |.....G?.........|
0000:7dd0 c1 48 83 fe ff 51 48 e9 cd 00 8a 73 02 00 00 00 |.H...QH....s....|
0000:7de0 c1 52 83 fe ff ff d2 5c d0 00 54 58 53 00 00 fe |.R.....\..TXS...|
0000:7df0 ff ff 0f fe ff ff 26 b5 23 01 20 d8 07 00 55 aa |......&.#. ...U.|
Commento del codice presente nell'MBR
0000:7c00 eb 48 jmp 0x7c4a Continua l’esecuzione dalla locazione 7C4AH
Inizio
0000:7c4a fa cli Disabilita gli interrupt
0000:7c4b ea 50 7c 00 00 ljmp 0x0,0x7c50 Continua l’esecuzione dalla locazione 0000 : 7C50H. Questo serve perché altrimenti certi BIOS possono dare problemi
0000:7c50 31 c0 xor ax,ax Azzera AX
0000:7c52 8e d8 mov ds,ax Azzera DS
0000:7c54 8e d0 mov ss,ax Azzera SS
0000:7c56 bc 00 20 mov sp,0x2000 SP = 2000H
0000:7c59 fb sti Abilita gli interrupt
0000:7c5a a0 40 7c mov al,ds:0x7c40 Check if we have a forced disk reference here
0000:7c5d 3c ff cmp al,0xff Confronta AL con FFH
0000:7c5f 74 02 je 0x7c63 Se AL è 80H, Invalid drive: continua l’esecuzione da 7C63H
0000:7c61 88 c2 mov dl,al DL = AL
0000:7c63 52 push dx Salva DX nello stack
Visualizza il messaggio “GRUB ”
0000:7c64 be 76 7d mov si,0x7d76
0000:7c67 e8 34 01 call 0x7d9e Chiama la routine di visualizzazione che inizia a 7D9EH
0000:7c6a f6 c2 80 test dl,0x80 Esegui l’AND tra DL e 80 H
0000:7c6d 74 54 je 0x7cc3 Se l’AND ha dato come risultato 0, non si tratta di un HD: continua l’esecuzione da 7CC3H
Prova con il supporto LBA
0000:7c6f b4 41 mov ah,0x41
0000:7c71 bb aa 55 mov bx,0x55aa
0000:7c74 cd 13 int 0x13 Chiama la routine di interrupt 13H (AH=41H), che testa il supporto LBA del BIOS
0000:7c76 5a pop dx Ripristina il contenuto di DX con quello salvato nello stack (con alcuni BIOS il contenuto di DL potrebbe essere variato dopo la chiamata all’interrupt 13H)
0000:7c77 52 push dx
0000:7c78 72 49 jb 0x7cc3 LBA non supportato: continua da 7CC3 H (prova con CHS)
0000:7c7a 81 fb 55 aa cmp bx,0xaa55
0000:7c7e 75 43 jne 0x7cc3 LBA non supportato: continua da 7CC3 H (prova con CHS)
Test se AH=42H è supportato se FORCE LBA è zero
0000:7c80 a0 41 7c mov al,ds:0x7c41
0000:7c83 84 c0 test al,al
0000:7c85 75 05 jne 0x7c8c LBA supportato: esegui da 7C8C H
0000:7c87 83 e1 01 and cx,0x1
0000:7c8a 74 37 je 0x7cc3 LBA non supportato: esegui da 7CC3 H (prova con CHS)
LBA
0000:7c8c 66 8b 4c 10 mov ecx,[si+0x10]
0000:7c90 be 05 7c mov si,0x7c05 Disk address packet
0000:7c93 c6 44 ff 01 mov [si-0x01],0x01
0000:7c97 66 8b 1e 44 7c mov ebx,0x7c44 Settore relativo allo stage2
0000:7c9c c7 04 10 00 mov [si],0x10
0000:7ca0 c7 44 02 01 00 mov [si+0x02],0x01
0000:7ca5 66 89 5c 08 mov [si+0x08],ebx
0000:7ca9 c7 44 06 00 70 mov [si+0x06],0x7000
0000:7cae 66 31 c0 xor eax,eax
0000:7cb1 89 44 04 mov [si+0x04],ax
0000:7cb4 66 89 44 0c mov [si+0x0c],eax
0000:7cb8 b4 42 mov ah,0x42
0000:7cba cd 13 int 0x13 Chiama la routine di interrupt 13H (AH=42H), che legge i settori dal disco in modalità LBA
0000:7cbc 72 05 jb 0x7cc3 LBA non supportato: continua da 7CC3 H (prova con CHS)
0000:7cbe bb 00 70 mov bx,0x7000
0000:7cc1 eb 7d jmp 0x7d40 Continua da 7D40H
Determina la geometria dell’HD (CHS)
0000:7cc3 b4 08 mov ah,0x8
0000:7cc5 cd 13 int 0x13 Chiama la routine di interrupt 13H (AH=08H), che legge la geometria CHS del disco
0000:7cc7 73 0a jae 0x7cd3 Tutto ok, continua da 7CD3 H
0000:7cc9 f6 c2 80 test dl,0x80
0000:7ccc 0f 84 f3 00 je 0x7dc3 Non si tratta di un HD: continua da 7DC3 H (tale indirizzo si trova dentro la partition table - per un HD - infatti viene preso in considerazione soltanto in caso di floppy disk)
0000:7cd0 e9 8d 00 jmp 0x7d60 Continua da 7D60H
0000:7cd3 be 05 7c mov si,0x7c05
0000:7cd6 c6 44 ff 00 mov [si-0x01],0x00
Salva il numero di testine
0000:7cda 66 31 c0 xor eax,eax
0000:7cdd 88 f0 mov al,dh
0000:7cdf 40 inc ax
0000:7ce0 66 89 44 04 mov [si+0x04],eax
0000:7ce4 31 d2 xor dx,dx
0000:7ce6 88 ca mov dl,cl
0000:7ce8 c1 e2 02 shl dx,0x2
0000:7ceb 88 e8 mov al,ch
0000:7ced 88 f4 mov ah,dh
Salva il numero di cilindri
0000:7cef 40 inc ax
0000:7cf0 89 44 08 mov [si+0x08],ax
0000:7cf3 31 c0 xor ax,ax
0000:7cf5 88 d0 mov al,dl
0000:7cf7 c0 e8 02 shr al,0x2
Salva il numero di settori
0000:7cfa 66 89 04 mov [si],eax
Carica lo stage 2 (bottom half)
0000:7cfd 66 a1 44 7c mov eax,ds:0x7c44
0000:7d01 66 31 d2 xor edx,edx
0000:7d04 66 f7 34 div [si]
0000:7d07 88 54 0a mov [si+0x0a],dl Salva il settore iniziale
0000:7d0a 66 31 d2 xor edx,edx
0000:7d0d 66 74 04 div [si+0x04]
0000:7d11 88 54 0b mov [si+0x0b],dl Salva la testina iniziale
0000:7d14 89 44 0c mov [si+0x0c],ax Salva il cilindro iniziale
0000:7d17 3b 44 08 cmp ax,[si+0x08]
0000:7d1a 7d 3c jge 0x7d58 Geometria HD errata: continua da 7D58 H
Calcolo CHS (BIOS geometry translation)
0000:7d1c 8a 54 0d mov dl,[si+0x0d]
0000:7d1f c0 e2 06 shl dl,0x6
0000:7d22 8a 4c 0a mov cl,[si+0x0a]
0000:7d25 fe c1 inc cl
0000:7d27 08 d1 or cl,dl
0000:7d29 8a 6c 0c mov ch,[si+0x0c] Settore e parte più significativa del cilindro in CL, parte meno significativa del cilindro in CH
0000:7d2c 5a pop dx
0000:7d2d 8a 74 0b mov dh,[si+0x0b] Testina in DH
0000:7d30 bb 00 70 mov bx,0x7000
0000:7d33 8e c3 mov es,bx
0000:7d35 31 db xor bx,bx
0000:7d37 b8 01 02 mov ax,0x0201
0000:7d3a cd 13 int 0x13 Chiama la routine di interrupt 13H (AH=02H), che legge settori dal disco (CHS)
0000:7d3c 72 2a jb 0x7d68 Errore nella lettura dal disco: continua da 7D68H
0000:7d3e 8c c3 mov bx,es
Copia il contenuto del buffer appena letto, in un altra zona di memoria
0000:7d40 8e 06 48 7c mov es,[0x7c48]
0000:7d44 60 pusha
0000:7d45 1e push ds
0000:7d46 b9 00 01 mov cx,0x0100
0000:7d49 8e db mov ds,bx
0000:7d4b 31 f6 xor si,si
0000:7d4d 31 ff xor di,di
0000:7d4f fc cld
0000:7d50 f3 a5 repz movs es:[di],ds:[si]
0000:7d52 1f pop ds
0000:7d53 61 popa
0000:7d54 ff 26 42 7c jmp [0x7c42] Continua dall’indirizzo contenuto in 7C42 H (lo stage2)
Visualizza “Geom”
0000:7d58 be 7c 7d mov si,0x7d7c
0000:7d5b e8 40 00 call 0x7d9e Esegui la routine che inizia da 7D9E H
0000:7d5e eb 0e jmp 0x7d6e Continua da 7D6EH
Visualizza “Hard Disk”
0000:7d60 be 81 7d mov si,0x7d81
0000:7d63 e8 38 00 call 0x7d9e Esegui la routine che inizia da 7D9E H
0000:7d66 eb 06 jmp 0x7d6e Continua da 7D6EH
Visualizza “Read”
0000:7d68 be 8b 7d mov si,0x7d8b
0000:7d6b e8 30 00 call 0x7d9e Esegui la routine che inizia da 7D9E H
Visualizza “ Error”
0000:7d6e be 90 7d mov si,0x7d90
0000:7d71 e8 2a 00 call 0x7d9e Esegui la routine che inizia da 7D9E H
0000:7d74 eb fe jmp 0x7d74 STOP !
Subroutine visualizzazione messaggio (a partire da ds:[si])
0000:7d97 bb 01 00 mov bx,0x01
0000:7d9a b4 0e mov ah,0xe
0000:7d9c cd 10 int 0x10 Chiama la routine di interrupt 10H (AH=0EH), che visualizza un carattere sullo schermo
0000:7d9e ac lods al,ds:[si] Copia il carattere da visualizzare in AL
0000:7d9f 3c 00 cmp al,0x00 Confronta AL con 0
0000:7da1 75 f4 jne 0x7d97 Se il carattere non è 0 continua da 7D97 H (visualizzalo)
0000:7da3 c3 ret Ritorna all’istruzione successiva all’ultima CALL dalla quale eri provenuto
Attenzione che a volte come nel caso di CD il master boot record non è di 512 ma di 2048 byte, quindi nel caso voleste copiarlo dovete tenerne conto.
Se nella master partition table, ovvero la tabella delle partizioni primarie presente nel MBR è presente una partizione estesa, allora nel disco rigido verrà allocato lo spazio per una partizione estesa che potrà a sua volta contenere delle partizioni logiche, fino ad un massimo di 23.
Lo spazio iniziale della partizione estesa è chiamato EBR e rappresenta, più o meno, per la partizione estesa quello che l'MBR rappresenta per il disco. Ho detto più o meno perché in effetti sono un po diversi. Vediamo di esaminarne la struttura.
Struttura dell'Extended Boot Record (EBR)
|
||||
Offsets dall'inizio della partizione estesa |
Descrizione
|
Dimensione
(in bytes) |
||
000 - 1BD
|
Normalmente Inutilizzato
|
446
|
||
1BE - 1FD
|
Tabella delle partizioni EBR
|
64
|
||
1FE
|
55
|
Boot Record Signature
|
2
|
|
1FF
|
AA
|
Possiamo notare come la parte che la dimensione è la stessa dell'MBR, ma la parte che prima era occupata dal MBP ora rimane inutilizzata. Altre differenze le troviamo all'interno della sua tabella delle partizioni:
Tabella delle partizioni nell'EBR
|
|||
Offset dall'inizio della partizione |
Length (in bytes) |
Contenuto
|
|
1BE - 1CD
|
16
|
Descrizione Partizione Logica
|
|
1CE - 1DD
|
16
|
Se è presente, link alla partizione logica sucessiva
|
|
1DE - 1FD
|
32
|
Normalmente non usata
|
Quindi si usano solo 2 slot della tabella delle partizioni, il primo descrive la prima unità logica della partizione estesa, mentre il secondo, verrà usato, nel caso ci fosse una ulteriore partizione logica, come link a quest'ultima.
Quindi se volete copiare la struttura di una hard disk che contiene una partizione estesa, sappiate che dovrete esaminare e nel caso copiare anche l'EBR in essa contenuto, più tutti gli EBR nelle varie unità logiche.