Error con el gestor de arranque y el kernel
-
22-09-2019 - |
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.
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