Son ziyaretiniz: Zaman: 22 Kas 2014, 10:22


Tüm zamanlar UTC + 2 saat




Yeni başlık gönder Başlığa cevap ver  [ 6 mesaj ] 
Yazar Mesaj
 Mesaj Başlığı: Isletim sistemi yazimi birinci bolum kernel acilis ve C kodu
MesajGönderilme zamanı: 14 Kas 2011, 02:46 
Megabyte
Kullanıcı avatarı
Mesajlar: 307
Oncelikle size ben nasil assembly altinda bir bootstrap kodu yazilacagini ve bundan sonra ise C kodu ile kernel'e gecis yapilmasini anlatacagim.Zaten cogu programci icin en buyuk sorun kernel icin gerekli olan C kodunun yazim sorunudur.Amacim size C kodu yazabileceginiz bir kernel yazdirmak.Zaten C kodu yazabileceginiz bir ortam sundugumda yeteneginiz var ise gerisini kendiniz getirirsiniz.Size simdi kaynak kodlari ve Makefile'i verecegim.Hersey otomatik olacak.Bu isi yaparken ben sanal makina olarak Virtualbox kullandim.Virtualbox altinda floppy destegi getirip yazdigimiz isletim sistemini floppy versiyonu olacak.Siz bu floppy image'i virtualbox'a test adinda bir sanal makina olarak kaydederseniz.Benim yaptigim otomatik derleme sistemi ile uyumlu olur.

Kernel'imiz ( isletim sistemimiz ) linux isletim sistemi altinda nasm ve gnu c (gcc) ile derlenmistir.Bu islemleri yaparken bu yazilimlarin makinenizde yuklu olmasi gereklidir.

Ubuntu altinda nasm ve build-essential paketlerini yuklerseniz zaten bu araclar otomatik olarak gelecektir.

Ben kodumu 64bit sistemde derledim.Size verdigim derleme islemleri 64bit sistemler icin tasarlanmis otomatik derleme islemleridir ( Makefile )

Size bu verdigim kod ile kendinize ait PC mimarisi altinda kernel ( isletim sistemi ) gelistirebilecek bir kapi acmaktayim.

Insallah bu yazimin devamini getirecegim.........


Iste kaynak kodlar ve Makefile icin sizlere asagidakileri yaziyorum.Bu dosyalarin hepsini ayni dizin icine koyun...

"boot.asm" dosyasi:
Kod:
; Fat12 Bootloader

[BITS 16]                       ; We need 16-bit intructions for Real mode

[ORG 0x7C00]                    ; The BIOS loads the boot sector into memory location 0x7C00

jmp word load_kernel            ; Load the OS Kernel

;----------Fat 12 Header junk----------;

        db "ONYXDISK"           ; OEM Label String
        dw 512                  ; Bytes per sector
        db 1                    ; Sectors per FAT cluster
        dw 36                   ; Resered sector count
        db 2                    ; number of FATs
        dw 224                  ; Root dir entries
        dw 2880                 ; Total Sectors
        db 240                  ; Double sided, 18 sectors per track
        dw 9                    ; Sectors per FAT
        dw 18                   ; Sectors per track
        dw 2                    ; Head count (double sided)
        dd 0                    ; Hidden sector count
       
drive db 0                      ; Used to store boot device
       
;----------Bootsector Code----------;
 
load_kernel:
        jmp read_disk           ; Load the OS into memory
        ;jmp get_ram             ; Get ram amount
        jmp enter_pm            ; Enter Protected Mode
       
read_disk:
        mov ah, 0               ; RESET-command
        int 13h                 ; Call interrupt 13h
        mov [drive], dl         ; Store boot disk
        or ah, ah               ; Check for error code
        jnz read_disk           ; Try again if ah != 0
        mov ax, 0                               
        mov es, ax                             
        mov bx, 0x1000          ; Destination address = 0000:1000

        mov ah, 02h             ; READ SECTOR-command
        mov al, 12h             ; Number of sectors to read (0x12 = 18 sectors)
        mov dl, [drive]         ; Load boot disk
        mov ch, 0               ; Cylinder = 0
        mov cl, 2               ; Starting Sector = 3
        mov dh, 0               ; Head = 1
        int 13h                 ; Call interrupt 13h
        or ah, ah               ; Check for error code
        jnz load_kernel         ; Try again if ah != 0
        cli                     ; Disable interrupts, we want to be alone

