Kendi Windows NT Kernelimizi Derleyelim

Nisan 30, 2013 at 4:51 pm (1)

Dökümanın Forum ve Yardım Konusu Linktedir : http://www.tahribat.com/Forum-Dokuman-Kendi-Windows-Nt-Kernelimizi-Derleyelim-147926/

Merhaba arkadaşlar, sizlere pek çoğunuzun bilmediği, ve hatta olmasına ihtimal vermediği bir olayı anlatacağım :) Windows NT 5.2 kernelini derleyeceğiz ve kendi kernelimizi test edeceğiz.

Öncelikle hemen açıklığa kavuşturayım, evet Microsoft NT 5.2’nin kaynak kodlarını çoktan açtı, ancak sadece belirli üniversitelere ve akademik amaçlı. Tabi ki internete de düştü :)

NT 5.2 nedir biraz daha açıklığa kavuşturmak adına, NT Kerneli versiyonları ile Windows versiyonlarını karşılaştıralım.

Windows 2000 NT 5.0
Windows XP NT 5.1
Windows Server 2003 NT 5.2
Windows XP 64 bit NT 5.2
Windows Vista NT 6.0
Windows 7 NT 6.1
Windows Server 2008 NT 6.1
Windows 8 NT 6.2

İşte Microsoft’un akademik amaçlarla kaynaklarını açtığı kernel NT 5.2 yani Windows Server 2003 ve XP x64 işletim sistemlerinin çekirdeği.

Dolayısıyla bu kernel’i test etmek için, sanal makinaya server 2003 ya da xp 64 kurmalıyız.  Bunları anlatmadan önce, biraz NT kerneli hakkında bilgi vereyim, böylece elimizde neyin kaynak kodu olduğu daha netleşsin.

Windows NT kerneli aşağıdaki isimlerden birisi olabilir.

Ntoskrnl.exe   : Tek işlemcili bilgisayarlar için

Ntkrnlpa.exe   : Tek işlemcili bilgisayarlar için PAE destekli

Ntkrnlmp.exe  : Çok işlemcili bilgisayarlar için

Ntkrpamp.exe : Çok işlemcili bilgisayarlar için PAE destekli

Sonuncusu sadece 32 bit OS lar için geçerlidir zira 64 bit OS lar için PAE ye ihtiyaç yoktur. PAE nedir derseniz tamamen konu dışı olduğu için anlatmayacağım, sadece şunu söyleyim 32 bit işlemcilerin 64 GB a kadar bellek adresleyebilmesini sağlıyor. Normalde bu sınır 4 GB dır.

Nt kerneli gördüğünüz gibi tek bir exe dosyasından ibarettir ancak exe uzantısına aldanmayın, çift tıklayınca çalıştırabileceğiniz programlardan değil :) bir kaç katman içeren ve tüm kernel fonksiyonlarını export eden bir dosya.

Bu arada 64 bit versiyonlarda kernel ismi değişmez ama kernelin kendisi tamamen değişir. Ayrıca bu isimler özgün isimdir, yani kendi bilgisayarınızdaki kerneli bulup (çok işlemcili pc bile olsa ntoskrnl.exe olabilir) sağ tıklayın, ayrıntılardan özgün dosya ismine bakın, kernelin asıl ismi odur.

Bir de kısaca HAL dan bahsetmek istiyorum. Hardware abstraction layer, yani donanım soyutlama katmanı,  kernel’in farklı donanımlarda bile hiç bir değişiklik yapılmaksızın çalışmasını sağlar, yani donanımı soyutlar. Ancak burda donanımdan işlemci yani mimari anlaşılmasın. Mimari kernel’in işidir, ve her mimariye göre kernel değişir, ancak aynı mimaride (x86 örneğin) farklı anakartlar için farklı kerneller üretilmesini engeller. Yani Mimari dışındaki tüm donanım farklılıkları ile kendisi ilgilenir ve kernele standart bir arabirim sunar.

Özetle, donanıma bağımlı olan windows bileşenleri kernel ve hal’dır. Bunlar sayesinde sistemin gerikalanı değiştirilmeksizin, windows farklı mimarilere ve donanımlara uyarlanabilir.

Hal, kernel gibi system32 dizininde bulunur, dosya adı ise hal.dll dir. Tabi bu dosyada alelade bir dll dosyası değildir, isimler kafanızı karıştırmasın, sistemdeki en aşağı seviye kodlar bu dosyada çalışır.

