Basit Bootstrap Uygulaması

Benzer belgeler
INTEGER OVERFLOW ***************************************************************/

Sistem Programlama. Kesmeler(Interrupts): Kesme mikro işlemcinin üzerinde çalıştığı koda ara vererek başka bir kodu çalıştırması işlemidir.

Adresleme Modları. Mikroişlemciler ve Mikrobilgisayarlar

MTM 305 MİKROİŞLEMCİLER

MTM 305 MĠKROĠġLEMCĠLER

Bölüm 3: Adresleme Modları. Chapter 3: Addressing Modes

Debug Komutları C:\>DEBUG - Çizgi işareti artık debug programının komut kabul etmeye hazır olduğunu belirtmektedir.

MSN PROTOKOLÜNÜ ANALİZ ETMEK

MTM 305 MİKROİŞLEMCİLER

Pascalda oluşturulacak dosyalar değişkenler gibi programın başında tanımlanır.

Linux Assembly Programlamaya Giriş

MICROPROCESSORS ESA 86/88-3 KULLANIM KLAVUZU

İSTANBUL TİCARET ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ MİKROİŞLEMCİLİ SİSTEM LABORATUARI MİKROİŞLEMCİLİ A/D DÖNÜŞTÜRÜCÜ

Ecat 8. Hakbim Bilgi İşlem A.Ş. Versiyon

Ders 3 ADRESLEME MODLARI ve TEMEL KOMUTLAR

8086 Mikroişlemcisi Komut Seti

MTM 305 MİKROİŞLEMCİLER

Bahar Dönemi. Öğr.Gör. Vedat MARTTİN

Temel Bilgisayar Programlama

ALGORİTMA VE PROGRAMLAMA II

Yazılım Kurulumu ve Yönetimi -2010

Yazılım Mühendisliğine Giriş 2018 GÜZ

Master boot record (MBR)

Assembly Dili Nedir? Assembly dili biliyorum derken hangi işlemci ve hangi işletim sistemi için olduğunu da ifade etmek gerekir.

İSTANBUL TİCARET ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ MİKROİŞLEMCİLİ SİSTEM LABORATUVARI KESMELİ GİRİŞ/ÇIKIŞ

İŞLEMCİ DURUM KAYDEDİCİSİ (PROCESSOR STATUS REGISTER)

FreeBSD Üzerinde VLAN Kullanımı

Çoktan Seçmeli Değerlendirme Soruları Akış Şemaları İle Algoritma Geliştirme Örnekleri Giriş 39 1.Gündelik Hayattan Algoritma Örnekleri 39 2.Say

MTM 305 MĠKROĠġLEMCĠLER

MTM 305 MĠKROĠġLEMCĠLER

İSTANBUL TİCARET ÜNİVERSİTESİ BİLGİSAYAR MÜHENDİSLİĞİ BÖLÜMÜ MİKROİŞLEMCİLİ SİSTEM LABORATUARI İKİLİ TABANDA ÇOK BAYTLI ÇARPMA

DENEY II RAPORU MİKROİŞLEMCİ UYGULAMALARI LABORATUVARI

Dizi elemanları yukarıdaki gibi tek tek tanımlanabileceği gibi matematiksel ifadelerdeki diziler gibi de tanımlanabilir.

Program Kontrol Komutları. Mikroişlemciler ve Mikrobilgisayarlar 1

Table of Contents

LİNUX İŞLETİM SİSTEMİNİN KÖPRÜ MODUNDA ÇALIŞTIRILMASI VE GÜVENLİK DUVARI İŞLEMLERİ

İşletim Sistemlerine Giriş

Bildiğiniz gibi programları oluşturan kodlar ve veriler hafızaya yüklendikten sonra işlemci tarafından satırsatır icra edilirler.

INTEL İŞLEMCİLERİNDE CSD İŞLETİM SİSTEMİNİN BAŞLATILMASI. Selim Nasır

FreeBSD Üzerinde VLAN Kullanımı