enter_pm:
        xor ax, ax              ; Clear AX register
        mov ds, ax              ; Set DS-register to 0 - used by lgdt

        lgdt [gdt_desc]         ; Load the GDT descriptor
       
;----------Entering Protected Mode----------;
               
        mov eax, cr0            ; Copy the contents of CR0 into EAX
        or eax, 1               ; Set bit 0     (0xFE = Real Mode)
        mov cr0, eax            ; Copy the contents of EAX into CR0
       
        jmp 08h:kernel_segments ; Jump to code segment, offset kernel_segments
       

[BITS 32]                       ; We now need 32-bit instructions
kernel_segments:
        mov ax, 10h             ; Save data segment identifyer
        mov ds, ax              ; Move a valid data segment into the data segment register
        mov ss, ax              ; Move a valid data segment into the stack segment register
        mov esp, 090000h        ; Move the stack pointer to 090000h
       
        jmp 08h:0x1000          ; Jump to section 08h (code), offset 01000h
       
;----------Global Descriptor Table----------;

gdt:                            ; Address for the GDT

gdt_null:                       ; Null Segment
        dd 0
        dd 0
       
       
KERNEL_CODE             equ $-gdt
gdt_kernel_code:
        dw 0FFFFh               ; Limit 0xFFFF
        dw 0                    ; Base 0:15
        db 0                    ; Base 16:23
        db 09Ah                 ; Present, Ring 0, Code, Non-conforming, Readable
        db 0CFh                 ; Page-granular
        db 0                    ; Base 24:31

KERNEL_DATA             equ $-gdt
gdt_kernel_data:                       
        dw 0FFFFh               ; Limit 0xFFFF
        dw 0                    ; Base 0:15
        db 0                    ; Base 16:23
        db 092h                 ; Present, Ring 0, Data, Expand-up, Writable
        db 0CFh                 ; Page-granular
        db 0                    ; Base 24:32

gdt_interrupts:
        dw 0FFFFh
        dw 01000h
        db 0
        db 10011110b
        db 11001111b
        db 0

gdt_end:                        ; Used to calculate the size of the GDT

gdt_desc:                       ; The GDT descriptor
        dw gdt_end - gdt - 1    ; Limit (size)
        dd gdt                  ; Address of the GDT


times 510-($-$$) db 0          ; Fill up the file with zeros

dw 0AA55h                       ; Boot sector identifyer


