INT 13H

INT 13H, BIOS tarafından sağlanan ve x86 mimarisinde disk erişimi için kullanılan düşük seviyeli bir kesme(interrupt) servisidir.

İnterrupt vektör tablosunda 20.kesme (0x13) karşılık gelir. BIOS tarafından sağlanan disk erişimi servisi olup yani örnek olarak sabit disk(HDD) veya Disket(Floppy) gibi depolama aygıtlarında sektör seviyesinde okuma ve yazma işlemleri yapmayı mümkün kılar.

Tarihi

INT 13H, IBM uyumlu kişisel bilgisayarların (PC) ilk döneminde itibaren kullanılmaya başlanmıştır, aslen disket sürücüleri üzerinden veri erişimi sağlamak amacıyla tasarlanmıştır. Zamanla sabit disklerin yaygınlaşmasıyla birlikte bu interrupt genişletilmiş ve daha karmaşık diskler için yapıları desteklenmiştir

Erişim Modelleri

CHS(Cylinder-Head-Sector), INT 13H'nin erken sürümleri disk erişimini fiziksel geometriye dayalı olarak gerçekleştirilir. Bu modelde:

CHS modelinde en büyük dezavantaj, adresleme kapasitesinin sınırlı olmasıdır. Bu yöntemle genellikle 8 GB disk sınırına takılmaktadır.

Boot Süreci

(bakınız: Boot)

INT 13H, en kritik ve önemi kullanım alanı, sistem açılış sürecidir (boot). BIOS boot edilebilir bir aygıt bulduğunda ilk sektörü RAM (MBR)'e yükler. MBR içerisindeki bootleader, işletim sisteminin geri kalanını yüklemek için INT 13H kullanır. Bu nedenle boot zincirinin temel bileşenlerinden biridir.

Modern Sistemlerde INT 13H

Modern işletim sistemlerinde :

Örnek Kodlar

Örnek olarak gösterilen bu ASM(assembly) kodları:

;hedefteki disk okunur

mov ah, 02h        ; okuma fonksiyonu
mov al, 01h        ; 1 sektör
mov ch, 00h        ; cylinder
mov cl, 02h        ; sector
mov dh, 00h        ; head
mov dl, 80h        ; HDD
mov bx, buffer     ; hedef adres
int 13h
jc disk_error      ; hata varsa

Disk okuma örneği;

;Basit disk okuması

org 0x7C00          ; BIOS boot sector adresi

start:
    mov ah, 02h     ; INT 13h: read sectors
    mov al, 01h     ; 1 sektör oku
    mov ch, 00h     ; cylinder = 0
    mov cl, 02h     ; sector = 2 (1 genelde boot sector)
    mov dh, 00h     ; head = 0
    mov dl, 80h     ; drive = HDD

    mov bx, 0x8000  ; verinin yükleneceği offset
    mov es, bx      ; ES:BX hedef adres olacak
    xor bx, bx

    int 13h         ; BIOS çağrısı

    jc disk_error   ; Carry Flag set ise hata

success:
    jmp $           ; sonsuz döngü

disk_error:
    mov si, error_msg
    call print_string
    jmp $

; Basit string yazdırma (INT 10h kullanır)
print_string:
    mov ah, 0Eh
.loop:
    lodsb
    cmp al, 0
    je .done
    int 10h
    jmp .loop
.done:
    ret

error_msg db "Disk hatası!",0

times 510-($-$$) db 0
dw 0xAA55

Özellikle bakınız:

Kaynakça

  1. https://wiki.osdev.org/Disk_access_using_the_BIOS_(INT_13h)
  2. Belgeler: https://www.ibm.com/docs/en/search/INT%2013H