Ç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:
2026-10-17 13:09:50 +03:00
parent e0e4a0d6c7
commit c5468f5d0a
24 changed files with 2279 additions and 2 deletions
+133
View File
@@ -0,0 +1,133 @@
# 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/.
#
# Fiziksel bellek: önyükleyicinin bellek haritası ve 4 KB'lık sayfa ayırıcı.
#
# Ayırıcı en büyük kullanılabilir bölgeyi seçer; geri verilen sayfalar
# kendi ilk 8 baytlarında bağlı bir liste oluşturur (ek yapı gerekmez).
# Birebir eşleme ilk 1 GB'ı kapsadığı için bölge 1 GB ile sınırlanır.
SAYFA = 4096
ALT_SINIR = 0x400000 # çekirdek ve durum alanının üstü (4 MB)
UST_SINIR = 0x40000000 # birebir eşlenen bölgenin sonu (1 GB)
KULLANILABILIR = 1
# Multiboot1 bilgi yapısı (yalnız gereken alanlar, paketli).
yapi OnyuklemeBilgisi:
bayraklar: u32 = 0
bellek_alt: u32 = 0
bellek_ust: u32 = 0
onyukleme_aygiti: u32 = 0
komut_satiri: u32 = 0
modul_sayisi: u32 = 0
modul_adresi: u32 = 0
simge0: u32 = 0
simge1: u32 = 0
simge2: u32 = 0
simge3: u32 = 0
harita_uzunlugu: u32 = 0
harita_adresi: u32 = 0
# Bellek haritası girdisi; `boyut` kendisinden sonraki bayt sayısıdır.
yapi HaritaGirdisi:
boyut: u32 = 0
taban: u64 = 0
uzunluk: u64 = 0
tur: u32 = 0
fonksiyon bilgi():
don OnyuklemeBilgisi.adreste(onyukleme_bilgisi())
fonksiyon harita_var_mi():
don bit_ve(bilgi().bayraklar, 0x40) != 0
fonksiyon hazirla():
bellek_yaz64(durum.SAYFA_SONRAKI, 0)
bellek_yaz64(durum.SAYFA_SON, 0)
bellek_yaz64(durum.SAYFA_BOS, 0)
bellek_yaz64(durum.SAYFA_AYRILAN, 0)
bellek_yaz64(durum.BELLEK_TOPLAM, 0)
eger degil harita_var_mi():
don 0
b = bilgi()
adres = b.harita_adresi
son = adres + b.harita_uzunlugu
en_buyuk = 0
iken adres < son:
g = HaritaGirdisi.adreste(adres)
eger g.tur == KULLANILABILIR:
bellek_yaz64(durum.BELLEK_TOPLAM, bellek_oku64(durum.BELLEK_TOPLAM) + g.uzunluk)
bas = g.taban
bit = g.taban + g.uzunluk
eger bas < ALT_SINIR:
bas = ALT_SINIR
eger bit > UST_SINIR:
bit = UST_SINIR
eger bit > bas ve bit - bas > en_buyuk:
en_buyuk = bit - bas
bellek_yaz64(durum.SAYFA_SONRAKI, bas)
bellek_yaz64(durum.SAYFA_SON, bit)
adres = adres + g.boyut + 4
don 0
fonksiyon sayfa_ayir():
# Boşta sayfa yoksa 0 döner.
bos = bellek_oku64(durum.SAYFA_BOS)
eger bos != 0:
bellek_yaz64(durum.SAYFA_BOS, bellek_oku64(bos))
bellek_yaz64(durum.SAYFA_AYRILAN, bellek_oku64(durum.SAYFA_AYRILAN) + 1)
don bos
sonraki = bellek_oku64(durum.SAYFA_SONRAKI)
eger sonraki == 0 veya sonraki + SAYFA > bellek_oku64(durum.SAYFA_SON):
don 0
bellek_yaz64(durum.SAYFA_SONRAKI, sonraki + SAYFA)
bellek_yaz64(durum.SAYFA_AYRILAN, bellek_oku64(durum.SAYFA_AYRILAN) + 1)
don sonraki
fonksiyon bolge_ayir(sayfa_sayisi):
# Bitişik sayfalar (yığın gibi büyük bölgeler için); yer yoksa 0.
sonraki = bellek_oku64(durum.SAYFA_SONRAKI)
boyut = sayfa_sayisi * SAYFA
eger sonraki == 0 veya sonraki + boyut > bellek_oku64(durum.SAYFA_SON):
don 0
bellek_yaz64(durum.SAYFA_SONRAKI, sonraki + boyut)
bellek_yaz64(durum.SAYFA_AYRILAN, bellek_oku64(durum.SAYFA_AYRILAN) + sayfa_sayisi)
don sonraki
fonksiyon sayfa_birak(adres):
bellek_yaz64(adres, bellek_oku64(durum.SAYFA_BOS))
bellek_yaz64(durum.SAYFA_BOS, adres)
bellek_yaz64(durum.SAYFA_AYRILAN, bellek_oku64(durum.SAYFA_AYRILAN) - 1)
fonksiyon bos_sayfa_sayisi():
don (bellek_oku64(durum.SAYFA_SON) - bellek_oku64(durum.SAYFA_SONRAKI)) // SAYFA
fonksiyon haritayi_yaz():
eger degil harita_var_mi():
ekran.satir("Bellek haritasi yok.")
don 0
b = bilgi()
adres = b.harita_adresi
son = adres + b.harita_uzunlugu
iken adres < son:
g = HaritaGirdisi.adreste(adres)
ekran.yaz(" ")
ekran.onaltilik(g.taban)
ekran.yaz(" ")
ekran.sayi(g.uzunluk // 1024)
ekran.yaz(" KB ")
eger g.tur == KULLANILABILIR:
ekran.satir("kullanilabilir")
degilse:
ekran.satir("ayrilmis")
adres = adres + g.boyut + 4
ekran.yaz("Kullanilabilir toplam: ")
ekran.sayi(bellek_oku64(durum.BELLEK_TOPLAM) // 1048576)
ekran.satir(" MB")
ekran.yaz("Sayfa ayirici: ")
ekran.sayi(bellek_oku64(durum.SAYFA_AYRILAN))
ekran.yaz(" sayfa dagitildi, ")
ekran.sayi(bos_sayfa_sayisi())
ekran.satir(" sayfa bos")
don 0