Assembly 引导加载程序和内核出错

Assembly 引导加载程序和内核出错,assembly,kernel,nasm,opensuse,bootstrapping,Assembly,Kernel,Nasm,Opensuse,Bootstrapping,我们正在进行一个项目,以学习如何编写内核并了解其细节。我们编写了一个引导加载程序,它似乎可以工作。但是,我们在内核加载方面遇到了问题。我将从第一部分开始: bootloader.asm: [BITS 16] [ORG 0x0000] ; ; all the stuff in between ; ; the bottom of the bootstrap loader datasector dw 0x0000 cluster dw 0x0

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

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有效。但从软盘启动时,我们得到如下输出:

正在加载内核外壳

错误:按键重新启动

其他细节:OpenSUSE 11.2,GNOME桌面,AMDx64 我可能错过的任何其他信息,请随时询问。我试着把所有需要的东西都放在这里。如果需要,我可以找到一种方法将整个bootloader.asm发布到某个地方。出于以下几个原因,我们对使用GRUB也不感兴趣。这可能会改变,但是我们希望在我们真正考虑GRUB之前看到这个引导成功了。
编辑:引导加载程序假定为512字节,写入磁盘的引导扇区(第一个扇区)。相信我的话,bootloader编译了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

我非常怀疑你的意思是
cp kernel.sys/dev/fd0
,它会从一开始就覆盖软盘设备。即使你不粘贴它,你能描述一下你的引导加载程序应该从哪里将内核加载到内存中吗?嗯,是的,这就是我的意思。这就是给我的将文件复制到设备的示例。应该有所不同吗?我对Linux非常陌生-我从3.0开始就在Windows中。您的
dd
bootloader.bin
的一个扇区写入软盘的第一个扇区。然后您的
cp
kernel.sys
直接复制到软盘上,覆盖该软盘。。。也许您的意思是将
ddseek=1
,开始将
kernel.sys
放在软盘的第二个扇区?需要有关引导加载程序的更多详细信息,以确定这是否是您想要的。bootloader.bin正好是512字节。
cat…
命令是否将bootloader.bin放在扇区0(引导扇区)??它将从原始设备的开头开始(Linux很方便,允许对块设备进行非块访问)这正好是扇区0。显然,这是写入
/dev/fd0
的问题。即使使用您提供的示例,显然kernel.sys文件也没有被编写。当我制作软盘的映像时,它返回一个1.4Mb的映像文件;但是,只有前512个字节实际上是用引导写入的。图像上没有kernel.sys。我将继续,并将其标记为答案,因为我认为这是我可以继续的最远的答案。我认为剩下的问题必须在SU上解决。