Derliyoruz…

Peki nerede bu kaynak kodlar, öncelikle iyi haber, bildiğiniz gibi Windows’u linux’dan ayıran en önemli özelliği kolay ve kullanışlı olması.  Göreceksiniz ki, windows’un kernelini derlemek, linux da herhangi bir program kurmaktan bile daha kolay :)

Öncelikle aşağıdaki linkten kernel kodlarını ve derleme araçlarını indirin. Evet 15 mb lık bir zip dosyasında hem kernel hem de compiler, assembler, linker vb araçlar, hemde kernel ile ilgili ayrıntılı dökümanlar mevcut.

Ben olayı basitleştirmek adına bir build_x86.bat dosyası hazırladım,  aşağıdaki zip dosyasının içindeki WRK klasörünü C:\ dizini altına kopyalayın, C:\WRK olacak.

[Link güncelleme: dll lerden bir tanesi eksikti, internetten bulabilirsiniz.]

https://drive.google.com/file/d/0B0V9vDQzWKgrQXdHRmpPaHB6T1dHWWVSc1JSLVp6RnVzdElz/edit?usp=sharing

Derlemek için tek yapmanız gereken, C:\WRK dizinine gelip build_x86.bat ı çalıştırmak, derleme işlemi bir kaç dakika sürecektir, devam etmek için bir tuşa basın’ı gördüğünüzde derleme işlemi tamamlanmıştır.

Derledik, peki kernelimiz nerde? C:\WRK\base\ntos\BUILD\EXE dizinine geliyoruz, wrkx86.exe dosyası bizim kernelimizdir.

İsmi neden ntoskrnl.exe gibi değil diye sormayın, zira bu kernel Windows Research Kernel olarak geçiyor ve closed source değil shared source :)

Kendi Kernelimizi Yaratalım Ve Deneyelim

Bu bölümü bir video olarak hazırladım, 30 dakikalık ayrıntılı bir video, sıfırdan tüm adımları gösteriyor. Video da sırasıyla şunları yapıyorum.

  • Kernel’i C:\ ye çıkar
  • Kodu dökümantasyonu ve derleme araçlarını göster
  • Kernel hakkında bilgi ver
  • Yeni kurulmuş temiz bir Windows Server 2003 aç ve göster
  • Kendi derlediğimiz kernel’i ekle ve o kernelden başlat ve göster
  • Kernel’e kod ekle, bu kod sayesinde yeni kernel, içinde tahribat kelimesi geçen hiç bir dosyayı açmayacak. Sistemi bu tahribat kerneli ile başlat sonuçlarını test et.

http://vimeo.com/31178127

Reklamlar

Kalıcı Bağlantı 8 Yorum

Koruma Mekanizması ve Erişim kontrolleri

Ekim 23, 2009 at 2:20 am (Sistem Programlama) (, , , , )

Intel 386 Ailesi ve Korumalı Mod Yazılım Mimarisi başlıklı yazımda korumalı mod’un getirdiği yenilikleri,

Korumalı Mod’da Hafıza Yönetimi, Segmentasyon ve Sayfalama başlıklı yazımda ise, korumalı modda bellek erişimini ayrıntılarıyla anlatmıştım.

Bu yazıda, bellek erişimi sırasında uygulanan koruma mekanizmasının ayrıntılarını ve aşamalarını inceleyeceğiz. Ancak tam olarak kavramanız için öncelikle diğer iki yazıyı okumuş olmanız gerekir.

Koruma Mekanizması

Koruma mekanizması, çeşitli koruma bitleri sayesinde  bellek erişimine izin verilip verilmesine mantığına dayanır. Bir çok aşaması vardır.

Koruma mekanizmasını, segment düzeyinde koruma ve sayfa düzeyinde koruma olarak inceleyebiliriz.

Segment düzeyinde koruma

Segment düzeyinde korumanın aşamaları şunlardır.

  • Ayrıcalık seviyesi kontrolü
  • Limit kontrolü
  • Tip kontrolü

Şimdi bunları ayrıntılı olarak inceleyelim. Yazının devamını oku »

Kalıcı Bağlantı 3 Yorum

Korumalı Mod’da Hafıza Yönetimi, Segmentasyon ve Sayfalama

Ekim 22, 2009 at 3:02 am (Sistem Programlama) (, , , , )

