在“multiboot /boot/kernel.bin”之后grub什么都不做

时间:2016-09-27 22:47:56

标签: kernel grub multiboot

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

0 个答案:

没有答案