Bu yukaridaki dosyaya bootstrap kodu denmektedir.Isletim sisteminin ilk acilisinda calisacak ve icra edecek kod budur.Bu kod floppy disketin ilk sektorune yazilacaktir.Bu kodun amaci C ile yazdigimiz Kernel ( isletim sistemi ) kodumuzun cagrilmasi amaclidir ( aslinda once loader.asm cagrilir.loader.asm C ile yazilmis kernel'i cagirir) .Assembly ile yazmamiz zorunluluktandir.Bootstrap kodlari assembly ile yazilmasi zorunludur.

32bit'e gecisi bootstrap kodumuz yapmaktadir.Yazdigimiz kernel korumali mod altinda 32bit olarak calismaktadir.Yani intel mikroislemcisinin ileri seviyeli modunda calismaktadir.Gerci artik 64bit'lik isletim sistemleri var fakat baslangic icin iyi bir tecrube....

Simdi ise esas kernel'i cagiracak olan "loader.asm" dosyasini yazmaya geldi.

"loader.asm":
Kod:
; Loader.asm
bits 32
extern main
global _start

_start:
  call main  ; Call our kernel's main() function
  cli        ; Stop interrupts (thats another article?)
  hlt        ; Stop all instructions


Sira geldi C kodumuza ve ekran karti driver'ina, once ekran karti driver kodunu yazalim.....

Ekran kartinin bellek adresi B800'dir.Buna gore kodu inceleyin

Asagida "video.c" ekran karti driver dosyasi

Kod:
/*
* Keros OS Project ( Kerim Operating System )
* This code was written by Kerim BASOL
* I am an embedded system programmer who is working on Microprocessor development
* http://twitter.com/kerimbasol
* Mail : kerim@bayner.com
* Mobile : +90555221 30 39
* URL : http://www.bayner.com
*/
#define SCREEN_WIDTH 80
#define SCREEN_HEIGHT 24
#define SCREEN_MAX_CHAR 1920
#define SCREEN_MAX_MEM 3840

#define BLACK          0x00
#define BLUE           0x01
#define GREEN          0x02
#define CYAN           0x03
#define RED            0x04
#define MAGENTA        0x05
#define BROWN          0x06
#define LIGHT_GRAY     0x07
#define DARK_GRAY      0x08
#define BRIGHT_BLUE    0x09
#define BRIGHT_GREEN   0x0A
#define BRIGHT_CYAN    0x0B
#define BRIGHT_RED     0x0C
#define BRIGHT_MAGENTA 0x0D
#define BRIGHT_YELLOW  0x0E
#define BRIGHT_WHITE   0x0F

#define FOREGROUND BRIGHT_WHITE
#define BACKGROUND BRIGHT_RED
#define COLOR FOREGROUND | ( BACKGROUND << 4);

char color = COLOR; /* Our global color attribute */
int pos = 0;

void setColor(char foreground, char background)
{
  color = foreground | (background << 4);
}

void setXY(int xCord, int yCord)
{
  pos = ((SCREEN_WIDTH*(yCord%SCREEN_HEIGHT))+(xCord%SCREEN_WIDTH))*2;
}

void clearscreen(){
  setXY(0,0);
  int i;
  for(i = 0 ; i != SCREEN_MAX_CHAR;++i)
    putc(' ');
}

void putc( unsigned char c )
{
  char *vidmem = (char*)0xB8000; /* pointer to video memory */
  vidmem[pos%SCREEN_MAX_MEM]   = c; /* print the character */
  vidmem[pos + 1] = color; /* Set the color attribute */
  pos += 2;
  pos %= SCREEN_MAX_MEM;
}

int puts( char *message )
{
  int length;
  while(*message)
  {
    putc(*message++);
    length++;
  }
  return length;
}

void putcXY(unsigned char c, int xCord, int yCord)
{
  setXY(xCord,yCord);
  putc(c);
}

void putsXY(char *msg,int xCord, int yCord)
{
  setXY(xCord,yCord);
  puts(msg);
}


Ekran yonetimin saglayan rutinler ve driver kodu.......

Sira geldi girdi ve ciktilarimizi saglayan rutin C kodlarimiza..

"ports.c" dosyasina
Kod:

/*
* Keros OS Project ( Kerim Operating System )
* This code was written by Kerim BASOL
* I am an embedded system programmer who is working on Microprocessor development
* http://twitter.com/kerimbasol
* Mail : kerim@bayner.com
* Mobile : +90555221 30 39
* URL : http://www.bayner.com
*/
unsigned char in(unsigned short _port)
{
  // "=a" (result) means: put AL register in variable result when finished
  // "d" (_port) means: load EDX with _port
  unsigned char result;
  __asm__  ("in %%dx, %%al" : "=a" (result) : "d" (_port));
  return result;
}

void out(unsigned short _port, unsigned char _data)
{
  // "a" (_data) means: load EAX with _data
  // "d" (_port) means: load EDX with _port
  __asm__ ("out %%al, %%dx" : :"a" (_data), "d" (_port));
}


Yukaridaki kod mikroislemcinin I/O islemleri icin onemli olan girdi cikti islemlerini yapmamiz icin gerekli rutin C kodlaridir.

ve en son kod bizim kernel'imiz , burayi siz doldurun simdilik ve programcilik bilginizi kullanarak asagidaki kodu tirtiklayin.Kendi kernel'inizin devamini bu kod uzerindan yapabilirsiniz.......

Kernel kodumuz olan "main.c" dosyasi

"main.c":
Kod:
/*
* Keros OS Project ( Kerim Operating System )
* This code was written by Kerim BASOL
* I am an embedded system programmer who is working on Microprocessor development
* http://twitter.com/kerimbasol
* Mail : kerim@bayner.com
* Mobile : +90555221 30 39
* URL : http://www.bayner.com
*/
#define DELAY_ANIMATION 7000

static inline
void lidt( void * base, unsigned short size )
{
    struct
    {
        unsigned short length;
        unsigned long base;
    } __attribute__((__packed__)) IDTR;

    IDTR.length = size;
    IDTR.base = (unsigned long)base;
    asm( "lidt (%0)"
         : : "p"(&IDTR) );
}

int main( void )
{
  int i;
 
  setColor(0x0f,0x0c);
  clearscreen();

  for(;;){ /* Keep the OS running */
    setXY(1,1);
    setColor(0x0F,0x00);
    puts("Keros  Running ");
   
    for(i = 0;i < DELAY_ANIMATION;i++ )
      putcXY('\\',16,1);
    for(i = 0;i < DELAY_ANIMATION;i++ )
      putcXY('|',16,1);
    for(i = 0;i < DELAY_ANIMATION;i++ )
      putcXY('/',16,1);
    for(i = 0;i < DELAY_ANIMATION;i++ )
      putcXY('-',16,1);
  }
}


Sira en son yazacagimiz Makefile bu sayede derleme islemlerinizi otomatiklestirecegiz......

Su dosyayi yazin:

"Makefile":
Kod:
all: floppy.img

floppy.img: kernel.bin boot.bin
   cat boot.bin kernel.bin /dev/zero | dd bs=512 count=2880 of=floppy.img

loader.o: loader.asm
   nasm -f elf loader.asm -o loader.o

kernel.bin: kernel.elf
   objcopy -R .note -R .comment -S -O binary kernel.elf kernel.bin

kernel.elf: loader.o main.c video.c ports.c
   gcc -m32  -ffreestanding -fno-builtin -nostdlib -c *.c
   ld -melf_i386 -Ttext 0x1000 -o kernel.elf loader.o main.o video.o ports.o

boot.bin: boot.asm
   nasm -f bin boot.asm -o boot.bin

clean:
   rm -f *.o
   rm -f *~
   rm -f *.elf
   rm -f *.bin
   rm -f floppy.img

test: floppy.img
   virtualbox --startvm test



Artik kodlariniz otomatik derleme islemi ile yapabilirsiniz

"make" komutu verdiginiz zaman size floppy.img adinda bir dosya uretecek.Bu dosya sizin bootstrap ve kernel kodunuzu ihtiva eden bir floppy kalip dosyasidir.Isterseniz bu kalibi bir floppy diskete yazabilirsiniz yada bu kalip dosyasini sanal pc'ye floppy drive olarak gosterebilirsiniz.Ben bunu Makefile icinde otomatik hale getirdim.Bu dosyayi Virtualbox icinde test adinda bir sanal pc actim ve bu sanal pc icinde bir floppy kontrolcusu ekledim.Bunda sonra ise floppy drive'imi gosterdim.Arkasindan ise floppy image'imi bu floppy surucuye atadim.Isterseniz bunu Virtualbox icinden uretilmis floppy image'i calistirabilirsiniz yada benim Makefile'a tanimladigim parametre ile calistirirsaniz otomatik olarak acar fakat bunu yaparken ben sizin sanal pc adini test adini koydunuzu varsaydim.Asagidaki komut ile isletim sisteminizi acabilirsiniz

Kod:
make test


Not: qemu veya kvm gibi sanal makinalarinda sanirim bir bug var.Bundan dolayi kernel acilmayabiliyor.Bundan dolayi virtualbox kullanmanizi tavsiye ederim......

Artik bundan sonra kod ile oynayarak bir isletim sistemi nasil yazilir.Gerisini tecrube edinerek yazabilirsiniz.

Yazinin devami eger hayatta kalirsam getirecegim ;)

