Ошибка с загрузчиком и ядром - PullRequest
5 голосов
/ 28 марта 2010

Мы работаем над проектом, чтобы научиться писать ядро ​​и изучать все входы и выходы. У нас есть загрузчик, написанный и он работает. Однако у нас проблема с загрузкой ядра. Начну с первой части:

bootloader.asm:

    [BITS 16]
    [ORG 0x0000]
;
;    all the stuff in between
;
;    the bottom of the bootstrap loader

     datasector  dw 0x0000
     cluster     dw 0x0000
     ImageName   db "KERNEL  SYS"
     msgLoading  db 0x0D, 0x0A, "Loading Kernel Shell", 0x0D, 0x0A, 0x00
     msgCRLF     db 0x0D, 0x0A, 0x00
     msgProgress db ".", 0x00
     msgFailure  db 0x0D, 0x0A, "ERROR : Press key to reboot", 0x00

     TIMES 510-($-$$) DB 0
     DW 0xAA55

     ;*************************************************************************

bootloader.asm слишком длинный для редактора, не заставляя его пыхтеть и задыхаться. Кроме того, загрузчик и ядро ​​работают в bochs , поскольку мы получаем сообщение «Добро пожаловать в нашу ОС». В любом случае, вот что у нас есть для ядра на данный момент.

kernel.asm:

[BITS 16]
[ORG 0x0000]

[SEGMENT .text]         ; code segment
    mov     ax, 0x0100          ; location where kernel is loaded
    mov     ds, ax
    mov     es, ax

    cli
    mov     ss, ax          ; stack segment
    mov     sp, 0xFFFF          ; stack pointer at 64k limit
    sti

    mov     si, strWelcomeMsg       ; load message
    call        _disp_str

    mov     ah, 0x00
    int     0x16                ; interrupt: await keypress
    int     0x19                ; interrupt: reboot

_disp_str:
    lodsb                       ; load next character
    or      al, al          ; test for NUL character
    jz      .DONE

    mov     ah, 0x0E            ; BIOS teletype
    mov     bh, 0x00            ; display page 0
    mov     bl, 0x07            ; text attribute
    int     0x10                ; interrupt: invoke BIOS

    jmp     _disp_str

.DONE:
    ret

[SEGMENT .data]                 ; initialized data segment
    strWelcomeMsg   db  "Welcome to our OS",    0x00

[SEGMENT .bss]              ; uninitialized data segment  

Используя nasm 2.06rc2, я компилирую так:
nasm bootloader.asm -o bootloader.bin -f bin
nasm kernel.asm -o kernel.sys -f bin

Мы записываем bootloader.bin на дискету так:
dd if=bootloader.bin bs=512 count=1 of/dev/fd0

Мы записываем kernel.sys на дискету так:
cp kernel.sys /dev/fd0

Как я уже говорил, это работает в bochs . Но при загрузке с дискеты мы получаем вывод примерно так:

Загрузка ядра оболочки
...........
ОШИБКА: нажмите клавишу для перезагрузки

Другие особенности: OpenSUSE 11.2, рабочий стол GNOME, AMD x64 Любая другая информация, которую я мог пропустить, не стесняйтесь спрашивать. Я пытался получить здесь все, что было бы необходимо. Если мне нужно, я могу найти способ опубликовать весь bootloader.asm где-нибудь. Мы не очень заинтересованы в использовании GRUB по нескольким причинам. Это может измениться, но мы хотим увидеть успешную загрузку, прежде чем мы действительно рассмотрим GRUB.

РЕДАКТИРОВАТЬ: Предполагается, что загрузчик начальной загрузки составляет 512 байт, записанных в загрузочный сектор (самый первый сектор) диска. Поверьте мне, загрузчик скомпилирован 512 байт. Предполагается, что ядро ​​находится в следующем секторе.

1 Ответ

3 голосов
/ 28 марта 2010

Если вы хотите, чтобы kernel.sys начинался со второго сектора, используйте это вместо cp.

dd if=kernel.sys of=/dev/fd0 bs=512 seek=1

Или, если bootloader.bin равно 512 байт, это тоже работает:

cat bootloader.bin kernel.sys > /dev/fd0
...