0

我试图在 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

4

0 回答 0