Files
ornekler/cekirdek/minimal-kernel/kesme.kbl
T

63 lines
2.0 KiB
Plaintext
Raw Normal View History

# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at https://mozilla.org/MPL/2.0/.
#
# Kesme altyapısı: IDT, 8259 PIC yeniden eşleme, 8253 PIT zamanlayıcı.
#
# Kesme girişleri önyükleme parçasında (calisma/yalin/boot.S); her giriş
# yazmaçları saklayıp ana dosyadaki `kesme(vektor, kod)` işlevini çağırır.
GIRIS_SAYISI = 48
KOD_SECICI = 0x08
KESME_KAPISI = 0x8E # var, halka 0, 64 bit kesme kapısı
# IDT girdisi — x86-64 kesme kapısı tanımlayıcısı (16 bayt, paketli).
yapi IdtGirisi:
ofset_alt: u16 = 0
secici: u16 = 0
ist: u8 = 0
tur: u8 = 0
ofset_orta: u16 = 0
ofset_ust: u32 = 0
ayrilmis: u32 = 0
fonksiyon kapi_kur(v, adres):
g = IdtGirisi.adreste(durum.IDT + v * IdtGirisi.boyut())
g.ofset_alt = bit_ve(adres, 0xFFFF)
g.secici = KOD_SECICI
g.ist = 0
g.tur = KESME_KAPISI
g.ofset_orta = bit_ve(saga_kaydir(adres, 16), 0xFFFF)
g.ofset_ust = saga_kaydir(adres, 32)
g.ayrilmis = 0
fonksiyon tabloyu_kur():
dongu v icinde 0..GIRIS_SAYISI - 1:
kapi_kur(v, kesme_girisi(v))
kesme_tablosu_yukle(durum.IDT, GIRIS_SAYISI * IdtGirisi.boyut())
fonksiyon pic_hazirla():
# Donanım kesmelerini 32–47'ye taşı (0–31 işlemci istisnalarına ait).
port_yaz8(0x20, 0x11)
port_yaz8(0xA0, 0x11)
port_yaz8(0x21, 0x20)
port_yaz8(0xA1, 0x28)
port_yaz8(0x21, 0x04)
port_yaz8(0xA1, 0x02)
port_yaz8(0x21, 0x01)
port_yaz8(0xA1, 0x01)
port_yaz8(0x21, 0b11111100) # yalnız IRQ0 (zamanlayıcı) ve IRQ1 (klavye)
port_yaz8(0xA1, 0xFF)
fonksiyon zamanlayici_hazirla(hz):
bolen = 1193182 // hz
port_yaz8(0x43, 0x36)
port_yaz8(0x40, bit_ve(bolen, 0xFF))
port_yaz8(0x40, bit_ve(saga_kaydir(bolen, 8), 0xFF))
fonksiyon bitti(v):
# Kesme sonu bildirimi (EOI).
eger v >= 40:
port_yaz8(0xA0, 0x20)
port_yaz8(0x20, 0x20)