Legacy BIOS下GRUB无法引导带Multiboot头的自定义内核怎么办?
Legacy BIOS环境下GRUB无法引导Multiboot内核
我开发了一个带有Multiboot头的内核,但当虚拟机使用Legacy BIOS固件时,GRUB无法完成引导。以下是相关代码文件与信息:
链接器脚本
ENTRY(_start) /* 入口标签名称 */ SECTIONS { . = 0x00100000; /* 代码加载地址为1MB */ .text ALIGN (0x1000) : /* 按4KB对齐 */ { *(.text) /* 所有文件的text段 */ } .rodata ALIGN (0x1000) : /* 按4KB对齐 */ { *(.rodata*) /* 所有文件的只读数据段 */ } .data ALIGN (0x1000) : /* 按4KB对齐 */ { *(.data) /* 所有文件的数据段 */ } .bss ALIGN (0x1000) : /* 按4KB对齐 */ { *(COMMON) /* 所有文件的COMMON段 */ *(.bss) /* 所有文件的bss段 */ } }
内核加载器(汇编代码)
bits 32 MB_MAGIC equ 0x1BAD002 MB_FLAGS equ 0x0010003 MB_CHECKSUM equ -(MB_MAGIC + MB_FLAGS) section .multiboot align 4 dd MB_MAGIC dd MB_FLAGS dd MB_CHECKSUM global _start extern kinit _start: cli call kinit .loop: jmp .loop section .note.GNU-stack noalloc noexec nowrite progbits
内核代码(C语言)
#include <stdint.h> #include <cga.h> void kinit() { print("Hello Crix!", CGA_COLOR_BLACK, CGA_COLOR_WHITE); }
构建ISO镜像的Makefile
CC = gcc ASM = nasm TARGET_DIR = target JUNKS = *.o *.a *.bin *.elf *.log *.img *.iso *.cpio* crix* .PHONY: build build: @$(MAKE) clean @mkdir -p $(TARGET_DIR)/boot/grub @$(MAKE) -C kernel @cp kernel/crix $(TARGET_DIR)/boot @echo set timeout=0 > $(TARGET_DIR)/boot/grub/grub.cfg @echo menutry ""Crix"" { >> $(TARGET_DIR)/boot/grub/grub.cfg @echo " kernel /boot/crix" >> $(TARGET_DIR)/boot/grub/grub.cfg @echo } >> $(TARGET_DIR)/boot/grub/grub.cfg @grub-mkrescue $(TARGET_DIR) -o crix.iso clean: @$(foreach JUNK, $(JUNKS), $(shell find . -name "$(JUNK)" -delete)) @rm -rf $(TARGET_DIR) export CC export ASM
引导错误截图

源码托管在GitHub仓库。
内容的提问来源于stack exchange,提问作者First Person
相关产品推荐
相关产品推荐

