2015-03-30 3 views
0

Недавно я начал программирование os, и я написал загрузчик с nasm, который вызывает ядро ​​... когда я его эмулирую, загрузчик работает отлично, но ядро ​​не загружается, код:Загрузите ядро ​​из моего 16-битного загрузчика

bootloader.asm

%define os 0x1000 
%define drive 0x80 
%define os_sect 3 
%define ftable 0x2000 
%define ftabsect 2 

[BITS 16] 
[org 0x7c00] 

start: 

;boot message 
mov si, bootMsg 
call printstring 


;waitin for user press key 
mov ah, 0 
int 16h 

;load sector os 
mov ax, os 
mov es, ax 
mov cl, os_sect 
mov al, 2 
call sectorloader 


jmp 0x1000:0 



;print charactere function 
printchar: 
mov ah, 0x0E 
mov bh, 0x00 
mov bl, 0x03 
int 0x10 
ret 

;print string function ~ using printchar function 
printstring: 
    nextchar: 
     mov al, [si] 
     inc si 
     or al, al 
     jz exit 
     call printchar 
     jmp nextchar 

    exit: 
     ret 

sectorloader: 
    mov bx, 0 
    mov dl, drive 
    mov dh, 0 
    mov ch, 0 
    mov ah, 2 
    int 0x13 
    jc loaderror 
    ret 

loaderror: 
    mov si,loadsectorError 
    call printstring 
    mov ah,0 
    int 16h 
    int 19h 




;data 
bootMsg db 'Booting [OK]',10,13,'Press any key !',10,13,10,13,0 
loadsectorError db 'Error while loading sector[!]',10,13,0 
TIMES 510 - ($-$$) db 0 
DW 0xAA55 

kernel.asm

[bits 16] 
[org 0] 
    mov al, 65 
    mov ah, 0x0E 
    mov bh, 0x00 
    mov bl, 0x03 
    int 0x10 

Я строю программы, как так: nasm -f bin -o try.bin bootloader.asm -p kernel.bin

И я эмулировать его так: QEMU-система-i386 try.bin

Так что, если кто-то может мне помочь ... спасибо

+0

Связанные: [общие советы Майкла Petch для развития загрузчика] (https://stackoverflow.com/questions/32701854/boot-loader-doesnt-jump-to-kernel-code/32705076#32705076) , и рабочий пример [bootloader + kernel] (https://stackoverflow.com/questions/33603842/how-to-make-the-kernel-for-my-bootloader/33619597#33619597), который работает на QEMU. –

ответ

0

Вы делая некоторые предположения и пропуская некоторые хорошие практики. Когда BIOS загружает ваш код из загрузочного сектора, текущий номер диска будет сохранен в DL. Вместо того, чтобы предполагать, что это 0x80, вы действительно должны хранить это значение. Кроме того, очень хорошая идея сбросить диск, прежде чем пытаться прочитать этот сектор. Вот некоторые рабочий код из одного из моих загрузчиков:

mov  [bootDrive], dl ; DL contains the drive number used to boot. 

mov ah,0x00 ; reset disk 
int 0x13 

      ; Load the next 16 sectors as boot code. 
mov dx,0 ; Clear DX 
mov ah,0x02 ; read sectors into memory 
mov al,0x10 ; number of sectors to read (16) 
mov dl,[bootDrive] ; drive number to reset, previously stored on boot 
mov ch,0 ; cylinder number 
mov dh,0 ; head number 
mov cl,2 ; starting sector number 
mov es, 0x1000 
mov bx,0 ; address to load to - Ends up being 0x1000:0000 
int 0x13 ; call the interrupt routine 
jmp 0x1000:0000 
0

Спасибо Дэвид Hoelzer за ваш ответ, я проверил мой код с виртуальной дискеты в виртуальной машине (и добавил функцию, сброс привода), и теперь это работает как прелесть, но на самом деле я столкнулся с другой проблемой: я реализовал крошечную оболочку, которая работает так: - вы даете имя программы - оболочка ищет ее, если в программе существует оболочка load it else ничего не происходит Но проблема в том, что я не понял глобальную концепцию файловой системы (это отдельный файл или ...), и я не знаю, как полагаться на мои программы с моей оболочкой

Я нашел этот пример файловой системы: {file1-sector, file2-sector, ..., filen-sector,} , но это не очень понятно.

Благодаря