Küyük bir isletim sistemi YAZMAK!
Hangi Dil?
—————————————————————————-
Isletim sistemini aslinda C/C++ da yapmak isterim, ama mesela ekrana
girdi vermek istedigimde bunun icin gerekli olan “printf” komutunu
cagirmam gerektigini varsayalim. O zaman adindaki baslik dosyasini
kullanmam gerekmekte.Ama sorun her basligin C/C++ derliyicileri
tarafindan belli isletim sistemler(yada belli sistemler) icin
tasarlandigi icin ne yazikki C/C++ dillerini cekirdegi yazarken
kullanmayacagim fakat sonradan isletim sisteminin devamini C/C++ ile
yazabilirsiniz.
Söyle düsük seviyede Assembler bilginiz olmasi sizin cekirdegi daha iyi anlamanizi saglayacaktir…
Gerekenler
—————————————————————————
1.Netwide Assembler (NASM)
2.RaWrite yada Diskete Imageleri yazacak baska bir program.
3.Bos bir disket.
Buraya Dikkat!
—————————————————————————-
Size söylemem gerekirki Assembler ile cok sey yapilabilir(yada cok sey
yanlis yapilabilir).Bu bilgisayariniza gelebilecek herhangibir zarar
benim degil, sizin sucunuzdur!
Basliyoruz
—————————————————————————-
Bir isletim sisteminin nasil calistigini anlamak icin, önce bir
bilgisayarin nasil calistigini iyi anlamak gerekir. Burada kisaca
söylüyorum ki, önce bilgisayar acilir, hemen BIOS devreye girer ve
denetimler yaptiktan sonra isletim sistemini cagirir. BIOS hangi
sürücünün önce “BOOT” lanacagini belirler. Isletim sistemini önce yerel
sürücüde arar. Biz isletim sistemimizi diskete yazacagiz.
Simdik kodlari yazmaya basliyalim;
—————————————————————————-
Ilk Kernel:
Tabiki bir Kernel sadece bir mesaj ekrana yazip sistemi yeniden
baslatmak la kalmaz ama böyle bir kod yapiyi anlamak icin kolaydir:
——————————————————–
mov ax, 1000h
mov ds, ax
mov es, ax
start: ; Burda gercek anlamda isletim
; sistemimize basliyoruz.
mov si, msg ; hemen bir string gösteriyoruz
call put
call read ; “oku” bir tusa basilana kadar bekler
jmp reset
msg db “Yeniden baslatmak icin bir tusa”
db “basin!”,13,10,0
put:
lodsb
or al, al
jz short put_d
mov ah, 0×0E
mov bx, 0×0007
int 0×10
jmp put
put_d:
retn
read:
mov ah, 0
int 016h
ret
reset:
db 0Eah
dw 0000h
dw 0FFFFh
———————————————————
Dosyayi kernel.asm diye kaydettikten sonra;
nasm –f bin –o kernel.bin kernel.asm
seklinde derlenmelidir.
Bir BOOTMANAGER
—————————————————————————-
BIOS ilk acildiginda 512Bytes boyutunda bir OP-Code arar ve BIOS bu dosyayi 0×7C00 adresine yükler.
———————–BOOT.ASM————————–
org 0×7C00 ; Öncelikle dosyanin adresini ayaliyoruz.
start:
cli ; Interrupts kullanma!
mov ax, 0×9000 ; Stack adresini kayit etme
mov ss, ax
mov sp, 0 ; Stackpointer’ 0 lamak
sti
mov [bootdriv], dl
call load ; Kernel i yükleme
mov ax, 0×1000 ; 0×1000 Shell’ in adresi
mov es, ax
mov ds, ax
push ax
mov ax, 0
push ax
retf
bootdriv db 0
loadmsg db “Sistem Yükleniyor…”,13,10,0
putstr:
lodsb
or al,al
jz short putstrd
mov ah,0×0E
mov bx,0×0007
int 0×10
jmp putstr
putstrd:
retn
load:
push ds
mov ax, 0
mov dl, [bootdriv]
int 13h
pop ds
jc load
load1:
mov ax,0×1000
mov es,ax
mov bx, 0
mov ah, 2
mov al, 5
mov cx, 2
mov dx, 0
int 13h
jc load1
mov si,loadmsg
call putstr
retn
;Programin 512 Bytes dan büyük olmamasi icin…
times 512-($-$$)-2 db 0
dw 0AA55h ; Bu da BIOS sa bitis talimatini verir
—————————————————-
nasm –f bin –o boot.bin boot.asm seklinde de dosya derlenmelidir.
Simdide isletim sistemimizi Diskete yükleyip calistirmak icin;
copy boot.bin+kernel.bin vitaxia.img
Seklinde iki dosyayi birlestiriyoruz.
Son olarak da RaWrite programi ile bu img dosyasini diske yaziyoruz.
Disketi sokup bilgisayari yeniden baslattigimizda isletim sistemimiz
calisacaktir.
Son olarak tabi ki bunu hepsi sadece bir örnek, nasil bir isletim sistemi yapabilecegimize dahil.
Herkese iyi calismalar…
A L I N T I D I R !!!!!!!!