IAb*_*act 5 assembly bootstrapping kernel nasm opensuse
我们正在开发一个项目来学习如何编写内核并学习内部细节.我们编写了一个自举加载程序,它似乎工作.但是我们遇到内核加载问题.我将从第一部分开始:
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
;*************************************************************************
Run Code Online (Sandbox Code Playgroud)
对于编辑器而言,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
Run Code Online (Sandbox Code Playgroud)
使用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我可能错过的任何其他信息,随时可以询问.我试图在这里得到所需的一切.如果我需要,我可以找到一种方法来将整个bootloader.asm发布到某个地方.由于几个原因,我们对使用GRUB并不感兴趣.这可能会改变,但我们希望在我们真正考虑GRUB之前看到这个启动成功.
编辑:引导加载程序假设为512字节,写入磁盘的引导扇区(第一扇区).说实话,bootloader 编译为 512字节.内核假设是在下一个扇区.
如果您想kernel.sys从第二个扇区开始,请使用它而不是cp。
dd if=kernel.sys of=/dev/fd0 bs=512 seek=1
Run Code Online (Sandbox Code Playgroud)
或者,假设bootloader.bin正好是 512 字节,这也有效:
cat bootloader.bin kernel.sys > /dev/fd0
Run Code Online (Sandbox Code Playgroud)