我试图在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 ###
屏幕上显示“LOADING KERNEL:done”行。
有人知道什么是错的吗?欢迎任何建议
=============================================== ======== 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”是“多重启动确认”
[解决] 我不知道它是怎么回事,萌芽它现在有效。它的MAGIC | 0x1BADB002
我写的内核是AT&amp; T语法,sub无法实现我需要的所有东西。 GDT和IDT不断崩溃,所以我再次使用kernel.s [NASM]进行测试
和MAGIC,它现在有效。 Yeeeeeeeeeeyyy:p