Ç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,112 @@
|
||||
# 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/.
|
||||
#
|
||||
# KabaLang ile yazılmış en küçük çekirdek: seri porta ve VGA metin ekranına yazar.
|
||||
#
|
||||
# Derle: kabalang derle --yalin merhaba_cekirdek.kbl -o cekirdek.elf
|
||||
# Çalıştır: qemu-system-x86_64 -kernel cekirdek.elf -serial stdio
|
||||
#
|
||||
# Yalın kipte çalışma zamanı YOKTUR: metin sabitleri ham bayt dizisidir,
|
||||
# donanıma `port_yaz8` (x86 out) ve `bellek_yaz16` (volatile yazma) ile
|
||||
# erişilir. Önyükleme parçası (calisma/yalin/boot.S) yalnız uzun kipe geçip
|
||||
# `kaba_cekirdek_ana`yı çağırır; mantığın tamamı bu dosyadadır.
|
||||
|
||||
SERI = 1016 # COM1 (0x3F8)
|
||||
VGA = 753664 # VGA metin belleği (0xB8000)
|
||||
GENISLIK = 80
|
||||
|
||||
fonksiyon seri_hazirla():
|
||||
port_yaz8(SERI + 1, 0) # kesmeler kapalı
|
||||
port_yaz8(SERI + 3, 128) # DLAB
|
||||
port_yaz8(SERI + 0, 3) # 38400 baud
|
||||
port_yaz8(SERI + 1, 0)
|
||||
port_yaz8(SERI + 3, 3) # 8 bit, eşliksiz, 1 dur biti
|
||||
port_yaz8(SERI + 2, 199) # FIFO
|
||||
port_yaz8(SERI + 4, 11)
|
||||
|
||||
fonksiyon seri_bayt(b):
|
||||
iken port_oku8(SERI + 5) % 64 < 32:
|
||||
devam
|
||||
port_yaz8(SERI, b)
|
||||
|
||||
fonksiyon seri_yaz(m):
|
||||
i = 0
|
||||
iken bayt(m, i) != 0:
|
||||
seri_bayt(bayt(m, i))
|
||||
i = i + 1
|
||||
seri_bayt(10)
|
||||
|
||||
fonksiyon ekran_temizle(renk):
|
||||
dongu i icinde 0..80 * 25 - 1:
|
||||
bellek_yaz16(VGA + i * 2, renk * 256 + 32)
|
||||
|
||||
fonksiyon ekrana_yaz_konum(m, satir, sutun, renk):
|
||||
i = 0
|
||||
iken bayt(m, i) != 0:
|
||||
bellek_yaz16(VGA + (satir * GENISLIK + sutun + i) * 2, renk * 256 + bayt(m, i))
|
||||
i = i + 1
|
||||
|
||||
fonksiyon ekrana_yaz(m, satir, renk):
|
||||
ekrana_yaz_konum(m, satir, 0, renk)
|
||||
|
||||
fonksiyon sayi_yaz(n, satir, sutun, renk):
|
||||
# Ondalık yazım: `//` ve `%` yalın kipte IR içinde tanımlıdır.
|
||||
basamaklar = 1
|
||||
b = n
|
||||
iken b >= 10:
|
||||
b = b // 10
|
||||
basamaklar = basamaklar + 1
|
||||
dongu k icinde 0..basamaklar - 1:
|
||||
rakam = (n // us10(basamaklar - 1 - k)) % 10
|
||||
bellek_yaz16(VGA + (satir * GENISLIK + sutun + k) * 2, renk * 256 + 48 + rakam)
|
||||
|
||||
fonksiyon us10(k):
|
||||
s = 1
|
||||
dongu j icinde 1..k:
|
||||
s = s * 10
|
||||
don s
|
||||
|
||||
seri_hazirla()
|
||||
seri_yaz("Merhaba, KabaLang! (cekirdek uzun kipte, seri port)")
|
||||
|
||||
# Mavi arka plan ve çerçeve
|
||||
MAVI_ZEMIN = 0x10
|
||||
ekran_temizle(MAVI_ZEMIN)
|
||||
|
||||
# Çerçeve ve Başlık
|
||||
ekrana_yaz_konum("+----------------------------------------------------------------------------+", 1, 1, 0x1B)
|
||||
ekrana_yaz_konum("| KabaLang Minimal Kernel -- x86-64, KabaLang ile yazildi |", 2, 1, 0x1F)
|
||||
ekrana_yaz_konum("+----------------------------------------------------------------------------+", 3, 1, 0x1B)
|
||||
|
||||
# Durum Maddeleri
|
||||
ekrana_yaz_konum("[OK]", 5, 3, 0x1A)
|
||||
ekrana_yaz_konum("x86-64 Uzun Kip (64-bit Long Mode) Aktif", 5, 8, 0x1F)
|
||||
|
||||
ekrana_yaz_konum("[OK]", 7, 3, 0x1A)
|
||||
ekrana_yaz_konum("Calisma zamani yok: libc yok, yalniz KabaLang + LLVM", 7, 8, 0x1F)
|
||||
|
||||
ekrana_yaz_konum("[OK]", 9, 3, 0x1A)
|
||||
ekrana_yaz_konum("Multiboot ile acilis, ilk 1 GB birebir eslenmis sayfalar", 9, 8, 0x1F)
|
||||
|
||||
ekrana_yaz_konum("[OK]", 11, 3, 0x1A)
|
||||
ekrana_yaz_konum("Hesap: 1..10 kare toplami =", 11, 8, 0x1F)
|
||||
toplam = 0
|
||||
dongu i icinde 1..10:
|
||||
toplam = toplam + i * i
|
||||
sayi_yaz(toplam, 11, 36, 0x1E)
|
||||
|
||||
ekrana_yaz_konum("[OK]", 13, 3, 0x1A)
|
||||
ekrana_yaz_konum("COM1 seri port (0x3F8) ve VGA 80x25 metin ekrani", 13, 8, 0x1F)
|
||||
|
||||
# Alt Bilgi Çerçevesi
|
||||
ekrana_yaz_konum("+----------------------------------------------------------------------------+", 16, 1, 0x1B)
|
||||
ekrana_yaz_konum("| DURUM: cekirdek hazir; seri porta ve VGA metin ekranina yaziyor. |", 17, 1, 0x1E)
|
||||
ekrana_yaz_konum("| NOT : Cekirdek mantiginin tamami KabaLang ile yazilmis, LLVM ile yerel |", 18, 1, 0x17)
|
||||
ekrana_yaz_konum("| 64-bit ELF makine ikilisine derlenmistir. |", 19, 1, 0x17)
|
||||
ekrana_yaz_konum("+----------------------------------------------------------------------------+", 20, 1, 0x1B)
|
||||
|
||||
ekrana_yaz_konum(">> Cekirdek isini bitirdi, islemci durduruldu.", 22, 3, 0x1E)
|
||||
|
||||
seri_yaz("VGA yazildi; cekirdek durduruluyor.")
|
||||
dur()
|
||||
Reference in New Issue
Block a user