Çekirdek örnekleri: KabaLang Minimal Kernel (MPL-2.0) ve üç küçük çekirdek
KabaLang'ın --yalin kipiyle yazılmış, işletim sistemi olmadan açılan x86-64 çekirdeği: kesmeler, 100 Hz zamanlayıcı, Türkçe Q klavye, Türkçe karakterli VGA ekranı, bellek haritası, sayfa ayırıcı, kabuk. Ek örnekler: merhaba, asal sayılar, VGA renkleri.
This commit is contained in:
@@ -0,0 +1,62 @@
|
||||
# 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)
|
||||
Reference in New Issue
Block a user