# 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