Endüstri Mühendisliği Bölümü Bilgisayar Programlama Ders Notları

Kütük Yönetimi. Kütük Yönetim Sisteminin İşlevleri. Hacettepe Üniversitesi Kavramsal Kütük Modeli.

Ders Özeti. Ders 2. PC nin İç Organizasyonu. Mikroişlemcinin Organizasyonu. Basitçe İşlemciyi Oluşturan Parçalar. Mikroişlemciler

BMT 101 Algoritma ve Programlama I Güz Dönemi. Yük. Müh. Köksal Gündoğdu 1

ALGORİTMA VE PROGRAMLAMA II

Mikrobilgisayar Donanımı

C Programlama Dilininin Basit Yapıları

DIGIAC 2000 Deney Seti PAT İŞLEMCİ KARTI :

MİKROBİLGİSAYAR SİSTEMLERİ. Teknik Bilimler Meslek Yüksekokulu


Genel Programlama II

NB Ekran Seri Port Üzerinden Veri Okuma/Yazma. Genel Bilgi Protokol Oluşturma Veri Okuma Veri Yazma

BIL 362 Mikroilemciler Dersi Final Sınavı Cevapları

ENDA MODBUS PROTOKOLÜ

Dr. Fatih AY Tel: fatihay@fatihay.net

PROGRAMLAMAYA GİRİŞ DERS 2

Assembly Language Programming

PIC ASSEMBLY VE MAKROLAR

SM 100 Terazi Ayarları. Digi SM 100. SM 100 Terazi Ayarları

Nesne Tabanlı Programlama Dersi Edirne Kız Teknik ve Meslek Lisesi

3/7/2011. ENF-102 Jeoloji 1. Tekrar -- Değişken Tanımlamaları (Definition) ve Veri Türleri (Data Type) Veri Tanımları ve Mantıksal Đşlemler

Windows 2000 veya XP kurarken dosya sistemini seçmeniz gerekir. Ya FAT32 dosya sistemini kullanırsınız ya da NTFS.

8086 Mikroişlemcisi Komut Seti

Burada a değişkeninin türü integer olarak verildi. Peki biz bu ifadeyi tırnak içerisinde yazarsak ne olur?

BIL 362 Mikroilemciler Dersi Arasınav Cevapları 3 Temmuz 2007

İŞLETİM SİSTEMİ İşletim sistemi kullanıcıyla bilgisayar donanımı arasında iletişim sağlayan programdır.

NESNEYE YÖNELİK PROGRAMLAMA

Assembly Programlama

Mifare Kart Yazıcı/Okuyucu Modül (MFM-200)

Merkezi İşlem. Birimi

ELN1001 BİLGİSAYAR PROGRAMLAMA I

6. Mikroişlemcili Geliştirme Sistemleri

C Dersi Bölüm 1. Bilgisayar Donanımı

/ C Bilgisayar Programlama Yıliçi Sınavı Test Soruları. Adı soyadı :... Öğrenci no :... İmza :... Tarih, Süre : , 60 dak.

Mikrobilgisayar Mimarisi ve Programlama

JZ TEST3 (7/3) 1 makine çevrimi süresi

Metin Dosyaları. Metin Dosyaları Dosya Açma ve Kapama Dosya Okuma ve Yazma Rastgele Erişim Standart Girdi/Çıktı Hata Kontrolü

Yazılım Güncelleştirmeleri Kullanıcı Kılavuzu

Quiz:8086 Mikroişlemcisi Mimarisi ve Emirleri

Temel Dosya İşlemleri. Kütük Organizasyonu 1

Atatürk Üniversitesi Mühendislik Fakültesi Bilgisayar Mühendisliği Bölümü BM Web Programlama ÖDEV 1

GENEL GĐRĐŞ-ÇIKIŞ FONKSĐYONLARI. ENF102 Jeoloji 1. #include <stdio.h> printf Fonksiyonu ÖRNEK. printf

Laboratuvar Çalışması Veri Depolama Kapasitesini Belirleme