Ön bilgilendirme:

Daha önce yazdığım yazılar sistem programlama konusuna birer giriş niteliği taşıyordu. Ancak bu yazıyla birlikte gerçekten başlamış oluyoruz.

Öncelikle şunu belirtmek isterim, eğer bir uygulama programcısıysanız ve bu yazıları genel kültür olsun diye okuyorsanız bundan sonrası pek size göre değil. Ancak sistem programlama konusunda ciddiyseniz muhakkak öğrenmeniz gerekli.

Muhtemelen sevineceğiniz bir haber de vermek istiyorum. Burada öğrendiklerimiz sadece teorik bilgi olarak kalmayacak. Bu bilgileri doğrudan kullanarak C ve Asm ile bir hobby OS yazacağız.

Bu korumalı mod’u tam olarak anlamamızı sağlayacak.  Tamamen gelişime açık olarak tasarlayacağız ve iyi dökümante edeceğiz. Böylece Türk Sistem programcılarının elinde,  korumalı mod mimarisini inceleyebilecekleri basit bir kernel bulunmuş olacak.

Bu yüzden burada anlatacaklarımı anlamaya çalışın ve sadece teorik olmayacağı konusunda bana güvenin. Sanırım artık başlayabiliriz.

Korumalı Mod Hafıza Yönetimi

Korumalı mod’da hafıza erişimi iki biçimde gerçekleşir. Eğer sayfalama mekanizması pasifse, yalnızca Segmentasyon mekanizması ile eğer  Sayfalama aktif ise önce Segmentasyon sonra sayfalama mekanizmaları ile iki aşamada gerçekleşir.

Segmentasyon mekanizması bir sürecin, kod, veri , yığın gibi bölgelerin diğer süreçlerden soyutlamaktadır. Birden fazla süreç çalıştığında hepsi kendi segmentlerinde çalışır ve segment dışına çıktıklarında Genel Koruma Hatası (General Protection Fault) oluşur. Sonrası malum, süreç sonlandırılır.

Sayfalama mekanizmasıyla birlikte süreçlere sanal bellek servisi sunulur , o sürece ait sayfa dizini ve  sayfa tabloları  yardımıyla ,  lineer bellek adresleri  fiziksel adreslerle dönüştürülür.

Segmentasyon mekanizması daima aktiftir , ancak sayfalama mekanizmasını aktiflemek programcının görevidir.

GDT Nedir: GDT (Global Tanımlayıcı Tablosu) bir tanımlayıcı dizisi olarak düşünülebilir. GDT en fazla 8192 tanımlayıcı içerir. Bu tanımlayıcılardan her biri bellekteki bir segmentin özelliklerini tutar. GDTR yazmacı bu tablonun bellek adresini tutar..

Örneğin 10. tanımlayıcı bellekte 0x785400A5 adresinden başlayan ve 0x504F limitine sahip 3. ayrıcalık düzeyinde olan bir segmentin tanımlayıcısı olabilir,  bu durumda segmente erişebilmek için öncelikle GDT tablosunun 10. elemanına erişilir. Segmentin tüm bilgileri alınır.

Segmentasyon Mekanizması : Korumalı modda, segment yazmaçları selektör denilen bir değer tutarlar. Adından da anlaşıldığı üzere bu değer bir seçicidir ve GDT (global tanımlayıcı tablosu) den bir tanımlayıcı seçmeye yarar.

Korumalı mod’da kullanılan bellek adresleri iki bölümden oluşur. Bu 16 bitlik bir selektör  ve 32 bitlik bir offset değeridir.

Önce selektör yardımıyla GDT den bir tanımlayıcı seçilir. Tanımlayıcının içerisinde  segmentin taban adresinin ve limit bilgisinin olduğunu hatırlayın. Daha sonra tanımlayıcıdan alınan taban adresine offset değeri eklenerek gerçek adres elde edilir.

Eğer Sayfalama mekanizması kapalı durumdaysa elde edilen bu adres fiziksel adrestir.  Ancak Sayfalama açıksa bu adres lineer adrestir ve fiziksel hafızadaki karşılığını bulmak için sayfa dizini, sayfa tablosu kullanılır.

Segmentasyon mekanizması ile adresin nasıl elde edildiğini aşağıdaki çizimle inceleyelim. Yazının devamını oku »

Kalıcı Bağlantı 5 Yorum

