buradan - Hasan Manzak
Transkript
buradan - Hasan Manzak
KARADENİZ TEKNİK ÜNİVERSİTESİ MÜHENDİSLİK FAKÜLTESİ BİTİRME ÇALIŞMASI IBM PC / INTEL x86 MİMARİSİ İÇİN BİR ÖNYÜKLEME PROGRAMI GELİŞTİRİLMESİ HASAN MANZAK 164382 DANIŞMAN: YRD. DOÇ. DR. TUĞRUL ÇAVDAR BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ DONANIM ANABİLİM DALI BAHAR 2013 ÖNSÖZ Yakın çevremdeki insanlar, çok uzun bir süredir tamamen baştan yazılmış bir işletim sistemi geliştirmek isteğimi bilirler. Ülkemizde “Ulusal İşletim Sistemi” adı altında geliştirilmeye başlanmış ve yola çıkış felsefesinin, geliştirme politikasıyla hiç uyuşmadığı bir proje olan "PARDUS" projesinin başarısızlığı sonrasında gerçek bir ulusal işletim sistemi geliştirme isteğimin daha da alevlenmesi sonucu olarak aktif bir şekilde işletim sistemi geliştirmek yoluna yönlenmiş bulunuyorum. Bu yolun ilk adımları olan bu proje, PC bilgisayarınıza güç verdiğiniz andan kullandığınız işletim sisteminin, kontrolü tamamen size devrettiği ana kadar geçen süre içerisinde yapılması gereken işlerin ilk adımını, Ön Yükleme işlemini konu almaktadır. Projenin felsefik amaçlarının yanı sıra bir diğer "çok önemli" olarak nitelendirebileceğim amacı, onlarca, Native Code, Mikroprocessors, PC BIOS ve daha bir çok bilgisayar mühendisliği temelleri bilgisi-kültürü olmayan, bir nevi C# mühendisleri yetiştiriyor olmamıza rağmen, "bir işletim sistemini kullanmak" yerine "bir işletim sistemi geliştirebilmek" yetilerine sahip mühendislerimizin de varlığını ortaya koyabilmektir. Çalışmalarıma başladığım günden bu yana bana bir hoca olarak değil, bir insan gibi yaklaşan, kendi çalışma alanı olmamasına rağmen bu proje üzerinde desteğini ve yönlendirmelerini eksik etmeyen sevgili danışman hocam Yrd. Doç. Dr. Tuğrul ÇAVDAR'a, geliştirme süreci boyunca fikir alış-verişlerinde bulunduğum ve gerek teknik, gerek lojistik açılardan ilgi ve desteklerini esirgemeyen alt dönem arkadaşlarım Hasan Hüseyin ÇAKIR ve Muhammed Sait ÖZÜER 'e, 8 senelik bir lisans öğrencisi olarak her türlü, her türlü kahrımı çeken, tüm gerginliğime ve stresime rağmen bana sonsuz sabır, sevgi ve anlayışla davranan, yanağımdan öpücüğü, masamdan kahvemi eksik etmeyen çok sevdiğim annem Ulviye MANZAK'a ve yoluma ışık tutmuş diğer tüm herkese saygı ve sevgilerimi iletir, sonsuz teşekkürlerimi sunmayı bir borç bilirim. Hasan MANZAK TRABZON 2013 II İÇİNDEKİLER ÖNSÖZ ................................................................................................................................. II İÇİNDEKİLER .................................................................................................................... III ÖZET ................................................................................................................................... IV SEMBOLLER VE KISALTMALAR .................................................................................. V 1. GİRİŞ ................................................................................................................................. 1 2. IBM PC / Intel x86 MİKRO MİMARİSİ VE PC ÖN YÜKLEME .................................. 3 2.1. PC x86 MİKRO MİMARİSİ .......................................................................................... 3 2.2. PC ÖN YÜKLEME ADIMLARI ................................................................................... 4 3. GELİŞTİRİLEN ÖN YÜKLEME PROGRAMI ............................................................... 8 3.1. MBR PROGRAMI ......................................................................................................... 8 3.1.1. MBR GİRİŞ VE ÖN HAZIRLIKLAR ........................................................................ 8 3.1.2. MBR BÖLÜM TABLOSU KONTROLLERİ ............................................................ 9 3.1.3. MBR TARAFINDAN VBR'NİN YÜKLENMESİ ..................................................... 9 3.1.4. MBR DURUM MESAJLARI ................................................................................... 10 3.2. VBR PROGRAMI ........................................................................................................ 11 3.2.1. GİRİŞ VE ÖN HAZIRLIKLAR ................................................................................ 11 3.2.2. VBR TARAFINDAN BİR AÇILIŞ MENÜSÜ YÜKLENMESİ ............................. 13 3.2.3. MENÜ KULLANICI ETKİLEŞİMİ - İŞLETİM SİSTEMİ SEÇİLİMİ ................... 15 3.2.4. SEÇİLİ İŞLETİM SİSTEMİNİN YÜKLENMESİNE DEVAM EDİLMESİ........... 17 4. İRDELEME VE SONUÇLAR ........................................................................................ 19 5. GELECEKTE YAPILMASI PLANLANAN ÇALIŞMALAR ....................................... 21 6. KAYNAKLAR ................................................................................................................ 23 III ÖZET Bu projede IBM PC (Personal Computer - Kişisel Bilgisayar) / Intel x86 mimarili bilgisayarlar için bir Ön Yükleme Program Serisi geliştirilmesi amaçlanmıştır. Proje içerisinde, PC'ye güç verildikten hemen sonra devreye giren BIOS (Basic Input/Output System) programının, kontrolü birincil ön yükleme programına devretmesinden sonra, kontrolün, açılış yüklemesine devam edecek ilgili işletim sistemine devredileceği ana kadar gerçekleştirilmesi gereken işlemler ve CPU (Central Processing Unit - Merkezi İşlem Birimi, İşlemci)'nun bu aşamadaki çalışma modu olan Real Mode konuları irdelenmiştir. İşlemci, Real Mode altındayken 16-Bit genişliğinde veri uzayı ve 20-Bit genişliğinde bir adres uzayı mevcuttur. İşlemci tarafından üretilen 20-Bitlik adresler PC içerisindeki donanımlara direkt erişim sağlatan gerçek adreslerdir ve dolayısıyla yazılan ön yükleme programlarının bu adres-veri genişliklerine uygun, Real Mode altında çalışabilecek programlar olması gerekir. Real Mode altında çalışabilecek bu ön yükleme programlarının, işlemcinin Real Mode spesifik kaydedicilerini kullanılması ve Assembly dilinde yazılacak bu programları makine koduna dönüştürecek olan Assembler araçlarının da Real Mode Aware olması gerekir. Bu amaçla, Intel 8086 CPU Instruction Set Mnemonic'leri ve Intel 8086 işlemcisini emüle eden emu8086 yazılımı kullanılmıştır. Üretim ortamı testlerini gerçekleştirmek için de VMWare Workstation yazılımı kullanılmıştır. Ön yükleme ortamları olarak projede Harddiskler hedef alınmış ve makine koduna derlenmiş programların bu ön yükleme ortamlarına aktarılabilmesi için gerekli disk erişim araçları da bu proje dahilinde, Delphi programlama dili ve Windows File System API (Application Programmer Interface)'ları kullanılarak geliştirilmiştir. Sonuç olarak, PC'nin açılış sürecini BIOS'tan devralabilen, interaktif olarak kullanıcıya açılışa devam edilecek işletim sistemini seçme imkanı tanıyabilen ve kontrolü seçili işletim sisteminin yükleyicisine devredebilen bir ön yükleyici program serisi geliştirmek amaçlanmış ve bu amaca ulaşılmıştır. IV SEMBOLLER VE KISALTMALAR PC Personal Computer BIOS Basic Input/Output System CPU Central Processing Unit API Application Programmer Interface O.S. Operating System NTFS New Technology File System CISC Complex Instruction Set Computing Exx Extended xx BP Base Pointer IP Instruction Pointer CS Code Segment SS Stack Segment shl Shift Left Logical xxh Hexadecimal number xx POST Power-on Self Test LBA Logical Block Addressing CHS Cylinder-Head-Sector MBR Master Boot Record VBR Volume Boot Record MS Microsoft V CRLF Carriage Return Line Feed BPB BIOS Parameter Block HPC Head Per Cylinder SPT Sector Per Track ASCII American Standart Code for Information Interchange FASM Fast Assembler MASM Microsoft Assembler VI 1. GİRİŞ Çağımızda, bilgisayar kullanımı, çok çeşitli alanlara yayılmış ve insanların günlük ihtiyaçları konusunda çok yaygın bir hal almıştır. Donanımsal olarak en basit bilgisayarın bir bellek modülü ve bir işlemciden oluştuğu göz önüne alınarak, günlük yaşantıda ihtiyaç duyulan muazzam ölçüde veri yoğunluğunun oluşmasıyla birlikte (bellek kullanımı) bu verilerden anlamlı sonuçlar çıkartabilmek adına gene muazzam ölçüde işlem kapasitesine (işlemci kullanımı) ihtiyaç duyulmaktadır. Cep telefonlarından kullanılan PC'lere, ve bu cihazların kullanım alanları açısından askeriye uygulamalarından ticari uygulamalara kadar bilgisayar kavramı artık hemen her yerdedir. Genel manada bu denli yaygınlaşan bilgisayar ihtiyacının ve kullanımının bir diğer ana kolu olan PC ihtiyacı ve kullanımı, hem ticari hem de akademik alanlarda PC donanımı ve yazılımı teknolojilerinin ilgi çekmesini sağlamıştır. Yazılım teknolojilerinin ana başlıklarından birisi olan "PC İşletim Sistem(ler)i (PC Operating System - O.S.)" son birkaç on yıldır büyük miktarda gelişime ve araştırmaya konu olmuştur. Ön yükleyiciler, Çekirdek ve Araçlar şeklinde üç temel ana kısma ayrılabilecek ve PC'lerin yaygınlaşmasıyla paralel bir şekilde yaygınlaşma profili oluşturan işletim sistemlerinin en temel ve en önemli görevi-amacı, uygulama yazılımlarının, donanımsal olarak PC kaynaklarını en etkin şekilde kullanabilmesini ve bu uygulama yazılımlarının verilerinin birbirinden izolasyonunu sağlamaktır. Ülkemizde işletim sistemi geliştirmek adına "Ulusal İşletim Sistemi" başlığı ile "PARDUS" projesi adımı atılmış fakat birkaç yıl sonra bu proje başarısızlığa uğramıştır[1]. PARDUS, geliştirme süreci politikası olarak Linux İşletim Sistemi Çekirdeği üzerine kurulmuş, diğer araçların ve sistem uygulamalarının yeniden yazıldığı bir işletim sistemidir. Buradaki problem; örnek olarak dosya sistemi ele alındığında; yeni teknolojiler geliştirmek ve mevcut teknolojilere destek sağlamak yerine var olan bu sistemlerin kullanılmış olması ve yapılan çalışmaların uygulama yazılımları geliştirmekten öteye gitmemiş olmasıdır. Ulusal İşletim Sistemi etiketini taşıyacak olan bir işletim sistemi, başlı başına tüm işletim sistemi teknolojilerini yeniden geliştirmeli ve implemente etmelidir. Bu proje, Ulusal İşletim Sistemi etiketini taşıyabilecek yep yeni bir PC işletim sisteminin geliştirme sürecinin ilk adımı olan Ön Yükleyiciler konusunu ele almıştır. Başlangıç olarak, mevcut NTFS (New Technology File System) dosya sistemi desteği 2 üzerinden yola çıkılmış olunup bahsi geçen işletim sisteminin geliştirme süreci içerisinde yeni bir dosya sistemi geliştirilmesinin ardından, o dosya sistemi spesifik detaylar, bu projenin içine dahil edilecektir. Böylelikle bir taraftan genel geliştirme süreci için bir başlangıç adımı atılmış, bir taraftan mevcut NTFS teknolojisine destek sağlanmış, diğer bir taraftan da ana sürecin felsefik olarak amaçları dışına taşılmamış olunacaktır. 2. IBM PC / Intel x86 MİKRO MİMARİSİ VE PC ÖN YÜKLEME 2.1. PC x86 MİKRO MİMARİSİ x86 ifadesi, Intel'in genel amaçlı CISC (Complex Instruction Set Computing) işlemci ailesi için kullanılan genel bir terimdir. Bu aile içerisinde 8086, 80186, 80286, 80386, 80468, Pentium ve takip eden işlemciler bulunmaktadır [2]. Günümüzde x86 ifadesi, 32bit'lik işlemcileri temsil etmek için de kullanılır. 8086 işlemcisi, 16-bit'lik kaydedicilere, 20-bit'lik adres uzayına ve 16-bit'lik veri uzayına sahiptir. Böylece 8086 işlemcisi ile 1-MB büyüklüğünde bir bellek uzayı adreslenebilir ve 64-KB büyüklüğünde bir veri havuzu üzerinde hesaplamalar yapılabilir. 16-bit'lik kaydedicilerle 20-bit'lik adres hattının sürülmesi iki adet genel amaçlı kaydedicinin kaydırma+toplama işlemlerine tabi tutulması ile sağlanır. 80386 işlemcisi, Intel'in, özellikle çoklu-görev için optimize edilmiş ve 32-bit'lik hesaplama temeli üzerine tasarlanmış bir işlemcisidir. 32-bit kaydedicileri sayesinde 4-GB büyüklüğünde bellek adres uzayı ve gene 4-GB büyüklüğünde bir veri uzayı içinde hesaplamalar yapabilmektedir. Bu işlemci içerisinde sanal bellek yapısı da desteklenebilir durumdadır ve işlemcinin adres dönüşümleri, çoklu-görev, koruma ve sayfalı sanal bellek yetenekleri mevcuttur. 8086 sonrasındaki tüm x86 ailesi işlemciler, geriye yönelik destek sağlamak adına 8086 yeteneklerini ve 8086 çalışma modunu da barındırır durumdadır. Proje dahilinde kullanılan x86 ailesi genel amaçlı kaydedicileri Tablo 1, Tablo 2 ve Tablo 3' te gösterilmiştir. Tablo 1. x86 Genel amaçlı kaydediciler Bits 31 .. 0 Bits 15 .. 0 Bits 15 .. 8 Bits 7 .. 0 EAX EBX ECX EDX EBP ESI AX BX CX DX BP SI AH BH CH DH AL BL CL DL 4 Tablo 1'in devamı EDI ESP DI SP Tablo 2. x86 Segment kaydedicileri Bits 15 .. 0 CS (Code Segment) SS (Stack Segment) DS (Data Segment) ES (Data Segment) FS (Data Segment) GS (Data Segment) Tablo 3. x86 Durum ve Emir kaydedicileri Bits 31 .. 0 Bits 15 .. 0 EFLAGS EIP FLAGS IP x86 kaydedicileri hakkında yapısal detaylar [2] ve [3] kaynaklarından edinilebilir. 2.2. PC ÖN YÜKLEME ADIMLARI PC'ye ilk güç verildiği anda işlemcinin emir adresleme ile ilgili kaydedicileri CS ve IP aşağıdaki varsayılan değerlere yüklenirler: CS = F000h , IP = FFF0h 5 İşlemci, çalışma modu olarak 8086 işlemcisinin çalıştığı mod olan Real Mode [3,4] altında olduğundan dolayı üretilen tüm adresler PC anakartı üzerindeki donanımlara direkt erişim sağlayan gerçek, fiziksel adreslerdir. İcra edilecek ilk emir BIOS programının ilk emridir ve BIOS fiziksel, donanımsal olarak F0000h adresine haritalanmıştır. PC anakartında fiziksel olarak haritalanmış donanımların şematiği Şekil 1'de yüzeysel olarak gösterilmiştir. Şekil 1. PC donanımları bellek haritası [8] 6 Real Mode içinde icra edilecek bir sonraki emrin erişimi sağlanacak olan bellek, CS'in 4-bit sola kaydırılması ve IP ile toplanması sonucu oluşan veri ile adreslenir [3,4]: Not: Dikkat edilmesi gerekilen önemli bir nokta, x86 işlemcilerde segment kaydedicilerinin, assembly programcıları tarafından kullanılamayacak, Protected Mode [3,13]'a özel, gizli kısımlarının mevcut olduğudur. CS bu işlemcilerde varsayılan olarak FFFF0000h verisine yüklenir. Real Mode'da adres hesaplaması hususunda bir farklılık olmamakla birlikte icra edilecek emri işaret edecek kaydedici bu işlemcilerde IP değil, EIP'dir ve kaydırma-toplama işlemlerinde EIP kullanılır. Hesaplanan bu adrese Reset Vector adı verilir ve takip eden emir, BIOS programının giriş adresine sıçrama emridir: Bu sıçrama öncesi tüm CS içeriği temizleneceğinden CS:IP lineer adresi 000Fh:0000h olarak yüklenecek ve icra edilecek bir sonraki emir BIOS'un POST (Power-On Self Test) programının ilk emri olacaktır. POST işlemi tamamlandıktan sonra BIOS flash belleği içinde Boot Device Priorty olarak tanımlı açılış yükleyici ortamları sırasına göre, sırayla her bir ortamın LBA(Logical Block Addressing)_0 Sector ya da Fiziksel 0 (sıfır) Sektör yani MBR (Master Boot Record) Sector [5]'ü 0000:7C00h adresine yüklenir ve bu verinin son iki byte'ının AA55h verisi olup olmadığı testi yapılır. AA55h verisi Magic Number ya da Boot Signiture (Açılış İmzası) olarak isimlendirilir ve yükleme yapılan ortamın Bootable (Yükleme yapabilir) olduğu anlamını taşır. Veri depolama ortamlarında varsayılan sektör genişliğinin 512-byte olduğu göz önüne alındığında BIOS, 0000h:7DFEh adresinde aradığı AA55h verisini bulamadığında bir sonraki açılış ortamının 0 (sıfır) sektörünü belleğe yükler ve Boot Signiture testini tekrarlar. Her bir ortamın yükleme ve testi sonucunda gerekli imza bulunamazsa, BIOS, kullanıcıyı açılış yapılacak ortamı sisteme eklemesi hususunda bir uyarı mesajı ile bilgilendirir ve imzanın taranacağı ortam yerleştirilene kadar sistemi sonsuz döngü içine sokar. Gerekli imzanın bulunması halinde ise BIOS, JMP 7C00h emri 7 ile kontrolü, o adrese yüklemesi yapılmış MBR programına devreder. Bu noktadan itibaren ön yükleme kontrolü MBR elindedir. MBR programının tek görevi, kendi içindeki Partition Table (Bölüm Tablosu)'dan faydalanarak yüklemesi yapılacak işletim sisteminin bulunduğu disk bölümünü ya da medya ortamının başlangıç sektörünü hesaplayıp ilgili işletim sistemi için bölümün ya da ortamın başlangıç sektörü olan Mantıksal 0 (sıfır) Sektör yani VBR (Volume Boot Record) Sector' ündeki veriyi belleğe yüklemek ve kontrolü VBR programına devretmektir. Zira MBR verisi 512-byte genişliğindedir ve bu genişlik tüm işletim sistemini yükleyebilmek için yeterli değildir. VBR genişliği ise bölümün ya da ortamın dosya sistemi özelliklerine göre birden fazla sektörü içererek toplam olarak değişken genişlikte olabilir. Örnek olarak NTFS dosya sistemi için izin verilen en fazla VBR uzunluğu 16 sektör - 8192-KB'tır [6], MS (Microsoft) Windows 7 x86_64 işletim sistemi, bu 16 sektörün 9 adetini [7], MS Windows XP x86 işletim sistemi ise 7 adetini [7] kullanmaktadır. Belirtildiği üzere VBR programı değişken uzunlukta olabilir ve birincil görevi işletim sistemini oluşturan çekirdek dosyalarını açılış ortamından okuyup belleğe yüklemektir. VBR'ın diğer ve tasarımdaki isteğe bağlı olarak mevcut görevleri, kullanacıya bir açılış menüsü sunmak ve menü içeriğine bağlı olarak birden çok işletim sisteminin yüklenebilir olduğu durumlarda interaktifliği sağlayıp kullanıcının istediği işletim sistemini yükletebilmesini sağlamaktır. VBR, tüm bu interaktiflik ve seçim sonrasında işletim sisteminin çekirdek dosyalarını belleğe yükledikten sonra kontrolü çekirdeğe devreder. Bu noktada PC ön yükleme işlemi tamamlanmış olur ve işletim sisteminin yüklenmesine çekirdek tarafından devam edilir. 3. GELİŞTİRİLEN ÖN YÜKLEME PROGRAMI 3.1. MBR PROGRAMI 3.1.1. MBR GİRİŞ VE ÖN HAZIRLIKLAR Projede gerçeklenen MBR yapısı klasik MBR yapısının 1-1 eşleniğidir. Klasik MBR, yapısal olarak 446-byte uzunluğunda bir ön yükleme programı, 64-byte uzunluğunda bölüm tablosu ve 2-byte uzunluğunda açılış imzası içerir. Geliştirilen MBR programı, öncelikle işlemci kaydedicilerinin istenilen değerlere yüklendiğini garanti altına almaktadır. Bu değerler SS ve CS hariç tüm segment kaydediciler için 0h, SS segment kaydedicisi ve SP kaydedicisi için (SS:SP) serbest kullanıma açık belleğin [8] üst sınırı olan 7FFFFh değerleridir (SS=7000h, SP=FFFFh). CS kaydedicisi ancak ve ancak JMP ve RET emirleri ile yüklenebilir. MBR programında gerçeklenen bir sonraki adım, BIOS tarafından yüklenmiş mevcut 512-byte'lık verinin 0000:7C00h adresinden, serbest kullanıma açık bellekte 0000:1000h adresine kopyalanmasıdır. Bu kopyalamanın ardından programın icrası 3-byte genişliğindeki JMP 101Fh emri ile 101Fh adresinde bulunan Bölüm Tablosu Kontrolü' ne devredilir. İcra edilecek emir 101F adresindedir çünkü JMP emrinin de tümüyle bellekten okunmasıyla beraber 30-byte'lık program icrası işlenmiş durumdadır. Şekil 2'de örnek bir ön hazırlık kod bloğu incelenebilir. Şekil 2. MBR ön hazırlık örneği 9 3.1.2. MBR BÖLÜM TABLOSU KONTROLLERİ Bölüm tablosu, 16-byte genişliğinde 4 adet bölüm kaydından oluşmaktadır [9]. Bu kayıtların ilk byte'ı bölümün Aktif olup olmadığını belirtir. Aktif bölümler için bu veri 80h, diğer durumlar için ise 0h'tir. Proje MBR programı, bölüm tablosu içindeki kayıtları teker teker inceleyerek tablonun tutarlılık durumunu kontrol etmekte, kayıtlar içinde aktiflik durumu ilgili byte'ı için 80h ve 0h verilerinden başka bir veri olmamasını, bölüm tablosunda birden fazla aktif bölümün bulunmamasını ve yüklemeye devam edebilmek için aktif olarak işaretlenmiş bir bölüm kaydının mevcut olmasını gerektirmektedir. Bu durumların dışında, birden fazla aktif bölümün bulunması, hiçbir bölümün aktif olarak işaretlenmemiş olması gibi herhangi bir durumla karşılaşıldığında program, BIOS Video Interrupt [10]'larını kullanarak yükleme yapmaya devam edilemeyeceğine dair hata ile ilgili bir mesajı ekrana yazdırıp, Şekil 3'te örneklendirilen kodlarla işlemciyi sonsuz döngüye sokarak sistemi kilitlemektedir. Şekil 3. Sistemi kilitlemek 3.1.3. MBR TARAFINDAN VBR'NİN YÜKLENMESİ Bölüm tablosu taranıp aktif bölümün bulunması ardından yapılması gereken iş yüklemeye devam edilcek bölümün Mantıksal 0 Sektörünün yani VBR kodunun belleğe yüklenmesi işidir. Bu işi gerçekleştirebilmek için BIOS Disk Interrupt [11]'larının 2h, 41h ve 42h numaralı fonksiyonlarından faydalanılmıştır. BIOS Disk Interrupt'ı olan Int 13h programının 41h fonksiyonu, Genişletilmiş BIOS desteğinin olup olmadığı kontrolünü yapar. Bu destek mevcudiyeti, günümüz yüksek kapasiteli disklerin sektör adreslemede kullandığı LBA alt-sistemi kullanılabilirliğini belirler. Bu durumda diskten okuma yapabilmek için, mevcut standart bölüm tablosu kayıtlarının LBA desteği sınırları dahilinde 2-TB toplam disk kapasitesi sınırlarında olan 10 disk bölümleri içinde istenilen herhangi bir sektör, 42h numaralı Int 13h fonksiyonu rahatlıkla kullanılabilir. Okuma yapılacak olan sektör VBR sektörü olacağından, bölüm kaydı içinde, bölümün başlangıç LBA adresi, okuma yapılacak sektör adresi parametresi olarak 42h fonksiyonunda sorunsuz olarak kullanılabilir. Genişletilmiş BIOS desteğinin mevcut olmadığı durumlarda ise disk üzerinden okuma yapabilecek Int 13h fonksiyonu, 2h numaralı fonksiyondur ve bu fonksiyon, disk sektörlerini adreslemek için CHS (Cylinder-Head-Sector) alt-sistemini kullanır. CHS adresleme ile teorik olarak 8-GB toplam disk kapasitesi sınırlarında olan disk bölümlerinden okuma yapılabilir olmasına karşın, CHS sistemi kısıtlamaları ve sistemler arası uyumsuzluklardan ötürü adreslenebilir toplam kapasite 8-GB'ın altındadır. Bu durumlara dikkat edilerek yapılacak olan VBR sektörünün okunması, bölüm kaydı içindeki bölümün başlangıç CHS adresinin 2h fonksiyonuna sektör adresi parametresi olarak iletilmesi ile gerçekleştirilir. Her iki durum için de tek bir sektör okuması yapılmış ve okunacak verinin bellek tampon adresi olarak 0000h:7C00h adresine kaydedilmesi sağlanmıştır. 0000h:7C00h adresinde bulunan 512-byte genişliğindeki VBR kodunun son iki byte'ında açılış imzası aranır ve bu imzanın varlığı ile bölüm üzerinde yüklü bir işletim sisteminin olup olmadığı durumu teyit edilir. İmzanın varlığı ile bölümde yüklü bir işletim sistemi olduğu garantilendikten sonra program akışı, 0000h:7C00h adresine sıçrama yapılarak VBR programına devredilmiştir. 3.1.4. MBR DURUM MESAJLARI Geliştirilmiş olan MBR programında hemen hemen her bir alt işlem için, BIOS Video Interrupt'ları kullanılarak kullanıcıya bazı bilgilendirme ve durum mesajları iletilmektedir. Bölüm tablosunun tutarsız olduğu durumda tablonun bozuk olduğuna dair bir hata durum mesajı, ön yüklemeye devam edilecek aktif bölüm bulunamadığı durumda bu duruma dair bir hata mesajı ve VBR yüklemesi de dahil olmak üzere hiçbir sorunla karşılaşılmadığı durumda kontrolün VBR programına devrediliyor olduğuna dair bir bilgi mesajı gibi mesajlar MBR program kodu içine gömülmüş olup, ilgili durumlarda mesajların başlangıç adreslerinin bir mesaj yazdırma alt fonksiyonuna parametre olarak iletilmesi ile ekrana 11 yazdırılmıştır. Şekil 4'te örnek durum mesajları ve Tablo 4'te mesaj yazdırma alt fonksiyonunun parametre yapıları incelenebilir. Şekil 4. Örnek MBR durum mesajları Tablo 4. MBR mesajlarını yazdırma alt fonksiyonu parametreleri Tip Bellek Adresi Açıklama Giriş parametresi BP + 4h Giriş parametresi BP + 5h Giriş parametresi Giriş parametresi BP + 6h BP + 8h CarriageReturn+LineFeed (CRLF) karakterlerini atlama bayrağı Mesajın gösteriminden sonra sistemi kilitleme bayrağı Mesaj segment değeri Mesaj offset değeri 3.2. VBR PROGRAMI 3.2.1. GİRİŞ VE ÖN HAZIRLIKLAR MBR ve VBR programları biribirnden bağımsız programlardır ve birbirleri arasında veri alış-verişi olmamalıdır. Bu durumdan faydalanılarak, örnek olarak MS MBR programı ile bir başka işletim sisteminin VBR programı yüklemesi ya da tersi şekilde geliştirilen MBR programı ile MS VBR programı yüklemesi yapılabilir. MBR programından bağımsız olarak geliştirilen VBR programının yapacak olduğu ilk iş, MBR programına benzer bir şekilde, işlemci kaydedicilerini istenilen değerlere yüklemek ve ardından kendisini, serbest kullanılabilir bellekte daha düşük bir adrese 12 kopyalamaktır. Böylece belleğe daha sonra yapılacak olan yüklemeler için fragmantasyon olmadan daha fazla boş bellek bulunması imkânı sağlanmıştır. Zira MBR programı tarafından tüm VBR programının yalnızca 1 sektörlük kısmı okunmuştur ve VBR programının diğer disk sektörlerinde bulunan kısmı, gene VBR programının ilk sektörlük parçası içindeki bir alt fonksiyon tarafından diskten okunup belleğe yüklenecektir. Bir bölümün NTFS dosya sistemi ile formatlanması ile bölümün VBR sektörü içine, VBR programıyla birlikte BIOS Parameter Block (BPB)[7] adı verilen ve bölümün ve dosya sisteminin spesifikasyonlarını içeren bir veri bloğu yazılır. Bu blok içinde VBR açısından önemli olan iki adet veriden birincisi bölümün kaçıncı fiziksel sektörden başladığı (HiddenSectors), ikincisi ise VBR programının tamamının kaç sektör yer kapladığı (ReservedSectors) verileridir. VBR içinde, MBR programından bağımsız olması sebebiyle bir disk okuma alt fonksiyonu yeniden implemente edilmiştir. Bahsedildiği üzere VBR programının gerçekleştirmesi gereken bir diğer görev, bu alt fonksiyonu kullanarak kendisine ait tüm programın eksik kısımlarını belleğe yüklemektir. Bu işlemi gerçekleştirebilmek için BPB içindeki HiddenSectors ve ReservedSectors verilerinden faydalanır. Okuma yapılacak sektör, HiddenSectors+1 numaralı fiziksel sektörüdür ve okuma yapılacak sektör sayısı ReservedSectors-1 adettir. Çünkü HiddenSectors verisi, MBR içinden bakıldığında bölümün başlangıç sektörünü belirtmektedir ve 1 adet sektör MBR tarafından zaten okunmuştur. İmplemente edilen disk okuma fonksiyonunun parametre ve kullanılan yerel değişken yapıları Tablo 5'te gösterilmiştir. Tablo 5. Disk sektörleri okuma alt fonksiyon parametreleri Tip Bellek Adresi Açıklama Giriş parametresi Giriş parametresi Giriş parametresi Giriş parametresi Giriş parametresi Çıkış parametresi Çıkış parametresi BP + 4h BP + 6h BP + 8h BP + Ah BP + Ch BP + 10h BP + 11h Okuma yapılacak disk numarası Okunacak sektör sayısı Hedef bellek offset değeri Hedef bellek segment değeri Okuma yapılacak başlangıç LBA numarası Fonksiyon geri dönüş değeri - Durum kodu Fonksiyon geri dönüş değeri - Durum bayrağı 13 Tablo 5'in devamı Yerel değişken Yerel değişken Yerel değişken Yerel değişken Yerel değişken Yerel değişken Yerel değişken Yerel değişken Yerel değişken Yerel değişken Yerel değişken Yerel değişken BP - 2h BP - 3h BP - 4h BP - 5h BP - 6h BP - 8h BP - Ah BP - Ch BP - Eh BP - 10h BP - 11h BP - 12h Geçici durum kodu Okuma deneme sayısı Disk alt sistemi reset deneme sayısı Disk parametreleri alma deneme sayısı CHS - Toplam silindir sayısı CHS - Her silindirdeki Head sayısı (HPC) CHS - Her izdeki sektör sayısı (SPT) SPT * HPC CHS okuma yapılacak silindir CHS okuma yapılacak head CHS okuma yapılacak sektör CHS operandlarının hesaplanmışlık bayrağı 3.2.2. VBR TARAFINDAN BİR AÇILIŞ MENÜSÜ YÜKLENMESİ Tüm VBR programı tamamen belleğe yüklendikten sonra gerçekleştirilen bir sonraki iş ekrana bir Boot Menu (Açılış Menüsü) yazdırmaktır. Açılış menüsü içindeki text veriler direkt olarak VBR programı içine yerleştirilmiştir ve her bir veri sırasıyla adreslenip okunarak direkt olarak BIOS Video Memory (BIOS Vidyo Bellek) 'e yazdırılmıştır. Ekranda karmaşık bir görüntünün oluşmaması için vidyo belleğe direkt yazma erişimi yapan ve parametre olarak ekrana yazdırılacak metni, yazılmak istenilen ekran satır ve sütun numaralarını ve yazdırılacak karakterlerin özniteliklerini parametre olarak alabilecek bir alt fonksiyon geliştirilmiştir. Ekranı temizlemek, Cursor görünürlüğünü değiştirmek gibi işlemler için BIOS Video Interrupt'larından da faydalanılarak, açılış menüsünde bulunacak işletim sistemleri seçenekleri text verileri de dâhil olmak üzere tüm açılış menüsü text verileri bu alt fonksiyon tarafından vidyo belleğe yazdırılmaktadır. Bu alt fonksiyonun parametre ve kullanılan yerel değişken yapıları Tablo 6'da, hem emülatör ortamında hem de üretim ortamında ekranda görüntülenen açılış menüsü örneği de Şekil 5'te ve Şekil 6'da gösterilmiştir. 14 Tablo 6. Vidyo belleğe yazma alt fonksiyon parametreleri Tip Bellek Adresi Açıklama Giriş parametresi Giriş parametresi Giriş parametresi Giriş parametresi Giriş parametresi BP + 4h BP + 5h BP + 6h BP + 8h BP + Ah Giriş parametresi Yerel değişken Yerel değişken Yerel değişken Yerel değişken BP + Ch BP - 4h BP - 5h BP - 6h BP - 7h Mod bayrakları Öznitelikler Erişim satır ve sütun değeri Veri uzunluğu Veri bellek offset değeri / Karakter ASCII değeri Veri bellek segment değeri Kaynak tipi bayrağı Öznitelikler yazılacak / yazılmayacak bayrağı Karakter / Text yazılacak bayrağı Gerçekte yazılan veri uzunluğu Şekil 5. Ekranda görüntülenen açılış menüsü - emülatör ortamı 15 Şekil 6. Ekranda görüntülenen açılış menüsü - VMWare ortamı 3.2.3. MENÜ KULLANICI ETKİLEŞİMİ - İŞLETİM SİSTEMİ SEÇİLİMİ Uygulama yazılımlarında interaktiflik yani kullanıcı etkileşimi önemli konulardan biridir. Bir program, kullanıcı tarafından yönlendirilme gereği duyabilir. VBR programı da yüklemeye devam edilecek işletim sisteminin seçilimi konusunda kullanıcı etkileşimi gerektirmektedir. Bu sebepten ötürü BIOS Keyboard Interrupt [12]'larından faydalanılarak kullanıcının, seçimi yönlendirmesini ve seçimi onaylamasını sağlayan bir alt fonksiyon geliştirilmiştir. Geliştirilen alt fonksiyon, klavye tamponunu sürekli olarak kontrol ederek basılan bir tuş olup olmadığını kontrol eder. Bir tuşa basıldığı durumu yakalandığında, Klavye Tuş Tarama Kodları 'nı kullanarak basılan bu tuşun Aşağı ya da Yukarı Yön Tuşları ya da Enter Tuşu olup olmadığı kontrolü yapılır. Basılan tuşun aşağı veya yukarı yön tuşları olması durumunda, yukarı ya da aşağı olması durumuna göre seçili işletim sistemi indeksi 16 yeniden hesaplanır ve ekrandaki yeni indekse sahip işletim sistemi ismine, vidyo belleğe yazma erişimi sağlayan alt fonksiyon aracılığıyla, arkaplan aydınlatma efekti uygulanır. Böylece kullanıcı yapmış olduğu seçimi görsel olarak da izleyebilmektedir. Şekil 7'de bu durum örneklendirilmiştir. Şekil 7. Açılış menüsü içinde gezinti Basılan tuşun Enter tuşu olması durumunda seçili işletim sistemi indeksi onaylanır ve yüklemeye devam edecek olan bir başka alt fonksiyon çağrımı yapılır. Bu yeni alt fonksiyonun görevi kullanıcının yapmış olduğu seçime dayalı olarak ilgili disk sektöründen açılışa devam edecek olan program kodunu belleğe yüklemek ve genel icraya o programdan devam edilmesini sağlamaktır. 17 3.2.4. SEÇİLİ İŞLETİM SİSTEMİNİN YÜKLENMESİNE DEVAM EDİLMESİ Kullanıcı yüklemeye devam etmek istediği işletim sistemi seçimini yaptıktan sonra VBR programı, programın içine gömülü veri yapısı içinden, seçili indeks verisi aracılığıyla hedef işletim sisteminin VBR programının bulunduğu disk sektör numarası verisini okur. Buradaki sektör numarasının LBA_0 sektörünü gösterdiği durum, seçilen işletim sisteminin, bu projede bahsi geçen geliştirme sürecindeki işletim sistemi olduğu durum olarak kabul edilmiştir ve yükleme adımları bu işletim sistemi üzerine devam edecektir. Şu anki mevcut durumda bu işletim sistemi için tasarlanmış-geliştirilmiş mevcut bir çekirdek bulunmadığından yükleme işlemine devam edilememekte ve şu anki konumdan itibaren, bazı sistem tablolarının oluşturulması ve Protected Mode'a geçilmesi gibi tamamlanması gereken işlerin bir listesi ekrana yazdırılarak kullanıcıya belirtilmektedir. İlgili durum Şekil 8'de gösterilmiştir. Şekil 8. VBR programının görevini tamamlaması 18 Gömülü veri içinden okunan sektör numarasının LBA_0 sektörünü göstermediği durum, kullanıcının, disk üzerinde bulunan başka bir işletim sistemini seçtiği anlamını taşır. Dolayısıyla aktif VBR programı, hedeflenen sektördeki hedef VBR programını 0000h:7C00h adresine yükleyerek kontrolü bu programa devreder. PC'nin açılış işlemlerine devam etmesinden artık yüklemesi yapılmış bu VBR programı sorumludur. İlgili durum Şekil 9'da gösterilmiştir. Şekil 9. Kontrolün hedef diğer işletim sistemi VBR programına devredilmesi 4. İRDELEME VE SONUÇLAR Proje geliştirme süresince yaşanılan en büyük problem MBR ve VBR sektörlerinin 512byte ile sınırlı kalmak zorunda olmaları problemidir. Her iki program için de 512-byte içine sığdırılması gereken en önemli bloğun disk okuma işlemlerini gerçekleştirecek alt fonksiyonlar olduğu görülmüştür. Bunun yanında temel kullanıcı bilgilendirme mesajlarının da bu sektörler içine yerleştirilmesi gerekliliği, efektif alan kullanımı ve kod optimizasyonu konularını ön plana çıkartmıştır. Ek olarak proje genelinde karşılaşılan diğer sınırlamalar ve sağlanması gereken tüm gereksinimler üzerinde yapılan çalışmalar, Assembly programlama dilinin efektif kullanımı konusunda çok önemli katkılar sağlamıştır. Geliştirme ortamı olarak kullanılan MS Windows işletim sisteminin bölüm dosya sistemini yönetmesi konusunda BPB yapısının ve buna ek olarak bölüm tablosu değerlerinin sıkça referanslandığı ve bu verilerin sürekli olarak kullanıldığı gözlemlenmiştir. Bu veri bloklarına tutarsız veriler yerleştirilmesi sonucunda dosya sistemi üzerinde hatalı işlemlerin yapıldığı ve ilgili disk bölümüne olan erişimlerin tamamen yitirildiği durumu, gözlemlenen bir başka durumdur. Özellikle hem bölüm tablosu hem de NTFS BPB içindeki bölümün başlangıç sektörü ve toplam sektör sayısı verilerinin değiştirilmesi dosya sistemi ve bölümün tamamen yitirilmesine sebep olmuştur. Ön yükleme programının kodlanması sürecinde segmentli ve indeksli adreslemelerde segment prefixlerinin kullanımının ihmal edilmemesi gerektiği gözlemlenmiştir. Alt fonksiyonlarda, fonksiyona stack üzerinden iletilen parametreler ve gene stack alanı üzerinde tahsisi yapılan yerel değişkenlere SS prefixi ile erişilmesi gerektiği görülmüştür. Aksi durumda bazı sistemlerde BP ile indekslenen parametre ve yerel değişkenlerin aslında CS:BP ile indekslendiği, bazı sistemlerde ise DS:BP ile indekslendiği durumu ile karşılaşılmıştır. Halbuki doğru verilerin bulunduğu konum SS:BP konumudur. Stack alanının, Real Mode altına 2-byte alignment ile işlev görmesi, stack işlemlerinde dikkat edilmesi gereken bir başka konudur. MBR sektörünün ve ilk VBR sektörünün 512-byte genişliğinde olması konusu, bu sektörlerdeki program verilerinin 512-byte'tan az olduğu durumda padding yapılması gerekliliğini ortaya çıkartmıştır. Ayrıca her iki sektör için de, son 2-byte'lık verinin 20 BootSigniture olmaması durumunda ön yükleme işlemi devam edememekte olduğu ve BootSigniture verisinin tam yerinde ve tam formatında olması gerektiği gözlemlenmiştir. Intel işlemcilerin Little Endian [14,15] çalışmasından dolayı [2,3,14] ön yükleme programı içinde kullanılan BootSigniture ve yerel sabitler gibi verilerin, endianness konusuna dikkat edilerek uygun formatta oluşturulması gerekliliği ortaya çıkmıştır. Endianness konusuna dikkat edilmediği durumlarda yapılan hesaplamaların yanlış sonuçlar ürettiği görülmüştür. Hem MBR hem de VBR içindeki mesajların ekrana yazdırılması noktasında, yazdırılacak metnin nerede sonlanacağının belirlenmesi ihtiyacı üzerine kullanılan text verilerin Null-terminated String [16] olarak tanımlanmaları gereksinimi oluşmuştur. Sonuç itibariyle, PC'nin açılış sürecini BIOS'tan devralabilen, interaktif olarak kullanıcıya açılışa devam edilecek işletim sistemini seçme imkanı tanıyabilen ve kontrolü seçili işletim sisteminin yükleyicisine devredebilen bir ön yükleyici programı geliştirmek amacına sorunsuz bir şekilde ulaşılmıştır. 5. GELECEKTE YAPILMASI PLANLANAN ÇALIŞMALAR Geliştirilen ön yükleme programının mevcut eksikliği, 3.2.4 başlığı altında da bahsi geçtiği üzere geliştirme süreci içindeki işletim sistemi çekirdeğinin mevcut olmayışından kaynaklanan çekirdek yüklemesi adımının gerçekleştirilememesidir. Bu eksikliği ortadan kaldırmak ve işletim sisteminin geliştirilmesine devam etmek konuları hususunda yapılması planlanan çalışmalar maddeler halinde aşağıda sıralanmıştır: FASM, MASM gibi mevcut assembler yazılımlarının bazı varsayılan sınırlandırmaları ve gelişmiş debugging özelliklerine sahip emülatörlerin bulunamıyor olmasından ötürü tüm bu eksiklikleri gidermek adına 2 farklı proje geliştirilecektir. Bunlardan biri mevcut assemblerların kısıtlamalarını aşmak ve daha esnek bir geliştirme ortamı sunabilmek adına bir yeni bir x86 assembler yazılımı, bir diğeri de StackTrace, TraceInto, StepOver ve alışkın olunulan günümüz debuggerları tarafından sağlanan diğer özelliklerin mümkün olduğunca desteklenileceği bir x86 emülatörü ortamıdır. Öncelikli olarak assembler problemi çözüme ulaştıktan sonra 3.2.4 başlığı altında bahsedilen Yapılacaklar Listesi konularına yönelinecek ve o işlemler tamamlanacaktır. O noktada işlemci Protected Mode altında çalışıyor olacağından, Protected Mod ortamına uygun, kontrolün devredileceği bir işletim sistemi çekirdeği geliştirilmesi konusuna giriş yapılacaktır. Bu projenin VBR konu başlığı altında mevcut dosya sistemi desteğinin NTFS olduğundan bahsedilmişti. VBR programı içerisinde başka dosya sistemleri spesifikasyonlarının da desteği sağlanmalıdır. Dolayısıyla VBR programı ve dosya sistemlerinin BPB perspektifleri gelecekte tekrar ele alınması gereken konulardır. Protected Mode altında BIOS interruptları kullanılamayacak olduğundan temel Giriş/Çıkış işlemlerinin gerçekleştirilebileceği servis programlarının yeniden geliştirilmesi gerekmektedir. Tüm bu temel konular tamamlandıktan sonra standart C kütüphanesi fonksiyonları assembly dili ile tekrar kodlanacak ve geliştirme sürecindeki hedef işletim sistemine port edilecektir. Porting işlemi tamamlandıktan sonra geliştirme programlama dili olarak bir sonraki seviyeye yani assembly ortamından C ortamına geçiş yapılabilir. 22 C ortamına geçiş tamamlandıktan sonra artık tam anlamıyla işletim sistemi geliştirme çalışmalarına başlanılabilir. Öncelikli olarak tamamlanması planlanan konular çekirdek mimarisi kararı ve ardından Memory Manager'ın geliştirilmesidir. Object Manager ve Scheduler konuları da süreç içerisinde el atılacak diğer iki konudur. Bu noktadan itibaren akla gelebilecek diğer tüm konular, fazlasıyla uygulama spesifik olacağından burada bahisleri geçmeyecektir. 6. KAYNAKLAR [1] PARDUS İşletim Sistemi - Wikipedia, http://tr.wikipedia.org/wiki/Pardus_%28i%C5%9Fletim_sistemi%29 (Son erişim: 16.05.2013) [2] Intel x86, Wikipedia, http://en.wikipedia.org/wiki/X86 (Son erişim: 16.05.2013). [3] 80386 Programmer's Reference Manual, http://pdos.csail.mit.edu/6.828/2010/readings/i386/toc.htm (Son erişim: 16.05.2013). [4] Real Mode, Wikipedia, http://en.wikipedia.org/wiki/Real_mode (Son erişim: 16.05.2013). [5] Master Boot Record, Wikipedia, http://en.wikipedia.org/wiki/Master_boot_record (Son erişim: 16.05.2013). [6] New Technology File System, http://ntfs.com , (Son erişim: 16.05.2013). [7] Boot Records Revealed!, http://thestarman.pcministry.com/asm/mbr/index.html (Son erişim: 16.05.2013). [8] Memory Map (x86), http://wiki.osdev.org/Memory_Map_%28x86%29 (Son erişim: 16.05.2013). [9] Partition Table Entries, Wikipedia, http://en.wikipedia.org/wiki/Master_boot_record#Partition_table_entries (Son erişim: 16.05.2013). [10] INT 10H, Wikipedia, http://en.wikipedia.org/wiki/INT_10H (Son erişim: 16.05.2013). [11] INT 13H, Wikipedia, http://en.wikipedia.org/wiki/INT_13H (Son erişim: 16.05.2013). [12] BIOS Interrupt Call, Wikipedia, http://en.wikipedia.org/wiki/BIOS_interrupt_call (Son erişim: 16.05.2013). 24 [13] Protected Mode, Wikipedia, http://en.wikipedia.org/wiki/Protected_mode (Son erişim: 16.05.2013). [14] Endianness, Wikipedia, http://en.wikipedia.org/wiki/Endianness (Son erişim: 17.05.2013). [15] Big and Little Endian, http://www.cs.umd.edu/class/sum2003/cmsc311/Notes/Data/endian.html (Son erişim: 17.05.2013). [16] Null-terminated String, http://programmedlessons.org/AssemblyTutorial/Chapter20/ass20_2.html (Son erişim: 17.05.2013).