Assembly Grub未正确加载我的操作系统

Assembly Grub未正确加载我的操作系统,assembly,x86,g++,osdev,multiboot,Assembly,X86,G++,Osdev,Multiboot,我刚刚基于youtube创建了一个基本的操作系统,可以将文本打印到屏幕上。 本教程中使用的方法相当复杂(我假设),因为它使用C++而不是C。 在Grub菜单中选择操作系统后,菜单关闭,但屏幕保持紫色。没有文本打印到屏幕上。我已经仔细检查了我的代码是否与教程匹配,但它仍然不能像在他的机器上一样工作 相关硬件: CPU: Ryzen 5 2600 MOBO: Asrock B450-M HDV 这些文件相当小,包括在下面 内核.cpp: void printf(char* str) { u

我刚刚基于youtube创建了一个基本的操作系统,可以将文本打印到屏幕上。 本教程中使用的方法相当复杂(我假设),因为它使用C++而不是C。 在Grub菜单中选择操作系统后,菜单关闭,但屏幕保持紫色。没有文本打印到屏幕上。我已经仔细检查了我的代码是否与教程匹配,但它仍然不能像在他的机器上一样工作

相关硬件:

CPU: Ryzen 5 2600
MOBO: Asrock B450-M HDV
这些文件相当小,包括在下面

内核.cpp

void printf(char* str) {
    unsigned short* VideoMemory = (unsigned short*)0xb8000;

    for(int i = 0; str[i] != '\0'; ++i) {
        VideoMemory[i] = (VideoMemory[i] & 0xFF00) | str[i];
    }
}


extern "C" void kernelMain(void* multiboot_structure, unsigned int magicnumber) {
    printf("Hello World!");

    while(1);
}
ENTRY(loader)
OUTPUT_FORMAT(elf32-i386)
OUTPUT_ARCH(i386:i386)

SECTIONS {
    . = 0x0100000;

    .text : {
        *(.multiboot)
        *(.text*)
        *(.rodata)
    }

    .data : {
        start_ctors = .;
        KEEP(*(.init_array));
        KEEP(*(SORT_BY_INIT_PRIORITY( .init_array.* )))
        end_ctors = .;

        *(.data)
    }

    .bss : {
        *(.bss)
    }

    /DISCARD/ : {
        *(.fini_array*)
        *(.comment)
    }
}
GPPPARAMS = -m32 -fno-use-cxa-atexit -nostdlib -fno-builtin -fno-rtti -fno-exceptions -fno-leading-underscore
ASPARAMS = --32
LDPARAMS = -melf_i386
objects = loader.o kernel.o

%.o: %.cpp
    g++ $(GPPPARAMS) -o $@ -c $<

%.o: %.s
    as $(ASPARAMS) -o $@ $<


mykernel.bin: linker.ld $(objects)
    ld $(LDPARAMS) -T $< -o $@ $(objects)

install: mykernel.bin
    sudo cp $< /boot/mykernel.bin

<强>加载程序.s>强>:(因为C++希望在运行前设置堆栈指针)

生成文件

void printf(char* str) {
    unsigned short* VideoMemory = (unsigned short*)0xb8000;

    for(int i = 0; str[i] != '\0'; ++i) {
        VideoMemory[i] = (VideoMemory[i] & 0xFF00) | str[i];
    }
}


extern "C" void kernelMain(void* multiboot_structure, unsigned int magicnumber) {
    printf("Hello World!");

    while(1);
}
ENTRY(loader)
OUTPUT_FORMAT(elf32-i386)
OUTPUT_ARCH(i386:i386)

SECTIONS {
    . = 0x0100000;

    .text : {
        *(.multiboot)
        *(.text*)
        *(.rodata)
    }

    .data : {
        start_ctors = .;
        KEEP(*(.init_array));
        KEEP(*(SORT_BY_INIT_PRIORITY( .init_array.* )))
        end_ctors = .;

        *(.data)
    }

    .bss : {
        *(.bss)
    }

    /DISCARD/ : {
        *(.fini_array*)
        *(.comment)
    }
}
GPPPARAMS = -m32 -fno-use-cxa-atexit -nostdlib -fno-builtin -fno-rtti -fno-exceptions -fno-leading-underscore
ASPARAMS = --32
LDPARAMS = -melf_i386
objects = loader.o kernel.o

%.o: %.cpp
    g++ $(GPPPARAMS) -o $@ -c $<

%.o: %.s
    as $(ASPARAMS) -o $@ $<


mykernel.bin: linker.ld $(objects)
    ld $(LDPARAMS) -T $< -o $@ $(objects)

install: mykernel.bin
    sudo cp $< /boot/mykernel.bin
GPPPARAMS=-m32-fno使用cxa-atexit-nostdlib-fno内置-fno rtti-fno异常-fno前导下划线
天冬氨酸=--32
LDPARAMS=-melf_i386
objects=loader.o kernel.o
%.o:%.cpp
g++$(GPPPARAMS)-o$@-c$<
%.o:%.s
as$(ASPARAMS)-o$@$<
mykernel.bin:linker.ld$(对象)
ld$(LDPARAMS)-T$<-o$@$(对象)
安装:mykernel.bin
sudo cp$
可能BIOS没有让您的图形设备处于VGA文本模式。有没有办法通过代码或作为编译器标志或类似的方式来实现这一点?谢谢我认为grub有设置图形模式的指令。为了在你自己的代码中实现这一点,你需要切换到实模式,这样你就可以使用int 10h,这相当复杂。有没有可能这是在一些奇怪的硬件上实现的,比如x86 chromebook?@v1n你能找到答案吗,因为我也有同样的问题。