/i/Yazılım

Umuyoruz ki geleceğin yazılımcıları bu altinciden çıkacak!
    başlık yok! burası bom boş!
http://wiki.osdev.org/Paging
  1. 1.
    +2
    Ve geldik son derse.

    Sayfalama, belleğin sanal adreslerle yönetilmesine, bellek alanlarının korunmasına yarayan bellek tekniğidir.

    Sayfalama, basitçe üç katmandan oluşur.

    Sayfalar, sayfa tabloları ve sayfa dizinleri. http://wiki.osdev.org/Paging

    Her bir sayfa, belleğin 4 kb'lık kısmını adresler. Bir sayfa tablosunda 1024 tane sayfa barınabilir. Bir sayfa dizininde de 1024 tane sayfa tablosu barınabilir.

    4 * 1024 * 1024 = 4 GB, bu sayede tüm bellek alanı adreslenebilir.

    64 bit işletim sistemlerinde PML4T ve sayfa dizini tablosu diye iki adet katmana sahiptir. Fakat onlar biraz daha karışık. Benim de pek bilgim yok.



    Sayfa tablosu birimi (Sayfa)






    Sayfanın son 20 biti (12 - 32) bitler, sayfanın hangi bellek alanını adreslediğini söyler. Present biti o sayfanın olup olmadığını belirtir, mutlaka 1 yapmalısınız. RW biti sayfanın hem okunur hem de yazılabilir olduğunu belirler, onu da duruma göre 1 ya da 0 yapın.



    Sayfa dizini birimi (Sayfa tablosu)






    Sayfa dizini birimi de aynı sayfa gibidir. Tek farkı adreslenen 4 kb bellek değil, sayfa tablosunun bellekteki adresi bulunur. Hem sayfa tablosu hem de sayfa dizinleri bellekte 4 kb hizalı (Adresi 4096'ya bölünebilir) bir şekilde bulunmalıdır.

    Küçük bir örnek verecek olursak, 0 - 400000 adreslerinin C0000000 - C0400000 olmasını sağlamak için;

    Adresi 22 bit sağa kaydırırsınız. Bu kaçıncı sayfa tablosu olduğunu belirtir.

    Adresi 12 bit sağa kaydırırsınız. Ve 0x03FF ile bitsel or işlemi uygularsınız. Bu da kaçıncı sayfa olduğunu belirtir.

    Bulduğunuz sayfa tablosundan ve sayfadan itibaren istediğiniz kadar 4 kb'lık adresi de yönlendirirsiniz.

    Bu üstteki örnek için 768. sayfa tablosu ve 768. sayfa tablosunda 0. sayfadan itibaren başlamanız gerekmektedir.

    0. sayfayı aldınız ve gerçek bellek adresini 0 yaptınız. Sonuç olarak C0000000 - C0001000 adresleri 0 - 1000 adreslerine sayfalandı

    1. sayfayı aldınız ve gerçek bellek adresini 1000 yaptınız. Sonuç olarak C0001000 - C0002000 adresleri 1000 - 2000 adreslerine sayfalandı.

    Bu şekilde 1023. sayfaya kadar devam ederseniz, C0000000 - C0400000 arasını sayfalamış olursunuz. (3GB - [3GB + 4MB] ---> 0 + 4MB)

    Her bir sayfa 4 kb adresler demiştim, 16'lık formatta 1000, bizim kullandığımız sayı sisteminde 4096 oluyor.

    Kolay bir sayfalama yöntemi de Identify Paging'tir.
    Üstteki örneğin aksine her sanal adres aynı gerçek adresi alır.

    (bkz: http://wiki.osdev.org/Identity_Paging)

    Bu da son dersti. Bunları öğrenmeniz ve yapabilmeniz temel bir işletim sistemi oluşturmanız için yeterlidir.

    işletim sistem yazmayı öğrenebileceğiniz kaynaklar:
    (bkz: http://wiki.osdev.org)
    (bkz: http://www.osdever.net/bkerndev/Docs/intro.htm)
    (bkz: http://www.jamesmolloy.co.uk/tutorial_html/)

    Artık C, C++ ve Assembly derslerine başlıyorum.
    ···
   tümünü göster