Cok sukur Allah'im :tap

Twitter uzerinden beni kerimbasol olarak takip edebilirsiniz

http://twitter.com/kerimbasol

_________________
Kerim BASOL
Embedded System Developer
http://www.bayner.com/
kerim@bayner.com

Cep : 0555 221 30 39

Daha fazla esneklik, daha fazla olanak demektir, ama en ufak hata çok büyük hatalara sebep olabilir.


Başa Dön
Çevrimdışı Profil Özel mesaj gönder E-posta  
 
 Mesaj Başlığı: Re: Isletim sistemi yazimi birinci bolum kernel acilis ve C
MesajGönderilme zamanı: 22 Mar 2013, 15:04 
Yeni Üye
Mesajlar: 1
Ubuntu üzerinde make komutunu verdiğimde
Makefile:7: *** missing separator. Stop.
çıktısını alıyorum.


Başa Dön
Çevrimdışı Profil Özel mesaj gönder E-posta  
 
 Mesaj Başlığı: Makefile:7: *** missing separator. Stop. hatasi icin
MesajGönderilme zamanı: 30 Mar 2013, 14:41 
Megabyte
Kullanıcı avatarı
Mesajlar: 307
Makefile dosyalarindari olusturulurken, indent etme islemi vardir.Bu islemde "space" yerine "tab" tusu kullanilir.Hata buradan kaynaklaniyor.Eger bunu duzeltirseniz.Derleme islemi gerceklesecektir.