Bir dizinin boyutları sabittir ve kullanılmadan önce belirlenmelidir. Dizi boyutunu belirlemek için başka bir değişkende kullanabilirsiniz.

MIKRODENETLEYICILER. Ege Üniversitesi Ege MYO Mekatronik Programı

Özyineleme (Recursion)

LCD (Liquid Crystal Display)

Genel Programlama I

3.2 PIC16F84 Yazılımı PIC Assembly Assembler Nedir?

Mikrobilgisayar Mimarisi ve Programlama

Javascript. 1) Notepad++ aşağıdaki kodları yazıp deneme.html olarak kaydedelim. 2) Biraz önceki sayfa sadece html kodların içeriyordu.

BAĞIMSIZ DEĞERLENDİRİCİ KAYIT İŞLEMLERİ

MTM 305 MĠKROĠġLEMCĠLER

Android Ders Notları

Sınav tarihi : Süre : 60 dak. a) strstr b) strchr c) strcat d) strcpy e) strlen. a) b) d) e) 0

BAŞVURU SAHİBİ KAYIT İŞLEMLERİ

16 bitlik işlemciler basit olarak 8 bitlik işlemciler gibi Kaydedici ALU Zamanlama/kontrol

CSD İŞLETİM SİSTEMİNDE SİSTEM FONKSİYONLARININ ÇAĞIRILMASI

Bölüm 4 Veri Aktarma Komutları

Transkript:

Basit Bootstrap Uygulaması

BELGE HAKKINDA Bu belge "GNU Free Documentation Licence" ile kaynak gösterilmek ve önceden yazarından izin alınmak kaydıyla yeniden yayınlanabilir Bu belgedeki eksik, yanliş ya da geliştirilmesi gerektiğini düşündüğünüz yerleri e-posta yoluyla bildirebilirsiniz Belgenin ilk oluşturulma tarihi: 13 Nisan 2007

/****************************************************************************************** * Cihan KÖMEÇOĞLU * * cihan [at] akademienderunixorg * * EnderUNIX Yazılım Geliştirme Takımı * * http://wwwenderunixorg * * Sürüm : 10 * * Tarih : 15042007 * * Etiketler : işletim sistemi,boot,çekirdek programlama,assembly * * Seviye : Başlangıç - Orta Seviye * * Makalenin en yeni versiyonu : http://wwwenderunixorg/docs/hellobootpdf adresinden elde edilebilir * **********************************************************************/ Basit bir boot işleminin olması için temel olarak bir kaç şey gereklidir Bunlar ise: - BIOS sizin boot kodunuzu 07C00h adresine yerleştirecektir ve işlemler bu adresi dikkate alınarak yapılır - Derlediğiniz boot kodu düz ikili dosya(plain binary file) formatında olmak zorundadır Bu formatta nasıl derleneceğini ilerleyen kısımlarda göstereceğim - Boot kodunuz 512 byte olması zorunludur - Boot kodunun son iki byte'ı AA55h olmak zorundadır Bu son iki byte EOF gibidir Yani boot kodunun sonuna geldiği buradan anlaşılmaktadır Bu byte'a "Boot record Signature" (boot kayıt imzası) denilmektedir Eğer kodunuza bu son iki byte'ı eklemezseniz boot sırasında "Boot Record Signature AA55 not found" hatası alırsınız - Boot kodumuzu derledikten sonra diskin 0 sektörüne yazılmak zorundadır Çünkü bilgisayar açılmaya başladıktan sonra bios'ta belirtilen sırada disklerin 0sektöründe boot kodu arayacaktır Not: Boot kodlarımızı disket ile test edersek daha iyi olur Yoksa sisteminizi kurtarabilmek için tekrar işletim sisteminin bootstrap'ını yüklemek zorunda kalırsınız Bu da zahmetli iş Bu kısa bilgiden sonra sadece temel bootstrap işlemlerini kapsayan ufak bir boot kodu yazabiliriz ;Mini bootstrap ;miniasm dongu: jmp dongu times 510-($-$$) db 0 dw 0AA55h Bu assembler kodunu derleyebilmek için nasm derleyicisini kullanacağız Nasm ile derleyebilmek için: $ nasm -f bin miniasm -o miniboot

