After a long time trying to make it work by myself, I ask your help...
The problem : my OS works on Bochs, but doesn't work on a real computer.
My bootloader seems to work cause if I put a "jmp $" before the "jmp 0x8:BASE << 4" I can see my bootloader message (which is between kernel copy to RAM and protected mode activation, so it means my kernel is loaded).
But whithout that, my computer restart when it tries to jump to my Kernel.
I don't overwrite the BIOS normally, but probably I do something wrong.
My boot sector :
Code: Select all
%define BASE 0x100 ; 0x0100:0x0 = 0x1000
%define KSIZE 50 ; nombre de secteurs a charger
[BITS 16]
[ORG 0x0]
jmp start
%include "fn_boot.inc"
start:
; initialisation des segments en 0x07C0
mov ax, 0x07C0
mov ds, ax
mov es, ax
mov ax, 0x8000
mov ss, ax
mov sp, 0xf000
; recuparation de l'unite de boot
mov [bootdrv], dl
; charger le noyau
xor ax, ax
int 0x13
push es
initialise_disque: ; Initialise le lecteur de disque
xor ax, ax
int 0x13
jc initialise_disque ; En cas d'erreur on recommence (sinon, de toute façon, on ne peut rien faire)
lire:
mov ax, BASE ; ES:BX = BASE:0000
mov es, ax
xor bx, bx
mov ah, 2 ; Fonction 0x02 : chargement mémoire
mov al, KSIZE ; On lit KSIZE secteurs
xor ch, ch ; Premier cylindre (n° 0)
mov cl, 2 ; Premier secteur (porte le n° 2, le n° 1, on est dedans, et le n° 0 n'existe pas)
xor dh, dh ; Tête de lecture n° 0
; Toujours pas d'identifiant de disque, c'est toujours le même.
int 0x13 ; Lit !
jc lire ; En cas d'erreur, on recommence
pop es
; initialisation du pointeur sur la GDT
mov ax, gdtend ; calcule la limite de GDT
mov bx, gdt
sub ax, bx
mov word [gdtptr], ax
xor eax, eax ; calcule l'adresse lineaire de GDT
xor ebx, ebx
mov ax, ds
mov ecx, eax
shl ecx, 4
mov bx, gdt
add ecx, ebx
mov dword [gdtptr+2], ecx
mov si, msgDebut
call print16 ; This messages is spawned by my computer
; passage en modep
cli
lgdt [gdtptr] ; charge la gdt
mov eax, cr0
or ax, 1
mov cr0, eax ; PE mis a 1 (CR0)
jmp next
next:
mov ax, 0x10 ; segment de donne
mov ds, ax
mov fs, ax
mov gs, ax
mov es, ax
mov ss, ax
mov esp, 0x9F000
; jmp $ if I do that I see my boot message
jmp 0x8:0x1000 ; It restart my real computer & works in VMs
;--------------------------------------------------------------------
bootdrv: db 0
msgDebut: db "Chargement du kernel", 13, 10, 0
;--------------------------------------------------------------------
gdt:
db 0, 0, 0, 0, 0, 0, 0, 0
gdt_cs:
db 0xFF, 0xFF, 0x0, 0x0, 0x0, 10011011b, 11011111b, 0x0
gdt_ds:
db 0xFF, 0xFF, 0x0, 0x0, 0x0, 10010011b, 11011111b, 0x0
gdtend:
;--------------------------------------------------------------------
gdtptr:
dw 0 ; limite
dd 0 ; base
;--------------------------------------------------------------------
;; NOP jusqu'a 510
times 510-($-$$) db 144
dw 0xAA55
Thanks a lot for reading my bad english.