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.
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
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
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