Diskete yazmak için: $ dd if=miniboot of=/dev/fd0 Yukarıdaki boot kodumuz bios tarafından belleğin 07C00h adresine yüklenecektir Boot sırasında ekrana bir çıktı almayacaksınız Sadece "jmp dongu" satırı ile sonsuz bir döngü içine gireceksiniz Dökümanın ilerki kısımlarında "hello world " programının nasıl boot edileceğini anlatacağım times 510-($-$$) db 0 dw 0AA55h Bu satır ile boot programımızı 512 byte'a tamamlıyoruz Daha önceden de belirtiğim gibi boot programımız 512 byte olmak zorundadır times sadece nasm da tanımlı bir koddur ilk satırda 510 byte'a kadar "0" ile doldurulmaktadırbunu sağlayan "times" komutudur AA55h değeri iki byte olduğu için toplam 512 byte olmaktadır Yukarıdaki bootstrap kodumuz değişken kullandığımızda sorun çıkacaktırçünkü yukarıdaki kod ile segmentlerin değerlerini bilemeyiz Bunu yapmazsak değişkenlerimize erişemeyiz Bu sorunu halletmek için yukarıdaki kodumuza aşağıdaki satırları eklemek yeterli olacaktır mov ax, cs mov ds, ax Burada data segment ve extra data segment değerlerini code segment in değeri olarak ayarlıyoruz Yani kodlarımız aynı zamanda birer değişken gibi olacaktır Bu kodu derleyip test ettiğinizde bir öncekinden farklı bir şey görmeyeceksiniz Ama değişkenlere erişmek istediğimizde yapılması gereken bir işlemdir Şimdi Hello World programını nasıl boot edebileceğimizi görelim - Hello World'ü boot etmek? Kodları açıklamadan önce işlemlerin nasıl olduğu konusunda kısa bir bilgi vereceğim Önceden sadece bios 07C00h bellek bölgesine boostrapımızı kopyaladı ve kodumuz orada sonsuz bir döngü içine girmiştiburada yapacağımız ilk olarak disketin 0 sektörüne boot kodumuzu, 1 sektörüne de hello world programını yüklemektirbunları yaptıktan sonra disketin 1 sektöründe bulunan hello world programını belleğin belli bir bölgesine bios interruptlarını kullanarak yerleştirmek Daha önceden de bahsettiğim gibi 0sektör sadece bootstrapımız diğer sektörde herhangi bir program olabilir Diğer programlar illa 1sektörden başlamak zorunda da değildir Herhangi bir sektörde olsa da olur Önemli olan programın hangi sektörde ve kaç sektör okumamız gerektiğini bilmemiz önemlidir Bu arada bios interruptları aygıtlara erişmemizi ve onları kullanmamızı sağlar gğin hello world programında ekrana çıktı vermek için int 10h interruptını kullandık Bir interruptı kullanabilmek için belli registerlara belli değerler atamamız gerekmektetir Sonra interruptı çağırarak işlemi yaptırabiliriz Aşağıdaki adresten Interruptların listesini ve nasıl kullanılacağını görebilirsiniz http://enwikipediaorg/wiki/bios_call

