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.
134 lines
4.5 KiB
Plaintext
134 lines
4.5 KiB
Plaintext
# 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
|