INT 13h är en förkortning för BIOS-avbrottsanrop 13 hex , den 20:e avbrottsvektorn i ett x86 -baserat (IBM PC-nedstammande) datorsystem. BIOS ställer vanligtvis upp en avbrottshanterare i realmode vid denna vektor som tillhandahåller sektorbaserad hårddisk och diskettläs- och skrivtjänster med användning av cylinderhuvudsektor ( CHS)-adressering. Moderna PC-BIOS inkluderar också INT 13h-förlängningsfunktioner, som skapades av IBM och Microsoft 1992, som tillhandahåller samma diskåtkomsttjänster med 64-bitars LBA -adressering; med mindre tillägg, dessa var kvasi-standardiserade av Phoenix Technologies och andra som EDD ( Enhanced Disk Drive) BIOS-tillägg.
Moderna datorer kommer med både BIOS INT 13h och UEFI funktionalitet som ger samma tjänster med mera, med undantag för UEFI Class 3 som helt tar bort CSM saknar alltså INT 13h och andra avbrott. Vanligtvis använder UEFI-drivrutiner LBA -adressering istället för CHS-adressering.
Under verkliga operativsystem, som DOS , skulle anrop av INT 13h hoppa in i datorns ROM-BIOS-kod för disktjänster på låg nivå, som skulle utföra fysiska sektorbaserade diskläs- eller skrivoperationer för programmet. I DOS fungerar det som lågnivågränssnitt för de inbyggda blockdrivrutinerna för hårddiskar och disketter . Detta tillåter INT 25h och INT 26h att tillhandahålla absoluta diskläs-/skrivfunktioner för logiska sektorer till FAT- filsystemdrivrutinen i DOS-kärnan, som hanterar filrelaterade förfrågningar via DOS API ( INT 21h ) funktioner.
Under skyddade operativsystem, som Microsoft Windows NT- derivat (t.ex. NT4, 2000, XP och Server 2003) och Linux med dosemu , fångar OS upp samtalet och skickar det till operativsystemets inbyggda disk I/O-mekanism. Windows 9x och Windows for Workgroups 3.11 kringgår också BIOS-rutiner när du använder 32-bitars diskåtkomst . Förutom att utföra diskåtkomst på låg nivå, ger INT 13h-anrop och relaterade BIOS-datastrukturer också information om typerna och kapaciteten hos diskar (eller andra DASD- enheter) som är anslutna till systemet; när ett OS i skyddat läge startar, kan det använda informationen från BIOS för att räkna upp hårdvaran så att den (OS) kan ladda och konfigurera lämpliga I/O-drivrutiner för disk.
Det ursprungliga BIOS real-mode INT 13h-gränssnittet stöder enheter i storlekar upp till cirka 8 GB med vad som vanligtvis kallas fysisk CHS-adressering . Denna gräns kommer från hårdvarugränssnittet för IBM PC/XT- diskhårdvaran. BIOS använde cylinderhuvudssektorns (CHS) adress som gavs i INT 13h-anropet och överförde den direkt till hårdvarugränssnittet. En lägre gräns, cirka 504 MB, infördes av kombinationen av CHS-adresseringsgränser som används av BIOS och de som används av ATA-hårddiskar, vilka är olika. När CHS-adresseringsgränserna för både BIOS och ATA kombineras (dvs. när de tillämpas samtidigt), representerar antalet 512-byte-sektorer som kan adresseras totalt cirka 504 MB.
Gränsen på 504 MB övervanns med hjälp av CHS translation , en teknik genom vilken BIOS skulle simulera en fiktiv CHS-geometri vid INT 13h-gränssnittet, samtidigt som den kommunicerade med ATA-enheten med hjälp av dess ursprungliga logiska CHS-geometri. (När 504 MB-barriären närmade sig hade ATA-diskar långt tidigare upphört att presentera sina verkliga fysiska geometriparametrar vid det externa ATA-gränssnittet.) Översättning gör att BIOS, som fortfarande använder CHS-adressering, effektivt kan adressera ATA-diskar med större storlekar. till exakt 8064 MB, bara den ursprungliga kapaciteten för BIOS CHS-gränssnittet. (ATA-gränssnittet har en mycket större inbyggd CHS-adresseringskapacitet, så när väl "störningen" av CHS-gränserna för BIOS och ATA löstes genom adressering var bara den mindre begränsningen av BIOS signifikant.) CHS-översättning kallas ibland för som logisk CHS-adressering , men det är faktiskt en felaktig benämning eftersom ATA CHS-adresser redan var logiska, inte fysiska vid den här BIOS-utvecklingen. Gränsen på 8064 MB härrör från en kombination av den registervärdebaserade anropskonventionen som används i INT 13h-gränssnittet och målet att upprätthålla bakåtkompatibilitet – vilket dikterar att formatet eller storleken på CHS-adresser som skickas till INT 13h inte kunde ändras för att lägga till fler bitar till ett av fälten, t.ex. fältet Cylindernummer. Denna gräns använder 1024 cylindrar, 256 huvuden, 63 sektorer och 512 byteblock, vilket tillåter exakt 7,875 GiB adressering (1024 * 256 * 63 * 512 byte). Det fanns kort ett antal BIOSer som erbjöd inkompatibla versioner av detta gränssnitt – till exempel har AWARD AT BIOS och AMI 386sx BIOS utökats för att hantera upp till 4096 cylindrar genom att placera bitarna 10 och 11 av cylindernumret i bitarna 6 och 7 av registrera DH.
Alla versioner av MS-DOS , (inklusive MS-DOS 7 och Windows 95 ) har en bugg som förhindrar uppstart av diskenheter med 256 huvuden (registervärde 0xFF), så många moderna BIOS tillhandahåller CHS-översättningsmappningar med högst 255 (0xFE) huvuden , vilket minskar det totala adresserbara utrymmet till exakt 8032,5 MiB (ca 7,844 GiB).
För att stödja adressering av ännu större diskar, introducerades ett gränssnitt känt som INT 13h Extensions av IBM och Microsoft, som senare återpublicerades och utökades något av Phoenix Technologies som en del av BIOS Enhanced Disk Drive Services (EDD). Den definierar nya funktioner inom INT 13h-tjänsten, som alla har funktionsnummer större än 40h, som använder 64-bitars logisk blockadressering (LBA), som tillåter adressering upp till 8 ZiB . (En ATA-enhet kan också stödja 28-bitars eller 48-bitars LBA som tillåter upp till 128 GiB respektive 128 PiB , förutsatt en 512-byte sektor/blockstorlek). Detta är ett "paket"-gränssnitt, eftersom det använder en pekare till ett informationspaket snarare än den registerbaserade anropskonventionen för det ursprungliga INT 13h-gränssnittet. Detta paket är en mycket enkel datastruktur som innehåller en gränssnittsversion, datastorlek och LBA. För mjukvara bakåtkompatibilitet implementeras de utökade funktionerna tillsammans med de ursprungliga CHS-funktionerna, och anrop till funktioner från båda uppsättningarna kan blandas ihop, även för samma enhet, med förbehållet att CHS-funktionerna inte kan nå förbi de första 8064 MB av disk.
Vissa cachedrivrutiner tömmer sina buffertar när de upptäcker att DOS förbigås genom att direkt utfärda INT 13h från applikationer. En dummy-läsning via INT 13h kan användas som en av flera metoder för att tvinga cache-spolning för okända cacher (t.ex. före omstart).
Ställ in mediatyp för format (används av DOS-versioner <= 3.1)
AH = 18h
FD
Ställ in mediatyp för format (används av DOS-versioner >= 3.2)
AH = 19h
Park Heads
AH = 41h
EXT
Testa om tillägg är tillgängliga
AH = 42h
EXT
Läs sektorer från Drive
AH = 43h
EXT
Skriv sektorer att köra
AH = 44h
EXT
Verifiera sektorer
AH = 45h
EXT
Lås/lås upp enheten
AH = 46h
EXT
Mata ut enheten
AH = 47h
EXT
Flytta Drive Head To Sector
AH = 48h
EXT
Läs frekvensomriktarparametrar
AH = 49h
EXT
Upptäck mediabyte
AH = 4Bh
EXT
Skaffa Drive Emulation Type
Om den andra kolumnen är tom kan funktionen användas både för diskett och hårddisk.
FD: endast för diskett.
HD: endast för hårddisk.
PS/2: endast för hårddisk på PS/2-system.
EXT: en del av INT 13h Extensions som skrevs på 1990-talet för att stödja hårddiskar med mer än 8 GB .
INT 13h AH=00h : Återställ disksystem
Parametrar
AH
00h
DL
Drive (bit 7 set betyder återställning av både hårddiskar och disketter)
Resultat
CF
Ställ in på fel
AH
Returkod
INT 13h AH=01h : Få status för senaste körning
Parametrar
AH
01h
DL
Kör
Bit 7=0 för diskettenhet, bit 7=1 för fast enhet
Resultat
AH
Returkod
00h
Framgång
01h
Ogiltigt kommando
02h
Kan inte hitta adressmärke
03h
Försökt skriva på skrivskyddad disk
04h
Sektor hittades inte
05h
Återställningen misslyckades
06h
Diskändringsrad 'aktiv'
07h
Drive parameteraktivitet misslyckades
08h
DMA-överskridande
09h
Försök att DMA över 64kb-gränsen
0 Ah
Dålig sektor upptäcktes
0Bh
Dålig cylinder (spår) upptäckt
0Ch
Medietyp hittades inte
0Dh
Ogiltigt antal sektorer
0 Eh
Kontrolldataadressmärke upptäckt
0Fh
DMA utanför räckvidd
10h
CRC/ECC-datafel
11h
ECC korrigerat datafel
20h
Controllerfel
40h
Sök misslyckande
80h
Drive timeout, antas inte redo
AAh
Körningen är inte klar
BBh
Odefinierat fel
CCh
Skriv fel
E0h
Statusfel
FFh
Avkänningsoperationen misslyckades
CF
Ställ in på fel, rensa om inget fel
INT 13h AH=02h : Läs sektorer från enheten
Parametrar
AH
02h
AL
Sektorer att läsa räknas
CH
Cylinder
CL
Sektor
DH
Huvud
DL
Kör
ES:BX
Buffertadresspekare
Resultat
CF
Ställ in på fel, rensa om inget fel
AH
Returkod
AL
Faktiskt antal avläsningar av sektorer
Anmärkningar
Register CX innehåller både cylindernumret (10 bitar , möjliga värden är 0 till 1023) och sektornumret (6 bitar, möjliga värden är 1 till 63). Cylinder- och sektorbitar är numrerade nedan:
CX := ( ( cylinder och 255 ) shl 8 ) eller ( ( cylinder och 768 ) shr 2 ) eller sektor; cylinder := ((CX och 0xFF00) shr 8 ) eller ((CX och 0xCO) shl 2) sektor := CX och 63;
Adressering av buffert bör garantera att hela bufferten är inom det givna segmentet , dvs (BX + size_of_buffer) <= 10000h . Annars kan avbrottet misslyckas med vissa BIOS- eller hårdvaruversioner.
Exempel
Antag att du vill läsa 16 sektorer (= 2000h byte ) och din buffert startar på minnesadress 4FF00h. Genom att använda minnessegmentering finns det olika sätt att beräkna registervärdena, t.ex.
ES = segment = 4F00h BX = offset = 0F00h summa = minnesadress = 4FF00h skulle vara ett bra val eftersom 0F00h + 2000h = 2F00h <= 10000h ES = segment = 4000h BX = offset = FF00h summa = 0 minnesadress = inte skulle vara 4FF en minnesadress bra val eftersom FF00h + 2000h = 11F00h > 10000h
Funktion 02h av avbrott 13h kan endast läsa sektorer av de första 16 450 560 sektorerna på din hårddisk, för att läsa sektorer utöver gränsen på 8 GB bör du använda funktion 42h i INT 13h Extensions . Ett annat alternativ kan vara DOS-avbrott 25h som läser sektorer inom en partition.
Kodexempel
[ORG 7c00h]; koden börjar vid 7c00h xor axe, axe ; se till att ds är inställd på 0 mov ds, ax cld ; börja sätta in värden: mov ah, 2h ; int13h funktion 2 mov al, 63 ; vi vill läsa 63 sektorer mov ch, 0 ; från cylinder nummer 0 mov cl, 2 ; sektornummer 2 - andra sektor (börjar från 1, inte 0) mov dh, 0 ; huvudnummer 0 xor bx, bx mov es, bx ; es ska vara 0 mov bx, 7e00h ; 512byte från ursprungsadress 7c00h int 13h jmp 7e00h ; hoppa till nästa sektor; för att fylla denna sektor och göra den startbar: gånger 510-($-$$) db 0 dw 0AA55h
Efter detta kodavsnitt (som asm-filen ska börja med) kan du skriva kod och den kommer att laddas till minnet och köras.
Lägg märke till hur vi inte ändrade dl (enheten). Det beror på att när datorn först laddas, ställs dl till numret på den enhet som startades, så om vi antar att vi vill läsa från enheten vi startade från, finns det ingen anledning att ändra dl.
INT 13h AH=03h : Skriv sektorer att köra
Parametrar
AH
03h
AL
Sektorer att skriva Räkna
CH
Spår
CL
Sektor
DH
Huvud
DL
Kör
ES:BX
Buffertadresspekare
Resultat
CF
Ställ in på fel, rensa om inget fel
AH
Returkod
AL
Faktiska sektorer Skriftlig räkning
INT 13h AH=04h : Verifiera sektorer från Drive
Parametrar
AH
04h
AL
Sektorer att verifiera räkning
CH
Spår
CL
Sektor
DH
Huvud
DL
Kör
ES:BX
Buffertadresspekare
Resultat
CF
Ställ in på fel, rensa om inget fel
AH
Returkod
AL
Faktiskt antal verifierade sektorer
INT 13h AH=05h : Formatera spår
Parametrar
AH
05h
AL
Sektorer till format räknas
CH
Spår
CL
Sektor
DH
Huvud
DL
Kör
ES:BX
Buffertadresspekare
4-byte adressfält (gäller PC/XT 286,AT, PS/1 och PS/2)
Byte
Menande
Tillåtna värden
1
Spår
2
Huvud
3
Sektor
4
Byte/sektor
0=128, 1-256, 2-512, 3-1024
Resultat
CF
Ställ in på fel, rensa om inget fel
AH
Returkod
INT 13h AH=06h : Format Spår Set Bad Sector Flags
Parametrar
AH
06h
AL
Interfoliera
CH
Spår
CL
Sektor
DH
Huvud
DL
Kör
Resultat
CF
Ställ in på fel, rensa om inget fel
AH
Returkod
INT 13h AH=07h : Formatera enhet med start vid spår
Parametrar
AH
07h
AL
Interfoliera
CH
Spår
CL
Sektor
DH
Huvud
DL
Kör
Resultat
CF
Ställ in på fel, rensa om inget fel
AH
Returkod
INT 13h AH=08h : Läs frekvensomriktarparametrar
Parametrar
Register
AH
08h = funktionsnummer för read_drive_parameters
DL
enhetsindex (t.ex. 1:a hårddisken = 80h)
ES:DI
inställd på 0000h:0000h för att komma runt lite buggy BIOS
Resultat
CF
Ställ in på fel, rensa om inget fel
AH
Returkod
DL
antal hårddiskar
DH
logiskt sista index av huvuden = antal_av - 1 (eftersom index börjar med 0)
CX
[7:6] [15:8] logiskt sista index för cylindrar = antal_av - 1 (eftersom index börjar med 0 )
[5:0] logiskt sista index av sektorer per spår = antal_av (eftersom index börjar med 1)
BL
enhetstyp (endast AT/PS2-disketter)
ES:DI
pekare till drivparametertabell (endast för disketter)
Anmärkningar
Logiska värden för funktion 08h kan/bör skilja sig från fysiska CHS-värden för funktion 48h.
Resultatregistret CX innehåller både cylindrar och sektor/spårvärden, se anmärkning till funktion 02h.
INT 13h AH=09h : Init Drive Pair Characteristics
Parametrar
AH
09h
DL
Kör
Resultat
CF
Ställ in på fel, rensa om inget fel
AH
Returkod
INT 13h AH=0Ah: Läs långa sektorer från Drive
Den enda skillnaden mellan denna funktion och funktion 02h (se ovan) är att funktionen 0Ah läser 516 byte per sektor istället för endast 512. De sista 4 byten innehåller felkorrigeringskoden (ECC), en kontrollsumma av sektordata.
INT 13h AH=41h : Kontrollera förlängningar närvarande
Parametrar
Register
Beskrivning
AH
41h = funktionsnummer för anknytningskontroll
DL
enhetsindex (t.ex. 1:a hårddisken = 80h)
BX
55 AAh
Resultat
Register
Beskrivning
CF
Ställ in på Inte närvarande, rensa om närvarande
AH
Felkod eller huvudversionsnummer
BX
AA55h
CX
Bitmask för gränssnittsstöd:
1 – Enhetsåtkomst med hjälp av paketstrukturen
2 – Låsning och utmatning av drivenhet
4 – Enhanced Disk Drive Support (EDD)
INT 13h AH=42h : Utökad läsning av sektorer från enheten
Parametrar
Register
Beskrivning
AH
42h = funktionsnummer för utökad läsning
DL
enhetsindex (t.ex. 1:a hårddisken = 80h)
DS:SI
segment:offset-pekare till DAP, se nedan
DAP : Diskadresspaket
offset intervall
storlek
beskrivning
00h
1 byte
storlek på DAP (ställ in detta på 10h)
01h
1 byte
oanvänd, ska vara noll
02h..03h
2 byte
antal sektorer som ska läsas (vissa Phoenix BIOS är begränsade till maximalt 127 sektorer)
04h...07h
4 bytes
segment:offset-pekare till minnesbufferten till vilken sektorer kommer att överföras (observera att x86 är little-endian : om segmentet och offset deklareras separat, måste offset deklareras före segmentet)
08h..0Fh
8 byte
absoluta antalet början av de sektorer som ska läsas (första sektorn av enheten har nummer 0) med logisk blockadressering (observera att den nedre halvan kommer före den övre halvan)
Resultat
Register
Beskrivning
CF
Ställ in på fel, rensa om inget fel
AH
Returkod
Som redan nämnts med int 13h AH=02h, måste man se till att hela bufferten är inuti det givna segmentet, dvs ( BX + size_of_buffer ) <= 10000h
INT 13h AH=43h : Utökade skrivsektorer att driva
Parametrar
Register
Beskrivning
AH
43h = funktionsnummer för utökad skrivning
AL
bit 0 = 0: stäng skrivkontroll,
bit 0 = 1: öppna skrivkontroll,
bit 1-7:reserverad, satt till 0
DL
enhetsindex (t.ex. 1:a hårddisken = 80h)
DS:SI
segment:offset-pekare till DAP
Resultat
Register
Beskrivning
CF
Ställ in på fel, rensa om inget fel
AH
Returkod
INT 13h AH=48h : Utökad läsning av frekvensomriktarparametrar
Parametrar
Register
Beskrivning
AH
48h = funktionsnummer för extended_read_drive_parameters
DL
enhetsindex (t.ex. 1:a hårddisken = 80h)
DS:SI
segment:offset-pekare till resultatbuffert, se nedan
Resultatbuffert
offset intervall
storlek
beskrivning
00h...01h
2 byte
storlek på resultatbuffert (ställ in detta på 1Eh)
02h..03h
2 byte
informationsflaggor
04h...07h
4 bytes
fysiskt antal cylindrar = sista index + 1 (eftersom index börjar med 0)
08h..0Bh
4 bytes
fysiskt antal huvuden = sista index + 1 (eftersom index börjar med 0)
0Ch..0Fh
4 bytes
fysiskt antal sektorer per spår = sista index (eftersom index börjar med 1)
10h...17h
8 byte
absolut antal sektorer = sista index + 1 (eftersom index börjar med 0)
18h...19h
2 byte
byte per sektor
1Ah..1Dh
4 bytes
valfri pekare till Enhanced Disk Drive (EDD) konfigurationsparametrar som kan användas för efterföljande avbrott 13h Extension-samtal (om stöds)
Resultat
Register
Beskrivning
CF
Ställ in på fel, rensa om inget fel
AH
Returkod
Anmärkning
Fysiska CHS-värden för funktion 48h kan/bör skilja sig från logiska värden för funktion 08h.
INT 13h AH=4Bh: Hämta enhetsemuleringstyp
Parametrar
Registrerare
Beskrivning
AH
4Bh = hämta enhetsemuleringstyp
AL
01
DL
enhetsindex (t.ex. 1:a hårddisken = 80h)
DS:SI
pekar på en tom struktur för resultat. måste vara 13h i storlek
Resultat
Register
Beskrivning
CF
Ställ in på fel, rensa om inget fel
YXA
Returkod
DS:SI
Pekar på en specifikationsstruktur
Specifikationsstruktur
Offset
Storlek (byte)
Beskrivning
00h
1
Storlek på paket i byte (13h)
01h
1
Startmedietyp:
Bits
0 - 3
0000b: Ingen emulering
0001b: 1,2M diskett
0010b: 1,44M diskett
0011b: 2,88M diskett
0100b: Hårddisk
4-5
Reserverad
6
Bilden innehåller ATAPI-drivrutin
7
Bilden innehåller SCSI-drivrutin
02h
1
Drive Number (Drive Index)
03h
1
CD-ROM-kontrollnummer
04h
4
Logical Block Address (LBA) för diskavbildningen som ska emuleras
08h
2
Enhetsspecifikation:
bit 0: Drivenheten är slav istället för master
bitar 7-0: LUN och PUN
0 Ah
2
Segment av 3K-buffert för cachelagring av CD-ROM-läsningar
0Ch
2
Initialt startbildsegment med start från 7c0h segment