问题描述
我遵循了本教程:https://www.youtube.com/watch?v=1rnA6wpF0o4 以便在启动后编写一个非常非常基本的 hello world,因为它在接下来的几集中看起来非常完整。我的问题是我无法看到我做错了什么,因为我验证了两次,如果我的代码与视频中的完全相同。它通过 grub 然后它只是黑屏而不是打印消息。 我已经尝试连接到描述中的论坛来提问,但它是德语并且论坛页面无法加载。
所以这里是来源: 内核.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);
}
链接器.ld
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)
}
}
loader.s
.set MAGIC,0x1badb002
.set FLAGS,(1<<0 | 1<<1)
.set CHECKSUM,-(MAGIC + FLAGS)
.section .multiboot
.long MAGIC
.long FLAGS
.long CHECKSUM
.section .text
.extern kernelMain
.global loader
loader:
mov $kernel_stack,%esp
push %eax
push %ebx
call kernelMain
_stop:
cli
hlt
jmp _stop
.section .bss
.space 2*1024*1024 # 2 MiB
kernel_stack:
和生成文件
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
在 /boot/grub/grub.cfg 中,我添加了:
menuentry 'My kernel' {
multiboot /boot/mykernel.bin
boot
}
提前致谢,如果我的问题写得不够清楚,请找我的借口。
编辑!:制作 ISO 并在 VirtualBox 下工作!
解决方案:它仅适用于 MBR/CSM 旧配置,我发现我尝试的所有计算机都是 UEFI/GPT。现在我不知道如何使它与 UEFI/GPT 兼容,但如果我不能,那没关系,我在互联网上找不到任何东西。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)