0000

Anuncio
Organización del
Computador
Discos y almacenamiento
Discos y almacenamiento
Discos magnéticos.
z Discos ópticos.
z Cintas magnéticas.
z Discos flash.
z Interfaces de discos.
z RAID (Redundant Array of Inexpensive
Disks).
z
Estructura de un Disco Flexible
Capacidad = Sides * tracks_per_side * Sectors_per_track * 512 [bytes per sector]
Geometría de un Disco Rígido
3600 RPM
Grabación de la Información en
Disco
“To understand how information is written on a hard drive, you must first
forget the concept of binary coding. Zeros and ones aren't stored on the
magnetic surface of a hard drive. It's impossible to represent these two
states as "magnetized” and "not magnetized".”
- PC Interno - Michael Tischer
Emplea 12 Flux reversal para
codificar el Nº binario 10110010
Método de grabación FM
Método de grabación RLL
Toma 5 Flux reversal para codificar el
Nº binario 10110010
Método de grabación RLL
Bit pattern
Código RLL 2.7
000
10
010
0010
11
011
001
000100
0100
100100
00100100
1000
001000
00001000
Toma 4 Flux reversal para
codificar el Nº binario 10110010
Tabla de códigos para RLL 2.7
Estructura Lógica
Vista desde el BIOS y los
servicios de bajo nivel del Sistema
Operativo
Estructura de un sector de
Disco
Organización de la información
en el disco
z
z
z
Los Sistemas Operativos almacenan la información
en los discos en archivos
Los archivos se organizan bajo una estructura de
información que se conoce como file system.
Cada sistema operativo establece su propio file
system.
z
z
El mas popular (lo interpretan TODOS los sistemas
operativos) es el FAT, que introdujo en su época el sistema
Operativo MS DOS.
Actualmente, por su notable sencillez y popularidad, es
ideal para organizar disquetes, en especial aquellos que
contendrán el programa de arranque del Sistema Operativo
Organización de la información en
un disco flexible*
Contiene el programa de carga
del Sistema Operativo
FAT=File Allocation Table.
Lista enlazada que contiene la
referencia a los sectores del disco
en los que están almacenados los
archivos.
Copia de la FAT (única medida de
consistencia del File System)
Directorio Raíz: Contiene las
referencias a archivos y
subdirectorios
Area en donde están
almacenados los archivos
* O un disco rígido formateado para MS-DOS
Boot Sector
FAT
FAT #2
Directorio
Root
Zona de
almacenamiento
Boot Sector: BIOS Parameter Block
BIOS Parameter Block
(62 bytes)
[BITS 16]
ORG 0
jmp
START
OEM_ID
db "TD3 OS"
BytesPerSector
dw 0x0200
SectorsPerCluster
db 0x01
ReservedSectors
dw 0x0001
TotalFATs
db 0x02
MaxRootEntries
dw 0x00E0
TotalSectorsSmall
dw 0x0B40
MediaDescriptor
db 0xF0
SectorsPerFAT
dw 0x0009
SectorsPerTrack
dw 0x0012
NumHeads
dw 0x0002
HiddenSectors
dd 0x00000000
TotalSectorsLarge
dd 0x00000000
DriveNumber
db 0x00
Flags
db 0x00
Signature
db 0x29
VolumeID
dd 0xFFFFFFFF
VolumeLabel
db "QUASI BOOT"
SystemID
db "FAT12
"
;…..A partir de aquí se colocan los datos y
el código del programa de arranque
Boot Sector
FAT
FAT #2
Directorio
Root
Zona de
almacenamiento
Directorio
Una entrada de directorio es una estructura de 32
bytes que contiene el descriptor de un archivo cuyo
contenido estará en la Zona de Almacenamiento, y
cuyos clusters están en la FAT
0 1 2 3 4 5 6 7 8 9 A B C D E F
Nombre
Extensión
Reservados
10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F
Reservados
Hora Fecha 1er.
creaciónCreación Cluster
Longitud
Atributos
Bit
0
1
2
3
4
5
6
7
Byte 19. aaaaaaam
Significado
De lectura solamente.
Byte 18. mmmddddd
Archivo no visible (hidden).
Archivo propio del sistema.
Atributo de volúmen. Esta entrada al directorio contiene el "nombre"
del disco.Puede aparecer solamente en el directorio principal.
Subdirectorio.
Bit de actualización. Es puesto en 1 cuando el archivo es creado o
modificado.
Reservado.
Byte 17. hhhhhmmm
Reservado.
Byte 16. mmmsssss
Boot Sector
FAT
FAT #2
Directorio
Root
Zona de
almacenamiento
FAT 16
Boot Sector
0000 Cluster Vacío
FFF7 Cluster Dañado
FFF8-FFFF Ultimo Cluster
Cualquier otro valor: Next Cluster
Arch1.txt 0002
FAT
Arch3.txt 0006
Arch2.txt 0003
0
1
2
3
4
5
Arch4.txt 0008
6
7
8
9
FDFF FFFF 0005 0004 0007 FFFF FFFF FFFF 0009 FFFF
Reservados
En este caso el algoritmo es simple.
El Nro. de Cluster se multiplica por 2
Cada entrada de 16 bits es un puntero a la siguiente
FAT #2
Directorio
Root
Zona de
almacenamiento
FAT 12
12 bits
Siguiente Cluster
Siguiente Cluster
Boot Sector
1 byte
2da. Entrada
000 Cluster Vacío
FF7 Cluster Dañado
1er. Entrada
FF8-FFF Ultimo Cluster
Cualquier otro valor 1er. Cluster
Next Cluster
FAT
FAT #2
Directorio
Root
Zona de
almacenamiento
FAT 12
12 bits
Field Value
N = (Field value) * 1.5
Lee word a partir de N luego el nuevo
offset para el próximo elemento se
obtiene de:
Si N es entero:
WORD [N] & 0FFFh
Si N no es entero
WORD [N] >> 4
1 byte
Boot Sector
2da. Entrada
000 Cluster Vacío
FF7 Cluster Dañado
1er. Entrada
FF8-FFF Ultimo Cluster
Cualquier otro valor 1er. Cluster N
Next Cluster
FAT
FAT #2
N
Directorio
Root
Zona de
almacenamiento
FAT 12
Arch1.txt 0002
2 * 1,5 = 3
entero => Next = 4005 & 0FFF = 5
5 * 1,5= 7,5
7
No entero => Next = FFF0>>4 = FFF
Fin de Archivo
Arch1.txt, ocupa Clusters 2, y 5
Arch4.txt 0008
8 * 1,5 = 12
entero => Next = 0090 & 0FFF = 9
9 * 1,5= 13,5
13
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
FD
FF
FF
05
40
00
07
F0
FF
FF
FF
FF
09
F0
FF
00
No entero => Next = FFF0>>4 = FFF
Fin de Archivo
Arch2.txt, ocupa Clusters
8y9
Arch2.txt 0003
3 * 1,5 = 4,5
4
No entero => Next = 0040 >> 4 = 4
4 * 1,5= 6
entero => Next = F007 & =FFF = 7
7 * 1,5= 10,5
10
No entero => Next = FFFF >>4 = FFF
Fin de Archivo
Arch2.txt, ocupa Clusters 3, 4, y 7
Arch3.txt 0006 6 * 1,5 = 9
entero => Next = FFFF & 0FFF = FFF
Fin de Archivo
Arch2.txt, ocupa Cluster 6 solamente
Algoritmo para FAT 12
LOAD_IMAGE:
mov
ax, WORD [cluster] ;cluster a leer
pop
bx
;buffer en donde leer el cluster
call
Cluster2LBA
;convierte cluster a modo de dirección LBA
xor
cx, cx
mov
cl, BYTE [SectorsPerCluster];cantidad de sectores por cluster
call
ReadSectors
push
bx
;calcula siguiente cluster
mov
ax, WORD [cluster] ;cluster actual
mov
cx, ax
;copia 1 del cluster actual
mov
dx, ax
;copia 2 del cluster actual
shr
dx, 0x0001
;copia 2 = copia 2 / 2
add
cx, dx
;copia 1 = copia 1 + (copia 2/2) = mult * 1,5 ;-)
mov
bx, 0x0200
;bx apunta al buffer que contiene la FAT
add
bx, cx
;ahora bx apunta a la entrada de la FAT
mov
dx, WORD [bx]
;leemos 2 bytes de la FAT
test
ax, 0x0001
;FAT de 12 bits, trata diferente a las entradas
;pares de las impares.
jnz
.ODD_CLUSTER
.EVEN_CLUSTER:
;Formula "Microsoft“:(byte N) or (byte(N+1) and 0Fh) << 8
;Intel almacena en little endian
;dh = byte N+1, dl = byte N
and
dx, 0x0FFF
;por lo tanto solo con la and queda resuelto
jmp
.DONE
.ODD_CLUSTER:
;Fórmula "Microsoft“:(byte N >> 4) OR ((byte N+1) << 4)
shr
dx, 0x0004
;basta con un shift general 4 bits a la derecha
.DONE:
mov
WORD [cluster], dx ;DX tiene el nuevo cluster. Lo guardamos como actual
cmp
dx, 0x0FF0
;testea que no sea EOF
jb
LOAD_IMAGE
;Si es menor vuelve a leer siguiente cluster
Organización de la información en
un
disco
rígido:
Master
Boot
Record
OFFSET 0 1 2 3 4 5 6 7 8 9 A B C D E F *0123456789ABCDEF*
Se trata
del primer sector físico del Disco Rígido
fa33c08e d0bc007c 8bf45007 501ffbfc *.3.....|..P.P...*
000000
000010
000020
000030
000040
000050
000060
000070
000080
000090
0000a0
0000b0
0000c0
0000d0
0000e0
0000f0
0001b0
0001c0
0001d0
0001e0
0001f0
bf0006b9 0001f2a5 ea1d0600 00bebe07
b304803c 80740e80 3c00751c 83c610fe
cb75efcd 188b148b 4c028bee 83c610fe
cb741a80 3c0074f4 be8b06ac 3c00740b
56bb0700 b40ecd10 5eebf0eb febf0500
bb007cb8 010257cd 135f730c 33c0cd13
4f75edbe a306ebd3 bec206bf fe7d813d
55aa75c7 8bf5ea00 7c000049 6e76616c
69642070 61727469 74696f6e 20746162
6c650045 72726f72 206c6f61 64696e67
206f7065 72617469 6e672073 79737465
6d004d69 7373696e 67206f70 65726174
696e6720 73797374 656d0000 00000000
00000000 00000000 00000000 00000000
TO 0001af ídem línea anterior
00000000 00000000 00000000 00008001
0100060d fef83e00 00000678 0d000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000
00000000 00000000 00000000 000055aa
*................*
*.....t....u.....*
*.u......L.......*
*.t....t.......t.*
*V.......^.......*
*..|...W.._s.3...*
*Ou...........}.=*
*U.u.....|..Inval*
*id partition tab*
*le.Error loading*
* operating syste*
*m.Missing operat*
*ing system......*
*................*
*................*
*...........x....*
*................*
*................*
*..............U.*
Master Boot Record
Bit 7 es el flag de partición activa. Los bits 6-0
son cero (caso contrario este byte contiene el
número de drive desde donde bootear de
modo que la partición activa por default se
encuentra siempre en drive 80H, es decir, el
primer dicso duro).
CHS de inicio de la partición en formato INT
13
Byte de tipo de Partición
CHS de final de la partición en formato INT 13
Cant. de Sectores en particiones
precedentes.
0
DL
80
00
00
00
1
DH
01
00
00
00
2
CL
01
81
00
00
3
CH
00
95
00
00
4
TB
06
05
00
00
5
DH
0e
0e
00
00
6
CL
be
fe
00
00
7
CH
94
7d
00
00
8 9 A B
LBA.....
3e000000
4a610900
00000000
00000000
C D E F
SIZE....
0c610900
724e0300
00000000
00000000
1st
2nd
3rd
4th
entry
entry
entry
entry
Programa maestro de arranque
Desensamblado del código: (1 / 4)
BEGIN:
NOW AT 0000:7C00, RELOCATE
0000:7C00
0000:7C01
0000:7C03
0000:7C05
0000:7C08
0000:7C0A
0000:7C0B
0000:7C0C
0000:7C0D
0000:7C0E
0000:7C0F
0000:7C10
0000:7C13
0000:7C16
0000:7C17
0000:7C18
FA
33C0
8ED0
BC007C
8BF4
50
07
50
1F
FB
FC
BF0006
B90001
F2
A5
EA1D060000
CLI
XOR
MOV
MOV
MOV
PUSH
POP
PUSH
POP
STI
CLD
MOV
MOV
REPNZ
MOVSW
JMP
AX,AX
SS,AX
SP,7C00
SI,SP
AX
ES
AX
DS
DI,0600
CX,0100
0000:061D
NEW_LOCATION:
0000:061D BEBE07
0000:0620 B304
SEARCH_LOOP1:
disable int's
set stack seg to 0000
set stack ptr to 7c00
SI now 7c00
ES now 0000:7c00
DS now 0000:7c00
allow int's
clear direction
DI now 0600
move 256 words (512 bytes)
move MBR from 0000:7c00
to 0000:0600
jmp to NEW_LOCATION
NOW AT 0000:0600
MOV
MOV
SI,07BE
BL,04
point to first table entry
there are 4 table entries
SEARCH FOR AN ACTIVE ENTRY
Programa maestro de arranque
Desensamblado del código: (2 / 4)
0000:0622
0000:0625
0000:0627
0000:062A
0000:062C
0000:062F
0000:0631
0000:0633
803C80
740E
803C00
751C
83C610
FECB
75EF
CD18
CMP
JZ
CMP
JNZ
ADD
DEC
JNZ
INT
BYTE PTR [SI],80
FOUND_ACTIVE
BYTE PTR [SI],00
NOT_ACTIVE
SI,+10
BL
SEARCH_LOOP1
18
FOUND_ACTIVE:
0000:0635 8B14
0000:0637 8B4C02
0000:063A 8BEE
FOUND THE ACTIVE ENTRY
MOV
MOV
MOV
SEARCH_LOOP2:
0000:063C
0000:063F
0000:0641
0000:0643
0000:0646
83C610
FECB
741A
803C00
74F4
NOT_ACTIVE:
is this the active entry?
yes
is this an inactive entry?
no
incr table ptr by 16
decr count
jmp if not end of table
GO TO ROM BASIC
DX,[SI]
CX,[SI+02]
BP,SI
set DH/DL for INT 13 call
set CH/CL for INT 13 call
save table ptr
MAKE SURE ONLY ONE ACTIVE ENTRY
ADD
DEC
JZ
CMP
JZ
SI,+10
BL
READ_BOOT
BYTE PTR [SI],00
SEARCH_LOOP2
incr table ptr by 16
decr count
jmp if end of table
is this an inactive entry?
yes
MORE THAN ONE ACTIVE ENTRY FOUND
Programa maestro de arranque
Desensamblado del código: (3 / 4)
0000:0648 BE8B06
MOV
SI,068B
DISPLAY_MSG:
0000:064B
0000:064C
0000:064E
0000:0650
0000:0651
0000:0654
0000:0656
0000:0658
0000:0659
AC
3C00
740B
56
BB0700
B40E
CD10
5E
EBF0
DISPLAY MESSAGE LOOP
LODSB
CMP
JZ
PUSH
MOV
MOV
INT
POP
JMP
AL,00
HANG
SI
BX,0007
AH,0E
10
SI
DISPLAY_MSG
HANG:
0000:065B EBFE
INT13RTRY:
get char of message
end of message
yes
save SI
screen attributes
output 1 char of message
to the display
restore SI
do it again
HANG THE SYSTEM LOOP
JMP
HANG
READ_BOOT:
0000:065D BF0500
display "Invld prttn tbl"
sit and stay!
READ ACTIVE PARITION BOOT RECORD
MOV
DI,0005
INT 13 retry count
INT 13 RETRY LOOP
Programa maestro de arranque
Desensamblado del código: (4 / 4)
0000:0660
0000:0663
0000:0666
0000:0667
0000:0669
0000:066A
0000:066C
0000:066E
0000:0670
0000:0671
0000:0673
0000:0676
BB007C
B80102
57
CD13
5F
730C
33C0
CD13
4F
75ED
BEA306
EBD3
MOV
MOV
PUSH
INT
POP
JNB
XOR
INT
DEC
JNZ
MOV
JMP
INT13OK:
0000:0678
0000:067B
0000:067E
0000:0682
0000:0684
0000:0686
BEC206
BFFE7D
813D55AA
75C7
8BF5
EA007C0000
BX,7C00
AX,0201
DI
13
DI
INT13OK
AX,AX
13
DI
INT13RTRY
SI,06A3
DISPLAY_MSG
read 1 sector
save DI
read sector into 0000:7c00
restore DI
jmp if no INT 13
call INT 13 and
do disk reset
decr DI
if not zero, try again
display "Errr ldng systm"
jmp to display loop
INT 13 ERROR
MOV
MOV
CMP
JNZ
MOV
JMP
SI,06C2
DI,7DFE
WORD PTR [DI],AA55
DISPLAY_MSG
SI,BP
0000:7C00
"missing op sys"
point to signature
is signature correct?
no
set SI
JUMP TO THE BOOT SECTOR
WITH SI POINTING TO
PART TABLE ENTRY
Boot: Vuelco para DOS (1/2)
OFFSET
000000
000010
000020
000030
000040
000050
000060
000070
000080
000090
0000a0
0000b0
0000c0
0000d0
0000e0
0000f0
0 1 2 3
eb3c904d
02e00040
00000000
4d452020
c08ed0bc
1653bf3e
0f8b0e18
cd137279
890e207c
161e7c03
7ca3497c
1e0b7c03
00bb0005
b001e8ac
a6750a8d
e85f0033
4 5 6 7
53444f53
0bf00900
0000295a
20204641
007c1607
7cb90b00
7c884df9
33c03906
a0107cf7
060e7c83
89164b7c
c348f7f3
8b16527c
0072168b
7f20b90b
c0cd165e
8 9 A B
352e3000
12000200
5418264e
54313220
bb780036
fcf3a406
894702c7
137c7408
26167c03
d200a350
b82000f7
0106497c
a1507ce8
fbb90b00
00f3a674
1f8f048f
C D E F
02010100
00000000
4f204e41
2020fa33
c5371e56
1fc645fe
073e7cfb
8b0e137c
061c7c13
7c891652
26117c8b
83164b7c
9200721d
bee67df3
18be9e7d
4402cd19
*0123456789ABCDEF*
*...MSDOS5.0.....*
*...@............*
*......)ZT..NO NA*
*ME
FAT12
.3*
*.....|...x.6.7.V*
*.S..|.........E.*
*....|.M..G....|.*
*..ry3.9..|t....|*
*.. |..|...|...|.*
*..|...|....P|..R*
*|.I|..K|. ....|.*
*..|..H....I|..K|*
*......R|.P|...r.*
*.....r........}.*
*.u... .....t...}*
*._.3...^....D...*
Boot: Vuelco para DOS (2/2)
OFFSET
000100
000110
000120
000130
000140
000150
000160
000170
000180
000190
0001a0
0001b0
0001c0
0001d0
0001e0
0001f0
0 1 2 3
585858eb
f7e30306
505251e8
72bb0501
157c8a16
7000ac0a
3b16187c
33d2f736
c3b4028b
ca86e98a
4e6f6e2d
6f722064
65706c61
20616e79
6164790d
534d5344
4 5 6 7
e88b471a
497c1316
3a0072d8
0083d200
247c8b1e
c07429b4
7319f736
1a7c8816
164d7cb1
16247c8a
53797374
69736b20
63652061
206b6579
0a00494f
4f532020
8 9 A B
48488a1e
4b7cbb00
b001e854
031e0b7c
497ca14b
0ebb0700
187cfec2
257ca34d
06d2e60a
36257ccd
656d2064
6572726f
6e642070
20776865
20202020
20535953
C D E F
0d7c32ff
07b90300
00595a58
e2e28a2e
7cea0000
cd10ebf2
88164f7c
7cf8c3f9
364f7c8b
13c30d0a
69736b20
720d0a52
72657373
6e207265
20205359
000055aa
*0123456789ABCDEF*
*XXX...G.HH...|2.*
*....I|..K|......*
*PRQ.:.r....T.YZX*
*r..........|....*
*.|..$|..I|.K|...*
*p....t).........*
*;..|s..6.|....O|*
*3..6.|..%|.M|...*
*.....M|.....6O|.*
*.....$|.6%|.....*
*Non-System disk *
*or disk error..R*
*eplace and press*
* any key when re*
*ady...IO
SY*
*SMSDOS
SYS..U.*
Boot Sector: BIOS Parameter
Los primeros 62 bytes del boot sector
se conocen como BIOS Parameter Block
Block
(BPB). Su layout se muestra a continuación
.
db
db
db
dw
db
dw
db
dw
dw
db
dw
dw
dw
dd
dd
db
db
db
dd
db
db
JMP instruction
NOP instruction
OEMname
bytesPerSector
sectPerCluster
reservedSectors
numFAT
numRootDirEntries
numSectors
mediaType
numFATsectors
sectorsPerTrack
numHeads
numHiddenSectors
numSectorsHuge
driveNum
reserved
signature
volumeID
volumeLabel
fileSysType
at 7c00 size 2 = eb3c
7c02
1
90
7c03
8
'MSDOS5.0'
7c0b
2
0200
7c0d
1
01
7c0e
2
0001
7c10
1
02
7c11
2
00e0
7c13
2
0b40(ignore numSectorsHuge)
7c15
1
f0
7c16
2
0009
7c18
2
0012
7c1a
2
0002
7c1c
4
00000000
7c20
4
00000000
7c24
1
00
7c25
1
00
7c26
1
29
7c27
4
5a541826
7c2b
11
'NO NAME
'
7c36
8
'FAT12
'
Programa de arranque para DOS.
Desensamblado del código: (1 / 8).
START:
START OF BOOT SECTOR PROGRAM
0000:7C3E
0000:7C3F
0000:7C41
0000:7C43
0000:7C46
0000:7C47
FA
33C0
8ED0
BC007C
16
07
CLI
XOR
MOV
MOV
PUSH
POP
0000:7C48
0000:7C4B
0000:7C4C
0000:7C4E
0000:7C4F
0000:7C50
0000:7C51
BB7800
36
C537
1E
56
16
53
MOV
SS:
LDS
PUSH
PUSH
PUSH
PUSH
0000:7C52
0000:7C55
0000:7C58
0000:7C59
0000:7C5A
0000:7C5B
0000:7C5C
BF3E7C
B90B00
FC
F3
A4
06
1F
MOV
MOV
CLD
REPZ
MOVSB
PUSH
POP
interrupts off
AX,AX
set AX to zero
SS,AX
SS is now zero
SP,7C00
SP is now 7c00
SS
also set ES
ES
to zero
The INT 1E vector is at 0000:0078.
Get the address that the vector points to
into the DS:SI registers.
BX,0078
BX is now 78
SI,[BX]
DS:SI is now [0:78]
DS
save DS:SI -SI
saves param tbl addr
SS
save SS:BX -BX
saves INT 1E address
Move the diskette param table to 0000:7c3e.
DI,7C3E
DI is address of START
CX,000B
count is 11
clear direction
move the diskette param
table to 0000:7c3e
ES
also set DS
DS
to zero
Programa de arranque para DOS.
Desensamblado del código: (2 / 8).
Alter some of the diskette param table data.
0000:7C5D C645FE0F
MOV
BYTE PTR [DI-02],0F
0000:7C61 8B0E187C
0000:7C65 884DF9
MOV
MOV
CX,[7C18]
[DI-07],CL
change head settle time
at 0000:7c47
sectors per track
save at 0000:7c42
Change INT 1E so that it points to the
altered Diskette param table at 0000:7c3e.
0000:7C68 894702
0000:7C6B C7073E7C
MOV
MOV
[BX+02],AX
WORD PTR [BX],7C3E
change INT 1E segment
change INT 1E offset
Call INT 13 with AX=0000, disk reset, so
that the new diskette param table is used.
0000:7C6F FB
0000:7C70 CD13
0000:7C72 7279
STI
INT
JB
13
TALK
interrupts on
do diskette reset call
jmp if any error
Detemine the starting sector address of
the root directory as an LBA.
0000:7C74
0000:7C76
0000:7C7A
0000:7C7C
0000:7C80
33C0
3906137C
7408
8B0E137C
890E207C
XOR
CMP
JZ
MOV
MOV
AX,AX
[7C13],AX
SMALL_DISK
CX,[7C13]
[7C20],CX
AX is now zero
number sectros zero?
yes
number of sectors
save in huge num sects
Programa de arranque para DOS.
Desensamblado del código: (3 / 8).
SMALL_DISK:
0000:7C84
0000:7C87
0000:7C8B
0000:7C8F
0000:7C93
0000:7C97
0000:7C9A
0000:7C9D
0000:7CA1
0000:7CA4
A0107C
F726167C
03061C7C
13161E7C
03060E7C
83D200
A3507C
8916527C
A3497C
89164B7C
MOV
MUL
ADD
ADC
ADD
ADC
MOV
MOV
MOV
MOV
AL,[7C10]
WORD PTR [7C16]
AX,[7C1C]
DX,[7C1E]
AX,[7C0E]
DX,+00
[7C50],AX
[7C52],DX
[7C49],AX
[7C4B],DX
number of FAT tables
number of fat sectors
number of hidden sectors
number of hidden sectors
number of reserved sectors
number of reserved sectors
save start addr
of root dir (as LBA)
save start addr
of root dir (as LBA)
Determine sector address of first sector
in the data area as an LBA.
0000:7CA8
0000:7CAB
0000:7CAF
0000:7CB3
0000:7CB5
0000:7CB6
0000:7CB8
0000:7CBC
B82000
F726117C
8B1E0B7C
03C3
48
F7F3
0106497C
83164B7C00
MOV
MUL
MOV
ADD
DEC
DIV
ADD
ADC
AX,0020
WORD PTR [7C11]
BX,[7C0B]
AX,BX
AX
BX
[7C49],AX
WORD PTR [7C4B],+00
size of a dir entry (32)
number of root dir entries
bytes per sector
add to start addr
of root dir (as LBA)
Programa de arranque para DOS.
Desensamblado del código: (4 / 8).
Read the first root dir sector into 0000:0500.
0000:7CC1
0000:7CC4
0000:7CC8
0000:7CCB
0000:7CCE
0000:7CD0
0000:7CD2
0000:7CD5
0000:7CD7
0000:7CD9
0000:7CDC
0000:7CDF
0000:7CE0
0000:7CE1
0000:7CE3
0000:7CE6
0000:7CE9
0000:7CEA
0000:7CEB
BB0005
8B16527C
A1507C
E89200
721D
B001
E8AC00
7216
8BFB
B90B00
BEE67D
F3
A6
750A
8D7F20
B90B00
F3
A6
7418
TALK:
MOV
MOV
MOV
CALL
JB
MOV
CALL
JB
MOV
MOV
MOV
REPZ
CMPSB
JNZ
LEA
MOV
REPZ
CMPSB
JZ
BX,0500
DX,[7C52]
AX,[7C50]
CONVERT
TALK
AL,01
READ_SECTORS
TALK
DI,BX
CX,000B
SI,7DE6
addr to read into
get start of address
of root dir (as LBA)
call conversion routine
jmp is any error
read 1 sector
read 1st root dir sector
jmp if any error
addr of 1st dir entry
count is 11
addr of file names
is this "IO.SYS"?
TALK
DI,[BX+20]
CX,000B
no
addr of next dir entry
count is 11
is this "MSDOS.SYS"?
FOUND_FILES
they are equal
Display "Non-System disk..." message, wait for user
to hit a key, restore the INT 1E vector and then call
INT 19 to start boot processing all over again.
Programa de arranque para DOS.
Desensamblado del código: (5 / 8).
0000:7CED BE9E7D
0000:7CF0 E85F00
0000:7CF3 33C0
0000:7CF5 CD16
0000:7CF7 5E
0000:7CF8 1F
0000:7CF9 8F04
0000:7CFB 8F4402
0000:7CFE CD19
SETUP_TALK:
0000:7D00 58
0000:7D01 58
0000:7D02 58
0000:7D03 EBE8
FOUND_FILES:
MOV
CALL
XOR
INT
POP
POP
POP
POP
INT
SI,7D9E
MSG_LOOP
AX,AX
16
SI
DS
[SI]
[SI+02]
19
"Non-System disk..."
display message
INT 16 function
read keyboard
get INT 1E vector's
address
restore the INT 1E
vector's data
CALL INT 19 to try again
POP
POP
POP
JMP
AX
AX
AX
TALK
pop
pop
pop
now
junk
junk
junk
talk
off stack
off stack
off stack
to the user
Compute the sector address of the first
sector of IO.SYS.
0000:7D05
0000:7D08
0000:7D09
0000:7D0A
0000:7D0E
0000:7D10
0000:7D12
0000:7D16
8B471A
48
48
8A1E0D7C
32FF
F7E3
0306497C
13164B7C
MOV
DEC
DEC
MOV
XOR
MUL
ADD
ADC
AX,[BX+1A]
AX
AX
BL,[7C0D]
BH,BH
BX
AX,[7C49]
DX,[7C4B]
get starting cluster num
subtract 1
subtract 1
sectors per cluster
multiply
add start addr of
root dir (as LBA)
Programa de arranque para DOS.
Desensamblado del código: (6 / 8).
Read IO.SYS into memory at 0000:0700. IO.SYS
is 3 sectors long.
0000:7D1A BB0007
MOV
BX,0700
0000:7D1D B90300
MOV
CX,0003
address to read into
read 3 sectors
READ_LOOP:
Read the first 3 sectors of IO.SYS
(IO.SYS is much longer than 3 sectors).
0000:7D20
0000:7D21
0000:7D22
0000:7D23
0000:7D26
0000:7D28
0000:7D2A
0000:7D2D
0000:7D2E
0000:7D2F
0000:7D30
0000:7D32
0000:7D35
0000:7D38
0000:7D3C
50
52
51
E83A00
72D8
B001
E85400
59
5A
58
72BB
050100
83D200
031E0B7C
E2E2
PUSH
PUSH
PUSH
CALL
JB
MOV
CALL
POP
POP
POP
JB
ADD
ADC
ADD
LOOP
AX
DX
CX
CONVERT
SETUP_TALK
AL,01
READ_SECTORS
CX
DX
AX
TALK
AX,0001
DX,+00
BX,[7C0B]
READ_LOOP
save AX
save DX
save CX
call conversion routine
jmp if error
read one sector
read one sector
restore CX
restore DX
restore AX
jmp if any INT 13 error
add one to the sector addr
add one to the sector addr
incr mem addr by sect size
read next sector
Programa de arranque para DOS.
Desensamblado del código: (7 / 8).
0000:7D3E
0000:7D42
0000:7D46
0000:7D4A
0000:7D4D
0000:7D52
0000:7D53
0000:7D55
0000:7D57
0000:7D59
0000:7D5C
0000:7D5E
8A2E157C
MOV
8A16247C
MOV
8B1E497C
MOV
A14B7C
MOV
EA00007000 JMP
MSG_LOOP:
AC
0AC0
7429
B40E
BB0700
CD10
EBF2
CONVERT:
0000:7D60 3B16187C
0000:7D64 7319
0000:7D66 F736187C
Leave information in the AX, BX, CX and DX
registers for IO.SYS to use. Finally,
jump to IO.SYS at 0070:0000.
CH,[7C15]
media type
DL,[7C24]
drive number
BX,[7C49]
get start addr of
AX,[7C4B]
root dir (as LBA)
0070:0000
JUMP TO 0070:0000
LODSB
OR
JZ
MOV
MOV
INT
JMP
This routine displays a message using
INT 10 one character at a time.
The message address is in DS:SI.
get message character
AL,AL
end of message?
RETURN
jmp if yes
AH,0E
display one character
BX,0007
video attrbiutes
10
display one character
MSG_LOOP
do again
CMP
JNB
DIV
This routine
converts a sector address (an LBA) to
a CHS address. The LBA is in DX:AX.
DX,[7C18]
hi part of LBA > sectPerTrk?
SET_CARRY
jmp if yes
WORD PTR [7C18]
div by sectors per track
Programa de arranque para DOS.
Desensamblado del código: (8 / 8).
0000:7D6A
0000:7D6C
0000:7D70
0000:7D72
0000:7D76
0000:7D7A
0000:7D7D
0000:7D7E
FEC2
INC
DL
add 1 to sector number
88164F7C
MOV
[7C4F],DL
save sector number
33D2
XOR
DX,DX
zero DX
F7361A7C
DIV
WORD PTR [7C1A]
div number of heads
8816257C
MOV
[7C25],DL
save head number
A34D7C
MOV
[7C4D],AX
save cylinder number
F8
CLC
clear carry
C3
RET
return
SET_CARRY:
0000:7D7F F9
STC
set carry
RETURN:
0000:7D80 C3
RET
return
READ_SECTORS:
The caller of this routine supplies: AL = number of sectors to read
ES:BX = memory location to read into and CHS address to read from in
memory locations 7c25 and 7C4d-7c4f.
0000:7D81 B402
MOV
AH,02
INT 13 read sectors
0000:7D83 8B164D7C
MOV
DX,[7C4D]
get cylinder number
0000:7D87 B106
MOV
CL,06
shift count
0000:7D89 D2E6
SHL
DH,CL
shift upper cyl left 6 bits
0000:7D8B 0A364F7C
OR
DH,[7C4F]
or in sector number
0000:7D8F 8BCA
MOV
CX,DX
move to CX
0000:7D91 86E9
XCHG
CH,CL
CH=cyl lo, CL=cyl hi + sect
0000:7D93 8A16247C
MOV
DL,[7C24]
drive number
0000:7D97 8A36257C
MOV
DH,[7C25]
head number
0000:7D9B CD13
INT
13
read sectors
0000:7D9D C3
RET
return
Especificaciones de un disco duro
RAID (Redundant Array of
Inexpensive Disks)
z
z
Definido en 1988 en un paper de David
Patterson et al, de la Universidad de California
Berkeley.
5 niveles:
- Level 0: une varios discos como si fueran uno
solo, sin tolerancia a fallos.
- Level 1: espejo de discos (mirroring).
- Level 2: con código de corrección de errores
(código de Hamming).
- Level 3 y 4: con códigos de paridad.
- Level 0 + 1: varios discos con espejado.
RAID 0
RAID 0
RAID 0
RAID 1
RAID 1
RAID 2
RAID 2
RAID 3
RAID 3
RAID 4
RAID 5
RAID 6
Discos magnéticos: sectores
físicos y lógicos
Discos ópticos: mecanismo de
lectura de un CDROM
Corte de un CDROM
Acrílico Protector
Aluminio
Hoyo
Pit
Policarbonato Plástico
Laser Transmitido
Laser Transmitido
Laser Recibido
Estructura de pistas de un CDROM
Formato de sector de un CDROM
Formato de grabación en un
CDROM
Estructura de un DVD
Cinta magnética
Cinta magnética de 9 pistas
Discos flash
Interfaces de discos
IDE/ATA: Integrated Drive
Electronics/Advanced Technology
Attachment.
z SATA: Serial ATA.
z SCSI: Small Computer System Interface.
z Otras interfaces: Pccard, SDcard.
z
Descargar