问题描述
我刚刚创建了一个基于此youtube tutorial的基本操作系统,可将文本打印到屏幕上。 本教程中使用的方法相当复杂(我认为),因为它使用C ++而不是C。 在Grub菜单中选择OS后,菜单关闭,但屏幕保持紫色。屏幕上没有文本打印。我已经仔细检查过我的代码是否与本教程相匹配,但是它仍然无法像在他的计算机上那样工作。
相关硬件:
CPU: Ryzen 5 2600
MOBO: Asrock B450-M HDV
文件很小,包括在下面。
kernel.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);
}
loader.s :(因为C ++希望在运行之前设置堆栈指针)
.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 MB
kernel_stack:
linker.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)
}
}
制作文件:
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
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)