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