_________________
Kerim BASOL
Embedded System Developer
http://www.bayner.com/
kerim@bayner.com

Cep : 0555 221 30 39

Daha fazla esneklik, daha fazla olanak demektir, ama en ufak hata çok büyük hatalara sebep olabilir.


Başa Dön
Çevrimdışı Profil Özel mesaj gönder E-posta  
 
 Mesaj Başlığı: Re: Isletim sistemi yazimi birinci bolum kernel acilis ve C
MesajGönderilme zamanı: 19 Haz 2014, 14:48 
Yeni Üye
Mesajlar: 1
Mehaba hocam.

bende windows 8 işletim sitemi kullanmaktayım. Konsoldan ilgili klasör içine gelip make yazdığımda
[*]Makefile:7: *** missing separator. Stop.

Hatası ile karşılaşıyorum

Alıntı:
Makefile dosyalarindari olusturulurken, indent etme islemi vardir.Bu islemde "space" yerine "tab" tusu kullanilir.Hata buradan kaynaklaniyor.Eger bunu duzeltirseniz.Derleme islemi gerceklesecektir.


hocam. konu ile ilgili tam olarak bu düzenlemeyi nasıl yapacağız


Başa Dön
Çevrimdışı Profil Özel mesaj gönder E-posta  
 
 Mesaj Başlığı: Re: Isletim sistemi yazimi birinci bolum kernel acilis ve C
MesajGönderilme zamanı: 09 Tem 2014, 01:10 
Megabyte
Kullanıcı avatarı
Mesajlar: 307
Aslında Windows altında Cygwin ortamında o ortama uygun şekilde yaparsanız olur.Daha olmadı nasıl yapılacağını yazarım.

_________________
Kerim BASOL
Embedded System Developer
http://www.bayner.com/
kerim@bayner.com

Cep : 0555 221 30 39

Daha fazla esneklik, daha fazla olanak demektir, ama en ufak hata çok büyük hatalara sebep olabilir.


Başa Dön
Çevrimdışı Profil Özel mesaj gönder E-posta  
 
 Mesaj Başlığı: Re: Isletim sistemi yazimi birinci bolum kernel acilis ve C
MesajGönderilme zamanı: 09 Tem 2014, 01:11 
Megabyte
Kullanıcı avatarı
Mesajlar: 307
Sanırım main fonksiyonu formatida Cygwin içindeki nasm ile değişiyor, olabilir.

_________________
Kerim BASOL
Embedded System Developer
http://www.bayner.com/
kerim@bayner.com

Cep : 0555 221 30 39

Daha fazla esneklik, daha fazla olanak demektir, ama en ufak hata çok büyük hatalara sebep olabilir.


Başa Dön
Çevrimdışı Profil Özel mesaj gönder E-posta  
 
Eskiden itibaren mesajları göster:  Sırala  
Yeni başlık gönder Başlığa cevap ver  [ 6 mesaj ] 

Tüm zamanlar UTC + 2 saat


Bu foruma yeni başlıklar gönderemezsiniz
Bu forumdaki başlıklara cevap veremezsiniz
Bu forumdaki mesajlarınızı düzenleyemezsiniz
Bu forumdaki mesajlarınızı silemezsiniz
Bu foruma eklentiler gönderemezsiniz

Aranacak:
Geçiş yap:  
Powered by phpBB