Pregunta

Estamos trabajando en un proyecto para aprender cómo escribir un kernel y aprender los pros y los contras.Tenemos un gestor de arranque por escrito y parece que funciona.Sin embargo, estamos teniendo un problema con el kernel de carga.Voy a empezar con la primera parte:

gestor de arranque.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

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

El gestor de arranque.asm es demasiado largo para el editor, sin que éste se marchan y se ahogue.Además, el gestor de arranque y el kernel de hacer el trabajo dentro de bochs como podemos hacer llegar el mensaje de "Bienvenido a nuestro sistema operativo".De todos modos, lo siguiente es lo que tenemos para un kernel en este punto.

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  

El uso de nasm 2.06rc2 puedo compilar como tal:
nasm bootloader.asm -o bootloader.bin -f bin
nasm kernel.asm -o kernel.sys -f bin

Podemos escribir el gestor de arranque.bin en el disco como tal:
dd if=bootloader.bin bs=512 count=1 of/dev/fd0

Escribimos kernel.sys para el disco como tal:
cp kernel.sys /dev/fd0

Como he dicho, esto funciona en bochs.Pero el arranque desde el disquete tenemos salida como:

Cargar El Kernel Shell
...........
ERROR :Presione la tecla para reiniciar

Otros detalles:OpenSUSE 11.2, escritorio de GNOME, AMD x64 Cualquier otra información que puede haber perdido, siéntase libre de preguntar.Traté de hacer todo lo que sería necesario.Si quiero, puedo encontrar una manera de conseguir la totalidad del gestor de arranque.asm publicado en algún lugar.No estamos realmente interesados en el uso de GRUB, ya sea por varias razones.Esto podría cambiar, pero queremos ver este arranque de éxito antes de que realmente considere la posibilidad de GRUB.

EDITAR: El gestor de arranque se supone que debe ser de 512 bytes, escrita en el sector de arranque (primer sector) del disco.Tome mi palabra para ella, gestor de arranque es 512 bytes compilado.El kernel se supone que debe ser en el siguiente sector.

¿Fue útil?

Solución

Si quieres kernel.sys para iniciar en el segundo sector, el uso de este en lugar de cp.

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

O, suponiendo que bootloader.bin es exactamente 512 bytes, esto también funciona:

cat bootloader.bin kernel.sys > /dev/fd0
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top