2010-03-28 18 views
5

Estamos trabajando en un proyecto para aprender a escribir un kernel y aprender los pormenores. Tenemos un cargador de bootstrap escrito y parece funcionar. Sin embargo, estamos teniendo un problema con la carga del kernel. Voy a empezar con la primera parte:Error con bootstrap loader y kernel

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 

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

El bootloader.asm es demasiado largo para el editor sin hacer que chug y se ahogue. Además, el gestor de arranque y el kernel funcionan dentro de bochs, ya que recibimos el mensaje "Bienvenido a nuestro sistema operativo". De todos modos, lo siguiente es lo que tenemos para un núcleo 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 

Usando 2.06rc2 nasm puedo compilar tales como:
nasm bootloader.asm -o bootloader.bin -f bin
nasm kernel.asm -o kernel.sys -f bin

Escribimos bootloader.bin al disquete como tal:
dd if=bootloader.bin bs=512 count=1 of/dev/fd0

Escribimos kernel.sys en el disquete como tal:
cp kernel.sys /dev/fd0

Como dije, esto funciona en bochs. Pero el arranque desde el disquete obtenemos salida es similar a:

Cargando Kernel Shell
...........
ERROR: Pulse la tecla para reiniciar

Otras características: OpenSUSE 11.2, escritorio GNOME, AMD x64 Cualquier otra información que pueda haber perdido, no dude en preguntar. Traté de obtener todo lo que aquí se necesitaría. Si lo necesito, puedo encontrar una forma de publicar todo el bootloader.asm en alguna parte. No estamos realmente interesados ​​en usar GRUB por varias razones. Esto podría cambiar, pero queremos ver este arranque exitoso antes de que realmente consideremos GRUB.

EDIT: El cargador de bootstrap se supone que debe ser de 512 bytes, escrito en el sector de arranque (primer sector) del disco. Tome mi palabra para ello, bootloader es 512 bytes compilados. Se supone que el núcleo está en el siguiente sector.

+1

Dudo mucho que usted realmente quiere decir 'cp kernel.sys/dev/fd0', y sobrescribirá la unidad de disquete desde el comienzo. Incluso si no lo pegas, ¿puedes describir de dónde se espera que el gestor de arranque cargue el kernel en la memoria? – ephemient

+0

Bueno, sí, eso es realmente lo que quiero decir. Es el ejemplo que me dieron para copiar un archivo al dispositivo. ¿Debería ser diferente?Soy muy nuevo en Linux. He estado en Windows desde 3.0. – IAbstract

+1

Su 'dd' escribe un sector de' bootloader.bin' en el primer sector del disquete. Entonces tu 'cp' copia' kernel.sys' directamente al disquete, sobrescribiendo eso ... ¿tal vez te refieres a 'dd seek = 1', para comenzar a colocar' kernel.sys' en el segundo sector del disquete? Necesita más detalles sobre su gestor de arranque para determinar si eso es lo que quiere. – ephemient

Respuesta

3

Si desea kernel.sys para comenzar en el segundo sector, utilice esto en lugar de cp.

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

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

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

bootloader.bin tiene exactamente 512 bytes ... ¿El comando 'cat ...' pondrá bootloader.bin en el sector 0 (el sector de arranque) ??? – IAbstract

+0

Comenzará al principio del dispositivo sin formato (Linux es conveniente y permite el acceso sin bloque para bloquear dispositivos) que es el sector 0. – ephemient

+0

Aparentemente, este es un problema con la escritura en '/ dev/fd0'. Incluso con las muestras que proporcionó, aparentemente el archivo kernel.sys no se está escribiendo. Cuando hago una imagen del disquete, devuelve un archivo de imagen de 1.4Mb; sin embargo, solo los primeros 512 bytes están escritos con el programa de arranque. No hay kernel.sys en la imagen. – IAbstract