Multibootの設定方法について
現在、こちらのサイトを参考にOSを自作しています。
最終的にはマウスなども追加し、画面を操作できるようにしたいと考えています。
しかし、qemuでVBEを利用するには上記のサイトのようにqemu-system-i386 -kernel kernel
ではサポートされないらしく、GRUBなどでisoファイルを作成し、起動しないといけないようです。
isoファイルはこのサイトを参考に作成し、QEMUで起動まではできたのですがキーボード入力ができなくなってしまいました。
multibootの設定はこのサイトを読んで自分なりに設定してみたのですがサンプルのboot.Sに.long _edata
, .long _end
と書いてありますがそんなラベルどこにも見当たりません。これはどこを指しているのでしょうか?(私が使用しているのはGNUアセンブラではなくNASMなのでNASMのほうで教えてもらえると助かります)
Multibootについて他のサンプルなどを調べてみましたがどれもマジックナンバー、フラグ、チェックサムまでしか実装していませんでした。
テキストモード、グラフィックモードでのMultibootの設定をNASMで実装したサンプルを示してもらえないでしょうか?
以下は私が作成しているOSの一部です。
kernel.ld
OUTPUT_FORMAT("elf32-i386")
OUTPUT_ARCH(i386)
ENTRY(start)
SECTIONS
{
. = 0x100000;
.text : { *(.text) }
.data : { *(.data) }
.bss : { *(.bss) }
}
start.asm
section .text
GLOBAL start, multiboot_header, multiboot_entry
EXTERN kmain
start:
jmp multiboot_entry
align 4
multiboot_header:
dd 0x1badb002
dd 0x0
dd - (0x1badb002 + 0x0)
dd multiboot_header
dd start
dd 0 ; よくわからない
dd 0 ; よくわからない
dd multiboot_entry
dd 0
dd 0
dd 0
dd 0
multiboot_entry:
cli
mov esp, stack_space
push ebx
push eax
call kmain
hlt
section .bss
resb 8192
stack_space:
kmain.c
#include "types.h"
#include "defs.h"
#include "int.h"
#include "x86.h"
void kmain(void)
{
idt_init();
pic_init();
pic_enable(IRQ_KBD);
clean_screen();
kprint("KERNEL TEST");
newline();
while(1);
}
現在できていること
qemu-system-i386 -kernel kernel
では文字を打つことができる。
作成したISOファイルで起動するとKERNEL TESTという文字列を表示することはできる。(キーボードを押すと再起動がかかってしまう)
回答よろしくお願いします。