INT 13H

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.

INT är en x86 -instruktion som utlöser ett mjukvaruavbrott och 13 hex är avbrottsnumret (som ett hexadecimalt värde) som anropas.

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.

Översikt

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).

AMI BIOS från omkring 1990–1991 kasserar ojusterade buffertar för ord. Vissa DOS- och terminate-and-stay-resident-program avbryter aktiveringen och registrerar så PC DOS och MS-DOS installerar sina egna filter för att förhindra detta.

Lista över INT 13h- tjänster

Körbord
DL = 00h 1:a disketten ("enhet A:")
DL = 01h 2:a disketten ("enhet B:")
DL = 02h 3:e disketten ("enhet C:")
. . .
DL = 7Fh 128:e disketten
DL = 80h 1:a hårddisken
DL = 81h 2:a hårddisken
DL = 82h 3:e hårddisken
. . .
DL = E0h CD/DVD [ citat behövs ] , eller 97:e hårddisken
. . .
DL = FFh 128:e hårddisken
Funktionstabell
AH = 00h   Återställ disksystem
AH = 01h   Få status för senaste körning
AH = 02h   Läs sektorer från Drive
AH = 03h   Skriv sektorer att köra
AH = 04h   Verifiera sektorer
AH = 05h   Formatera spår
AH = 06h   Format Spår Set Bad Sector Flags
AH = 07h   Formatera Drive från Track
AH = 08h   Läs frekvensomriktarparametrar
AH = 09h HD Initiera Disk Controller
AH = 0 Ah HD Läs långa sektorer från Drive
AH = 0Bh HD Skriv långa sektorer att köra
AH = 0Ch HD Flytta drivhuvudet till cylindern
AH = 0Dh HD Återställ diskenheter
AH = 0Eh PS/2 Controller Read Test
AH = 0Fh PS/2 Controller skrivtest
AH = 10h HD Testa om enheten är klar
AH = 11 timmar HD Kalibrera om Drive
AH = 12h PS/2 Controller RAM-test
AH = 13h PS/2 Körtest
AH = 14h HD Controller Diagnostik
AH = 15h   Läs enhetstyp
AH = 16h FD Upptäck mediabyte
AH = 17h FD 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 = ---CH--- ---CL--- cylinder : 76543210 98 sektor : 543210

Exempel på översättning:

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
0 Eh 2 Antal sektorer (512 byte långa) att ladda
10h 1 Cylinderantal låg byte (från int 8h)
11h 1 Sektorräkning (från int 8h)
12h 1 Antal anställda (från int 8h)

Se även

externa länkar