Assembly 我做了一个简单的helloworld,kernel'';。它没有';不要打印任何东西。我做错了什么?
我遵循了这个教程:为了在开机后编写一个非常基本的hello world,因为它在接下来的几集中看起来非常完整。我的问题是,当我两次验证我的代码是否与视频中的代码完全相同时,我看不出我做错了什么。它通过grub,然后它只是黑屏而不是打印消息。 我曾尝试连接到描述中的论坛以提问,但它是德语的,论坛页面无法加载 以下是资料来源: kernel.cppAssembly 我做了一个简单的helloworld,kernel'';。它没有';不要打印任何东西。我做错了什么?,assembly,x86,g++,osdev,grub,Assembly,X86,G++,Osdev,Grub,我遵循了这个教程:为了在开机后编写一个非常基本的hello world,因为它在接下来的几集中看起来非常完整。我的问题是,当我两次验证我的代码是否与视频中的代码完全相同时,我看不出我做错了什么。它通过grub,然后它只是黑屏而不是打印消息。 我曾尝试连接到描述中的论坛以提问,但它是德语的,论坛页面无法加载 以下是资料来源: kernel.cpp void printf(char *str) { unsigned short* VideoMemory = (unsigned short*)
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)
}
}
加载器
.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:
提前谢谢,如果我的问题写得不够清楚,请原谅我
编辑!:让ISO在VirtualBox下工作
解决方案:它只在MBR/CSM遗留配置下工作,我发现我尝试的所有计算机都是UEFI/GPT。现在我不知道如何使其与UEFI/GPT兼容,但如果我不能做到这一点,那很好,我在互联网上找不到任何东西。一个问题是,代码假设屏幕上的前景和背景颜色是可查看的(它可以是黑底黑。你可以用像“黑底白”这样的东西确保它是可见的
VideoMemory[i]=(0x0F@MichaelPetch,我尝试了这些更改,但仍然不起作用。我理解了你的观点,在程序中更正了它,但我认为我的程序仍然有一些错误,我看不出来,可能是在其他来源中,我不太清楚。(我只能说我对C有相当程度的了解)Upd:我尝试将我的内核加载到另一台笔记本电脑中,结果显示,尽管文件存在,但它在/boot/mykernel.bin中找不到mykernel.bin。我不明白发生了什么。从grub打开内核时输出:错误文件/boot/mykernel.bin未找到,错误您需要先加载内核。命令“ls/boot/”显示mykernel.bin在那里。
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
menuentry 'My kernel' {
multiboot /boot/mykernel.bin
boot
}