İntel 386 Ailesi ve Korumalı Mod Yazılım Mimarisi

Ekim 21, 2009 at 4:46 am (Sistem Programlama) (, , , , )

Koruma kavramının ne olduğunu ve neden gerektiğini  “İşletim Sistemi Nedir” başlıklı yazımda kabaca anlatmıştım.

Bu yazıda ise intel işlemcilerinin korumalı mod mimarisini ve korumalı modla gelen yenilikleri inceleyeceğiz.

32 bit intel işlemcileri aynı zamanda birer 16 bitlik işlemci görevi görür . İntel,  geçmişe uyumluluğu korumak amacıyla işlemciyi çeşitli çalışma modlarına ayırmıştır.  Her 32 bit intel işlemcisi  çalışmaya gerçek modda, bir 8086 gibi başlar.

Korumalı moda geçmek programcının görevidir.

Gerçek Mod

Gerçek modda işlemci tipik bir 8086 gibi çalışır, 20 adres bacağı kullanır , 1 mb lik bellek adresleyebilir ve 16 bitlik yazmaçları kullanır.

Bellek erişimi 16 bitlik bir segment yazmacı ve 16 bitlik bir offset değeri ile sağlanır.

Bellek erişimi için toplamda 16+16= 32 bit kullanıldığı halde ram ile cpu arasında toplam 20 adres bacağı olduğu için ancak 2^20=1 mb lik bir adres kullanılabilir.

Segment yazmacı belleğin başından itibaren paragraf sayısını tutar. Bir paragraf 16 bayttır.  Offset ise bu taban adresinden itibaren 64 kb lik bir alanı gösterebilen 16 bitlik bir değerdir.

Yani gerçek modda belleğe erişebilmek için sagment yazmacındaki değeri 16 ile çarpılır ve  offset değeri buna eklenir. Böylece fiziksel adres elde edilir.

Örneğin segment yazmacındaki değer 100 ise bu, taban adres belleğin 100. paragrafı yani, 1600. baytıdır demektir.

Bellek  adresinin 16 ile çarpılması, hex(16 lık ) sistemde 0x10 ile çarpılması demektir. Yani sonuna bir sıfır eklenmesi..

O halde bellek adresini hexadecimal sistemde yazarsak, segment yazmacındaki değerin sonuna bir sıfır ekleyip offset değeri ile toplayınca gerçek fiziksel adresi elde ederiz.

Korumalı Mod

Korumalı mod, işlemcinin en gelişmiş modudur, işlemci bu modda 32 bitlik adresler ve yazmaçları kullanır,  4 GB fiziksel belleği adresleyebilir.

Korumalı modda bellek erişimi GDT, LDT  tabloları  aracılığıyla birkaç aşamada gerçekleşir.  Ayrıca sayfalama mekanizması aktifse, sayfa dizini ve sayfa tabloları da bellek erişiminde birer basamak olmaktadır.

Ayrıca bu modlar dışında virtual86 modu bulunmaktadır. Bu mod ise gerçek mod programlarının korumalı mod altında çalışabilmesi için düşünülmüştür.

Yazının devamını oku »

Kalıcı Bağlantı 10 Yorum

Dosya Sistemi Nedir? Fat Dosya Sistemi.

Ekim 21, 2009 at 1:30 am (Sistem Programlama) (, , , , )

Dosya sistemi işletim sistemlerinin olmazsa olmazıdır. Zaten dosya sistemi olmayan birşeye işletim sistemi demek de pek mantıklı değil.

Bellek yönetimi, koruma mekanizması gibi önemli konulara geçmeden önce, daha kolay anlaşılır bir konu olan dosya sistemini aradan çıkarayım : )

Öncelikle harddisklerin yapısı hakkında biraz bilgi verelim.

Disklerin okunması ve yazılması, okuma/yazma kafası sayesinde olur.  Bu kafa  ileri geri hareket ederek dönen diskin her sektörüne  erişebilirler.

kafalar

Çizimim biraz kötü ama kusura bakmayın: ) …………………………………………….

Disk, erişim kolaylığı açısından mantıksal bölümlere ayrılmıştır.

Bir diske yazılabilecek veya  okunabilecek en küçük veri kümesi bir sektördür.  1 baytlık bir veri yazılacak olsa bile diske en az bir sektör yazılır.