Şimdi kodumuza geçebiliriz ;*****************bootasm *************** [ORG 0] jmp reset reset: mov ax, 0 mov dl, 0 int 13h jc reset ;ax ve floppy sürücüsü resetlenir floppy: mov ax, 1000h mov bx, 0 ;hellow world programının yükleneceği bellek bölgesi mov ah, 2 ;belirtilen bellek bölgesine programı yükle mov al, 1 ;disketten 1 sektör oku mov ch, 0 ;silindir = 0 mov cl, 2 ;sektör = 2 mov dh, 0 ;head = 0 mov dl, 0 ; disket sürücüsü olduğunu belirtir int 13h jc floppy ;hata varsa tekrar okumayı dene jmp 1000h:0000 ;hello world'un yüklü olduğu bellek bölgesine zıpla times 510-($-$$) db 0 dw 0AA55h ;********************************************* Derlemek için: $ nasm -f bin bootasm -o progboot Diskete yazmak için: # dd if=progboot of=/dev/fd0 mov ax, 1000h mov bx, 0 Yukarıdaki kod ile es registerına "hello world" programının yükleneceği bellek bölgesi belirtilir Bu bellek bölgesi bios'un yüklü olduğu A000:000 - FFFF:000F adresler haricindeki herhangi bir bellek bölgesine kopyalayabiliriz bx registerına da bu adresin offseti belirtilir Yani programımız 1000:0000 adresinde bulunacaktır mov ah, 2 mov al, 1 mov ch, 0 mov cl, 2 mov dh, 0 mov dl, 0

int 13h Burada ise ah registerına 2 değeri atanarak verilerin daha önceden belirtilen bellek bölgesine yükleneceği belirtilmektedir al registerına da kaç sektör okunuluacağı belirtilmektedir Hello world programı 512 byte'dan küçük bir program olduğu için 1 sektör okumak yeterlidir Burada dikkat edilecek bir nokta ise cl registerına 2 değeri atanmıştır Bu sektör numarasını belirtmektedir Fakat biz " Hello world" programını disketin 1 sektörüne yazacağız Diskette ilk sektör numarası 0'dır Ama bios rutinlerinde ilk sektör 0'dan değil 1'den başlamaktadır bu yüzden biz 2 değerini atadıkyani cl registerına 2 değerini atayarak disketin 1 sektörünü belirtmiş olduk ve en sonunda bios interruptını (int 13h ) çağırarak işlemi gerçekleştirmiş oluyoruz jmp 1000h:0000 Bu jump işlemi ile de helloasm nin yüklendiği bellek bölgesine zıplıyoruz Bootasm nin floppy tagında es ve bx registerlarına helloasm nin yükleneceği bellek bölgesini belirtmiştik Bu işlem ile de bu registerlara belirtiğimiz bellek bölgesine zıplıyoruz jmp 1000h:0000 komutu helloasm deki jmp main satırının bulunduğu kısma zıplatır ;******************* helloasm ********* [ORG 0] jmp main msg db 'Hello World' main: mov si, msg ;mesajı yazdırmak için mov ax, cs mov ds, ax write: lodsb ;stringi AL registerına kopyala cmp al,0 ;mesajın sonuna gelip gelinmediği kontrol edilir je loops mov ah, 0Eh ;karakteri ekrana yazdırır mov bx, 7 int 10h jmp write loops: jmp loops ;**************************************** Derlemek için: $ nasm f bin helloasm o hello Diskete kopyalamak için: # dd seek=1 conv=sync if=hello of=/dev/fd0 mov si, msg Si registerı data segmentde bulunan verilerin içeriğini göstermek için kullanılan bir index registerıdır Böylelikle msg değişkeninin içeriği gösterilebilmektedir

mov ax, cs mov ds, ax Burada yapılan işlemse daha önceden bahsettiğimiz gibi tanımladığımız değişkenlere erişebilmek için registerları güncelliyoruz Dikkat ederseniz bootasm de bunu yapmaya gerek yoktu çünkü herhangi bir değişken tanımlamamıştık Fakat helloasm de msg değişkeni tanımladığımız için registerları güncellememiz gerekmektedir Write: mov ah, 0Eh mov bx, 7 int 10h jmp write Yukarıdaki kodda ise bios interruptını kullanarak stringimizi karakter karakter yazdırıyoruzstringin sonuna gelip gelmediğimizi ise al registerına bakarak karar veriyoruzah registerına 0Eh değeri atanarak ekrana çıktı verileceği belirtilmektedir