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