Dispositivos de almacenamiento Masivo de Información Universidad Tecnológica Nacional - FRBA Técnicas Digitales III Autor: Alejandro Furfaro 1 Estructura de un Disco Flexible Capacidad = Sides * tracks_per_side * Sectors_per_track * 512 [bytes per sector] Autor: Alejandro Furfaro 2 Geometría de un Disco Rígido 3600 RPM Autor: Alejandro Furfaro 3 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 Método de grabación FM Emplea Emplea12 12Flux Fluxreversal reversalpara para codificar codificarelelNº Nºbinario binario10110010 10110010 Autor: Alejandro Furfaro 4 Grabación de la Información en Disco Método de grabación MFM Toma Toma55Flux Fluxreversal reversalpara paracodificar codificarelel Nº Nºbinario binario10110010 10110010 Autor: Alejandro Furfaro 5 Grabación de la Información en Disco 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 Autor: Alejandro Furfaro Toma Toma44Flux Fluxreversal reversalpara para codificar codificarelelNº Nºbinario binario10110010 10110010 Tabla de códigos para RLL 2.7 6 Estructura Lógica Vista desde el BIOS y los servicios de bajo nivel del Sistema Operativo Autor: Alejandro Furfaro 7 Estructura de un sector de Disco Autor: Alejandro Furfaro 8 Discos Rígidos: Master Boot Record Se trata del primer sector físico del Disco Rígido OFFSET 000000 000010 000020 000030 000040 000050 000060 000070 000080 000090 0000a0 0000b0 0000c0 0000d0 0000e0 0000f0 0001b0 0001c0 0001d0 0001e0 0001f0 0 1 2 3 4 5 6 7 8 9 A B C D E F fa33c08e d0bc007c 8bf45007 501ffbfc 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 Autor: Alejandro Furfaro *0123456789ABCDEF* *.3.....|..P.P...* *................* *.....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.* 9 Discos Rígidos: Master Boot Record Bit Bit77es eselelflag flagde departición particiónactiva. activa.Los Losbits bits6-0 6-0 son cero (caso contrario este byte contiene son cero (caso contrario este byte contieneelel número númerode dedrive drivedesde desdedonde dondebootear bootearde de modo que la partición activa por default modo que la partición activa por defaultse se encuentra siempre en drive 80H, es decir, encuentra siempre en drive 80H, es decir,elel primer primerdicso dicsoduro). duro). CHS CHSde deinicio iniciode delalapartición particiónen enformato formatoINT INT 13 13 Byte Bytede detipo tipode dePartición Partición CHS CHSde definal finalde delalapartición particiónen enformato formatoINT INT13 13 Cant. Cant.de deSectores Sectoresen enparticiones particiones precedentes. precedentes. 0 1 2 3 4 5 DL DH CL CH TB DH 80 01 01 00 06 0e 00 00 81 95 05 0e 00 00 00 00 00 00 00 Autor: 00 Alejandro 00 00Furfaro 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 10 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: Autor: Alejandro Furfaro 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 11 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: Autor: Alejandro Furfaro 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 12 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: Autor: Alejandro Furfaro 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 13 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 Autor: Alejandro Furfaro 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 14 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 Autor: Alejandro Furfaro 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...* 15 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 Autor: Alejandro Furfaro 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.* 16 Boot Sector: BIOS Parameter Block Los primeros 62 bytes del boot sector se conocen como BIOS Parameter 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 Autor: Alejandro Furfaro 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 ' 17 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 BF3E7C 0000:7C55 B90B00 0000:7C58 FC 0000:7C59 F3 0000:7C5A A4 0000:7C5B 06 0000:7C5C 1F Autor: Alejandro Furfaro 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 18 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 Autor: Alejandro Furfaro 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 19 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 Autor: Alejandro Furfaro 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) 20 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. Autor: Alejandro Furfaro 21 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: 0000:7D05 0000:7D08 0000:7D09 0000:7D0A 0000:7D0E 0000:7D10 0000:7D12 0000:7D16 8B471A 48 48 8A1E0D7C 32FF F7E3 0306497C 13164B7C Autor: Alejandro Furfaro 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. 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) 22 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 Autor: Alejandro Furfaro 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 23 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 Autor: Alejandro Furfaro 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 24 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 Autor: Alejandro Furfaro 25 Manejo desde el BIOS o desde los Devices Drivers Autor: Alejandro Furfaro 26 Conector IDE ATAPI - 40 Pines Autor: Alejandro Furfaro 27 Interfaz IDE ATAPI: Direcciones de E/S HEX 1FX 3FX 17X 37X BINARY 0001 1111 0011 1111 0001 0111 0011 0111 XXXX XXXX XXXX XXXX DESCRIPTION Primary Command Registers Primary Control Registers Alternate Command Registers Alternate Control Registers Address bit A7 Autor: Alejandro Furfaro 28 Interfaz IDE ATAPI: Registros Autor: Alejandro Furfaro 29 Interfaz IDE ATAPI: Registros Autor: Alejandro Furfaro 30 Interfaz IDE ATAPI: Comandos Autor: Alejandro Furfaro 31 Interfaz IDE ATAPI: Comandos Autor: Alejandro Furfaro 32 Manejo desde el Sistema Operativo Caso Práctico Linux EXT3 Autor: Alejandro Furfaro 33 File System 1 Política aplicada por el Sistema Operativo para la organización de la información en el medio magnético de modo que resulte transparente a su geometría y a cualquier otra característica física. Ejemplos: FAT 12, 16 o 32 (Microsoft Windows) 2 NTFS (Windows NT y 2000) 2 Extension 2 y Extension 3 (Linux) Algunos sistemas operativos como Linux tratan de manejar todos los File Systems posibles. El Método que Emplean se conoce como Virtual File System (VFS) 2 Autor: Alejandro Furfaro 34 Virtual File System 1 1 Los filesystems agrupados en VFS se dividen en tres clases: Disk Filesystems 2 2 2 2 2 1 Network File Systems 2 1 Linux: Ext 2, Ext 3 Unix like: SYSV, UFS, MINIX, VxFS NTFS, VFAT, ISO9660 CD-ROM, Universal Disk Format (UDF) DVD Otros proprietarios: HPFS (OS/2), HFS (Apple), AFFS (Amiga), y ADFS (Acorn ) SMB, NFS, Coda, Lan Manager File Systems especiales 2 /proc Autor: Alejandro Furfaro 35 Common File Model 1superblock object Almacena la información concerniente al file system montado. Para file systems basados en disco, este objeto normalmente corresponde a un filesystem control block almacenado en el disco. 1inode object Almacena información general de un archivo específico. Para filesystems basados en disco, este objeto normalmente corresponde a un file control block almacenado en disco. Cada inode object está asociado con un número de inode, que identifica unívocamente a un archivo en el filesystem. 1file object Almacena información acerca de la interacción entre un archivo abierto y un proceso. Esta informacion existe solo en la memoria del kernel durante el período en el que el proceso accede al archivo. 1dentry object Almacena informacion acerca del enlace entre una entrada de directorio con el correspondiente archivo. Cada filesystem basado en disco almacena esta información en disco de manera propia. inode inode object object Proceso 1 file object Proceso 2 file object Proceso 3 file object Autor: Alejandro Furfaro superbolck superbolck object object Archivo dentry cache dentry object dentry object 36 Estructura de un File Object Campo Tipo struct list_head f_list struct dentry * f_dentry struct vfsmount * f_vfsmnt struct file_operations * f_op atomic_t f_count unsigned int f_flags mode_t f_mode loff_t f_pos unsigned long f_reada unsigned long f_ramax unsigned long f_raend unsigned long f_ralen unsigned long f_rawin struct fown_struct f_owner unsigned int f_uid unsigned int f_gid int f_error unsigned long f_version void * private_data struct kiobuf * f_iobuf long f_iobuf_lock Descripción Punteros a una lista de file object genéricos dentry object asociado con el archivo filesystem montado que contiene al archivo Puntero a la tabla file operation Contador de uso del file object Flags especificados al abrir el archivo Modo de acceso del proceso Offset actual del archivo (file pointer) flag Read-ahead Número máximo de páginas por operación de read-ahead File pointer luego del último read-ahead Número de bytes read-ahead Número de páginas read-ahead Datos para E/S asincrónica vía señales UID del usuario GID del usuario Código de error para operaciones de escritura a red Número de versión, incrementado automáticamente luego Necesario para el driver de tty Descriptor para acceso directo al buffer. Lock para transferencia directa de E/S. de cada uso Strcut file Definida en /linux/fs.h Autor: Alejandro Furfaro 37 Estructura de un Dentry Object Tipo Campo atomic_t d_count unsigned int d_flags struct inode * d_inode struct dentry * d_parent struct list_head d_hash struct list_head d_lru struct list_head d_child struct list_head d_subdirs struct list_head d_alias int d_mounted struct qstr d_name unsigned long d_time struct dentry_operations* d_op struct super_block * d_sb unsigned long d_vfs_flags void * d_fsdata unsigned char * d_iname Descripción Contador de uso del Dentry object Dentry flags i-nodo asociado con el nombre de archivo Dentry object del directorio padre Punteros a una lista en la hash table entry Punteros a una lista de no utilizados Punteros a una lista de dentry objects incluidos en el directorio padre Para directorios, lista de dentry objects de subdirectorios Lista de i-nodos asociados (alias) Flag seteado a 1 solo si el dentry es el punto de montaje del filesystem Nombre del archivo Usado por el método d_revalidate Métodos del dentry superblock object del archivo Dentry cache flags Datos dependientes del Filesystem Espacio para nombres de archivo cortos Strcut dentry Definida en /linux/dcache.h Autor: Alejandro Furfaro 38 Strcut inode Definida en /linux/fs.h Estructura de un inode object Type struct list_head struct list_head struct list_head struct list_head struct list_head unsigned long unsigned int kdev_t umode_t nlink_t uid_t gid_t kdev_t off_t time_t time_t time_t unsigned int unsigned long unsigned long unsigned long struct semaphore struct semaphore struct inode_operations * struct file_operations * struct super_block * wait_queue_head_t struct file_lock * struct address_space * struct address_space struct dquot ** struct list_head struct pipe_inode_info * struct block_device * struct char_device * unsigned long struct dnotify_struct * unsigned long unsigned int unsigned char atomic_t unsigned int __u32 union Autor: Alejandro Furfaro Field i_hash i_list i_dentry i_dirty_buffers i_dirty_data_buffers i_ino i_count i_dev i_mode i_nlink i_uid i_gid i_rdev i_size i_atime i_mtime i_ctime i_blkbits i_blksize i_blocks i_version i_sem i_zombie i_op i_fop i_sb i_wait i_flock i_mapping i_data i_dquot i_devices i_pipe i_bdev i_cdev i_dnotify_mask i_dnotify i_state i_flags i_sock i_writecount i_attr_flags i_generation u Description Punteros a la hash list Punteros a la lista de i-nodos Punteros a la lista dentry Punteros a la lista de buffers modificados Punteros a la lista de buffers de datos modificados Número de i-nodo Contador de uso Identificador de dispositivo Tipo de archivo y derechos de acceso. Número de hard links Identificador de Owner Identificador de Group Identificador de Real device Longitud del archivo en bytes Hora del último acceso al archivo Hora de la última escritura en el archivo Hora del último cambio en el i-nodd Tamaño de bloque en Número de bits Tamaño de bloque en bytes Número de bvloques en el archivo Número de versión, incrementado aurtomaticamente luego de cada uso. Semáforo de i-nodo Semáforo secundario del i-nodo usado cuando se reubica o renombra el i-nodo Operaciones del i-nodo Default file operations Puntero al superblock object Cola de espera del i-nodo Puntero a la lista de locks del archivo. Puntero al address_space object address_space object para archivo de block device Cuotas de disco del i-nodo Punteros a listas de i–nodos de archivo block device Se usa si el archivo es un pipe Puntero al driver de block device Puntero al driver de character device Máscara de bit de notificación de eventos del directorio Usado para notificaciones de directorio Flags de estado del i-node Flags de montaje de filesystem No cero si el archivo es un socket Contador de uso para procesos que escriban Flag de creación del archivo Número de versión del i-nodo (usado por algunos filesystems) Información específica del filesystem 39 Estructura de un Superblock Tipo de dato struct list_head kdev_t unsigned long unsigned char unsigned char unsigned long long struct file_system_type * struct super_operations * struct dquot_operations * unsigned long unsigned long struct dentry * struct rw_semaphore struct semaphore int atomic_t struct list_head struct list_head struct list_head struct block_device * struct list_head struct quota_mount_options union Campo s_list s_dev s_blocksize s_blocksize_bits s_dirt s_maxbytes s_type s_op dq_op s_flags s_magic s_root s_umount s_lock s_count s_active s_dirty s_locked_inodes s_files s_bdev s_instances s_dquot u Descripción Puntero para lista de superblocks Identificador de dispositivo (que hostea al FS) Tamaño del Block en bytes Tamaño del Block en número de bits Flag de Modificación (dirty flag). Tamaño máximo de los archivos Tipo de Filesystem Métodos de Superblock Métodos de quota de disco Mount flags Filesystem magic number Dentry object del directorio montado Semáforo usado para desmontar Semáforo del Superblock Contador de referencias Contador secundario de referencias Lista de i-nodos modificados en el superblock Lista de i-nodos involucrados en E/S Lista de file objects asignados al superblock Puntero al descriptor de block device driver Punteros a una lista de superblock objects de un tipo dado de filesystem. Opciones para quota de Disco Información específica del filesystem Strcut super_block Definida en /linux/fs.h Autor: Alejandro Furfaro 40 Extension 3 File System Boot Block Group 0 Block Block Group n Super Group Data Block i-node i-node Block Descriptor Bitmap Bitmap Table Tipo __u32 __u32 __u32 __u16 __u16 __u16 __u16 __u32 [3] Autor: Alejandro Furfaro Campo bg_block_bitmap bg_inode_bitmap bg_inode_table bg_free_blocks_count bg_free_inodes_count bg_used_dirs_count bg_pad bg_reserved Data Blocks Descripción Block number of block bitmap Block number of inode bitmap Block number of first inode table block Number of free blocks in the group Number of free inodes in the group Number of directories in the group Alignment to word Nulls to pad out 24 bytes 41 Superblock Autor: Alejandro Furfaro Tipo __u32 __u32 __u32 __u32 __u32 __u32 __u32 __s32 __u32 __u32 __u32 __u32 __u32 __u16 __u16 __u16 __u16 __u16 __u16 __u32 __u32 __u32 __u32 __u16 __u16 __u32 __u16 __u16 __u32 __u32 __u32 __u8 [16] char [16] char [64] __u32 __u8 __u8 __u16 __u32 [204] Campo s_inodes_count s_blocks_count s_r_blocks_count s_free_blocks_count s_free_inodes_count s_first_data_block s_log_block_size s_log_frag_size s_blocks_per_group s_frags_per_group s_inodes_per_group s_mtime s_wtime s_mnt_count s_max_mnt_count s_magic s_state s_errors s_minor_rev_level s_lastcheck s_checkinterval s_creator_os s_rev_level s_def_resuid s_def_resgid s_first_ino s_inode_size s_block_group_nr s_feature_compat s_feature_incompat s_feature_ro_compat s_uuid s_volume_name s_last_mounted s_algorithm_usage_bitmap s_prealloc_blocks s_prealloc_dir_blocks s_padding1 s_reserved Descripción Total number of inodes Filesystem size in blocks Number of reserved blocks Free blocks counter Free inodes counter Number of first useful block (always 1) Block size Fragment size Number of blocks per group Number of fragments per group Number of inodes per group Time of last mount operation Time of last write operation Mount operations counter Number of mount operations before check Magic signature Status flag Behavior when detecting errors Minor revision level Time of last check Time between checks OS where filesystem was created Revision level Default UID for reserved blocks Default GID for reserved blocks Number of first nonreserved inode Size of on-disk inode structure Block group number of this superblock Compatible features bitmap Incompatible features bitmap Read-only compatible features bitmap 128-bit filesystem identifier Volume name Pathname of last mount point Used for compression Number of blocks to preallocate Number of blocks to preallocate for directories Alignment to word Nulls to pad out 1,024 bytes 42 Ext3 i-nodo Type Field __u16 i_mode __u16 i_uid __u32 i_size __u32 i_atime __u32 i_ctime __u32 i_mtime __u32 i_dtime __u16 i_gid __u16 i_links_count __u32 i_blocks __u32 i_flags union osd1 __u32 [EXT2_N_BLOCKS] i_block __u32 i_generation __u32 i_file_acl __u32 i_dir_acl __u32 i_faddr union osd2 Autor: Alejandro Furfaro Description File type and access rights Owner identifier File length in bytes Time of last file access Time that inode last changed Time that file contents last changed Time of file deletion Group identifier Hard links counter Number of data blocks of the file File flags Specific operating system information Pointers to data blocks File version (used when the file is accessed by a network filesystem) File access control list Directory access control list Fragment address Specific operating system information 43 Ext3 i-nodo Autor: Alejandro Furfaro 44