我试图在 grub 和 qemu 的帮助下启动自定义内核。
如果我用“qemu -kernel -m 64 ./kernel.bin”启动它,它工作正常。
如果我用“grub-mkrescue -o os.iso ./os/”创建iso
它开始加载 grub 并且屏幕保持黑色
目录树:
------
./os/boot/
kernel.bin
grub/
grub.cfg
------
grub.cfg 的内容
set default="0"
set timeout="3"
### BEGIN 10 ###
menuentry "tmx.os" {
multiboot /boot/kernel.bin
echo " LOADING KERNEL: done"
}
### END 10 ###
屏幕上显示“加载内核:完成”行。
有人知道有什么问题吗?欢迎任何建议
==================================================== ===== UPD:我在“C”文件中有 kernel_main(),正如我在 GDB 中看到的,kernel_main 永远不会被调用。奇怪的 ?
assembly code
bits 32
section .text
align 4 ; align at 4 byte
dd 0x1BADB002 ; MAGIC
dd 0x00
dd - (0x1BADB002 + 0x00)
global start
extern kernel_main
start:
cli ; Clear interrupt flag [IF = 0]; 0xFA
mov esp, kernel_stack ; set stack pointer
;push eax ; multiboot structure
;push ebx ; MAGIC
call kernel_main ; controll to kernel_main(); in kernelc.c
hlt ; HLT Enter halt state 0xF4
end:
cli
hlt
jmp end
section .bss
resb 1024*256 ; *Kb for stack
kernel_stack: ; <= stack_space
我不明白,“调用 kernel_main”指令会发生什么?
这是“kernel.c”,什么都没有,只是清除 vid.mem。缓冲
#include "kernel.h" // <<< extern void kernel_main();
void kernel_main() {
char * BUFF = (char*) 0xb8000;
int i=0;
int ii=0;
while ( i < 80*25) {
BUFF[ ii++ ] = '#';
BUFF[ ii++ ] = 0x7;
i++;
}
}
“grub-file --is-x86-multiboot kernel.bin”也是“确认多重启动”
[已解决] 我不知道它是怎么回事,但它现在可以工作了。它的魔力 | 0x1BADB002
我写的内核是 AT&T 语法,子不能实现我需要的所有东西。GDT 和 IDT 不断崩溃,所以我用 kernel.s [NASM] 再测试一次
和 MAGIC,它现在可以工作了。呀呀呀呀呀:p