Disk, eş merkezli dairelere bölünmüştür ve her bir daireye  iz (track) denir.  İzler sektörlerden oluşur. Her izde eşit sayıda sektör bulunur.

sektor

Görüldüğü gibi en iç izde de en dış izde de aynı sayıda sektör bulunmakta. Farklı izler farklı çizgisel hızda döndükleri için bu gereklidir.

Ayrıca alt ata bulunan diskler deki aynı izler bir silindir oluşturur. Örneğin birinci diskteki 10. iz ve ikinci diskteki 10. iz toplamda bir silindir oluşturur.

Harddisk mantığını kavradıktan sonra Dosya sistemine neden ihtiyaç duyarız bundan bahsedelim.

Kullanıcılar diske mantıksal dosyalar üzerinden erişirler. Mesela bir klasör oluşturur, adına MP3 der ve müziklerinizi içine yerleştirsiniz. Başka bir klasör’e programlar der ve içine programları yerleştirirsiniz.

Bu iki klasör mantıksal olarak birbirinden farklı olmasına karşın,  işlemci açısından aralarında hiçbir fark yoktur. İşlemci harddiski bir sektör deryası olarak görür sadece.  Yani onun için dosya, mp3, program yoktur. xxxx numaralı sektör vardır.

Oysa kullanıcının hangi dosyasının kaçıncı sektörde olduğunu, devamının hangi sektörlerde bulunduğunu aklında tutamaz.

O halde bunları tutacak bir sistem programı yazılırsa biz sadece dosyanın ismiyle o dosyaya erişebiliriz.  İşte bu sistem programı dosya sistemidir.

Yazının devamını oku »

Kalıcı Bağlantı 9 Yorum

İşletim Sistemi Nedir?

Ekim 19, 2009 at 5:53 pm (Sistem Programlama) (, , , , )

İşletim sisteminin ana görevi donanım kaynaklarını yönetmek ve kullanıcı ile donanım arasında arayüz görevi görmektir.

İşletim sistemi, kullanıcıyı alt seviyeli işlemlerden soyutlar ve kullanıcının hata yapmasını önlemek için,  tüm alt seviyeli işlemleri kendisi halleder.

Örneğin kullanıcının doğrudan disk donanımına erişmesine izin vermez , onun  dosya sistemi ve  mantıksal dosyalarla diske erişimini sağlar.

Aynı şekilde çevre aygıtlara erişim,  portlar’a erişim de işletim sisteminin görevidir.

İşletim sisteminin en temel görevlerinden biriside işlemci ve belleği süreçler(process) arasında paylaştırmaktır.

Ayrıca işletim sistemi bu süreçlerin servis sağlayıcısıdır ve onlara birçok sistem servisi sunar (api,sistem çağrıları).

Yani işletim sisteminin temel görevleri şunlardır.

* Bellek yönetimi

* Süreç yönetimi

* Dosya sistemi

* G/Ç aygıt yönetimi Yazının devamını oku »

Kalıcı Bağlantı Yorum Yapın

Sistem Programcılığı Nedir?

Ekim 19, 2009 at 6:40 am (Sistem Programlama) (, , , , )

İlk yazımda sistem programlama nedir, sistem programcıları ne iş yapar, bu işte para varmıdır gibi genel konulardan bahsedeceğim.

Sistem programcısı en basit haliyle işletim sistemi, aygıt sürücü gibi sistem programlarını yazan kişidir. Tabiki sadece bunlardan ibaret değildir.

Sistem programcılığı, programcılığın en zor ancak en saygın alanını oluşturur.  Sistem programcısı her zaman makinaya yakın durur. Donanımla doğrudan iletişim halindedir. En temel sistem kaynaklarını yönetir.

Günümüzde işletim sistemleri ve sürücüler yaklaşık  %80 oranında C dili ile yazılırlar. Geriye kalan kısmı ise makina dili ile yazılır.

C, yapısı ve yaradılış amacı gereği çok güçlü ve esnek bir dildir. C nin yaradılış amacı makina diline alternatif olmasdır ve tamamen sistem programlama amacıyla tasarlanmıştır.

Sadece unix işletim sistemini yeniden yazmak için, gereksinimlerden dolayı yaratılmış,  yaratıcısı olan Dennis Ritchie ‘nin bile ummadığı bir başarı yakalamıştır. Yazının devamını oku »

Kalıcı Bağlantı 19 Yorum