gpt4 book ai didi

assembly - 引导加载程序和内核错误

转载 作者:行者123 更新时间:2023-12-02 19:01:32 27 4
gpt4 key购买 nike

我们正在开发一个项目来学习如何编写内核并了解细节。我们编写了一个引导加载程序,并且它似乎可以工作。但是我们在加载内核时遇到了问题。我将从第一部分开始:

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 中工作。无论如何,以下是我们目前所拥有的内核。

内核.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 中有效。但是从软盘启动我们得到如下输出:

Loading Kernel Shell
...........
ERROR : Press key to reboot

其他细节:OpenSUSE 11.2、GNOME 桌面、AMD x64我可能错过的任何其他信息,请随时询问。我试图把需要的一切都放在这里。如果需要,我可以找到一种方法将整个 bootloader.asm 发布到某处。由于多种原因,我们对使用 GRUB 并不真正感兴趣。这可能会改变,但我们希望在真正考虑 GRUB 之前看到引导成功。

编辑:引导加载程序假定为 512 字节,写入磁盘的引导扇区(第一个扇区)。相信我的话,引导加载程序编译后有 512 字节。内核应该位于下一个扇区。

最佳答案

如果您希望 kernel.sys 从第二个扇区启动,请使用它而不是 cp

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

或者,假设 bootloader.bin 正好是 512 字节,这也有效:

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

关于assembly - 引导加载程序和内核错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2531654/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com