Мы работаем над проектом, чтобы узнать, как написать ядро и узнать все входы и выходы. У нас загружен загрузочный загрузчик, и он работает. Однако у нас проблема с загрузкой ядра. Начну с первой части:Ошибка при загрузчике загрузчика и ядре
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. Но загрузка с дискеты мы получаем выход так:
Загрузка ядра Shell
...........
ОШИБКА: Нажмите клавишу для перезагрузки
Другие особенности: OpenSUSE 11.2, рабочий стол GNOME, AMD x64 Любая другая информация, которую я, возможно, пропустил, не стесняйтесь спрашивать. Я пытался получить все здесь, что было бы необходимо. Если мне нужно, я могу найти способ получить всю загрузку загрузчика. Мы не очень заинтересованы в использовании GRUB по нескольким причинам. Это может измениться, но мы хотим, чтобы эта загрузка была успешной, прежде чем мы действительно рассмотрим GRUB.
EDIT: Загрузочный загрузчик должен быть 512 байт, записанный в загрузочный сектор (самый первый сектор) диска. Поверьте мне на слово, загрузчик is Снято 512 байт. Ядро предполагается находиться в следующем секторе.
Я очень сомневаюсь, что вы на самом деле означает 'ф kernel.sys/DEV/fd0', который будет перезаписывать дисководу от начала. Даже если вы не вставляете его, можете ли вы описать, откуда должен загружаться ваш загрузчик ядра? – ephemient
Ну, да, это на самом деле то, что я имею в виду. Это пример, который мне был предоставлен для копирования файла на устройство. Разве это должно быть иначе?Я очень новичок в Linux - я был в Windows с 3.0. – IAbstract
Ваш 'dd' записывает один сектор' bootloader.bin' в первый сектор дискеты. Затем ваш 'cp' копирует' kernel.sys' прямо на дискету, перезаписывая это ... возможно, вы хотите «dd seek = 1», чтобы начать размещение «kernel.sys» во втором секторе дискеты? Вам нужно больше узнать о загрузчике, чтобы определить, хотите ли вы этого. – ephemient