[ maddog_srb @ 03.10.2011. 09:37 ] @
Zeleo bih da napravim benchmark CPU-a koji ce se pokretati bez OS-a.

Pogledao sam neke tutorijale o "Hello world" bootloader-ima, i za sada bih mogao da ispisem neki tekst na ekranu...
Potrebna mi je neka vrsta merenja proteklog vremena za koje CPU izvrsi neke operacije, i mehanizam za upisivanje tih rezultata na HDD.
Da li neko zna neki link koji bi mi pomogao?

Da li je pravi nacin da se svaka od ovih f-ja napise u ASM, i da se posle poziva u C-u, ili ima neki laksi nacin, mozda neke vec napisane f-je kojima nije potreban OS da bi se mogle pozvati u C-u...

[ maddog_srb @ 13.10.2011. 13:32 ] @
Imam problem kod podesavanja GDT-a...

Naime, u C-u definisem strukturu gdt_pointer, i zatim pozovem kod u ASM, ali problem nastaje kada pokusam da ucitam adresu gdt_pointer-a...

evo ga ASM

Code:

[BITS 32]
[global start]
[extern _k_main] ;

start:
  cli
  
  call _k_main
  
  hlt    
  
[global _gdtFlush]     ; Allows the C code to link to this
[extern _gdt_p] ;

_gdtFlush:

    mov byte [ds:0B8000h], 'C'     ;#1
    mov byte [ds:0B8001h], 0Ch  
    
    lgdt [_gdt_p]   
    mov ax, 0x10     
    mov ds, ax
    mov es, ax
    mov fs, ax
    mov gs, ax
    mov ss, ax    

    jmp 0x08:flush2   
    
flush2:
    ret


#1: testiram da li se poziva gdtFlush iz C-a, i ovo radi, ali ako probam da ispisem ovo isto, posle lgdt [_gdt_p] ne radi...

evo kako pozivam gdtFlush()

Code:

    gdt_p.limit = (sizeof(struct gdtEntry) * 3) - 1;
    gdt_p.base = (unsigned int)&gdt;
  
    gdtSetDescriptor(0, 0, 0, 0, 0);
    gdtSetDescriptor(1, 0, 0xFFFFFFFF, 0x9A, 0xCF);
    gdtSetDescriptor(2, 0, 0xFFFFFFFF, 0x92, 0xCF);

    gdtFlush();


NAPOMENA: primeri i tutorijali koje sam gledao, koriste GRUB, medjutim ja koristim moj bootloader. Da li GRUB radi nesto specijalno, sto bih morao ja da implementiram, da bih mogao ovako da definisem GDT???