C++ 使用qemu测试自己的自制操作系统。asm/c++;
我已经制作了基本操作系统,它还没有真正做任何事情,但我想在qemu上测试它。但是我必须为ld linker的输出文件做些什么才能使它与qemu(iso或其他什么?)一起工作呢 这是我的链接器脚本:C++ 使用qemu测试自己的自制操作系统。asm/c++;,c++,assembly,operating-system,ld,qemu,C++,Assembly,Operating System,Ld,Qemu,我已经制作了基本操作系统,它还没有真正做任何事情,但我想在qemu上测试它。但是我必须为ld linker的输出文件做些什么才能使它与qemu(iso或其他什么?)一起工作呢 这是我的链接器脚本: OUTPUT_FORMAT("binary") ENTRY(start) SECTIONS { .text 0x00100000: { code = .; _code = .; __code = .; *(.text) . = ALIGN
OUTPUT_FORMAT("binary")
ENTRY(start)
SECTIONS
{
.text 0x00100000:
{
code = .; _code = .; __code = .;
*(.text)
. = ALIGN(4096);
}
textEnd = .;
.data :
{
data = .; _data = .; __data = .;
*(.data)
. = ALIGN(4096);
}
dataEnd = .;
.bss :
{
bss = .; _bss = .; __bss = .;
*(.bss)
. = ALIGN(4096);
}
bssEnd = .;
end = .; _end = .; __end = .;
}
boot.s:(ASM)
这一切工作都没有错误,唯一的问题是如何在qemu中引导它?
输出文件是可执行的,但我当然不能在linux上运行它,因为它是一个操作系统 如果您有qemu,可以使用以下方法启动:
qemu-system-i386-kernel kernel.bin
如果boot.asm
是一个引导加载程序(具有正确的签名),那么使用二进制文件作为磁盘映像就足够了。另外,我建议阅读教程,可能也可以。好的,它现在可以引导,但在qemu中,当我按enter键时,它会再次引导grub。在真正的硬件上,它引导到grub,但随后什么也没有发生。您可能会在这里得到帮助。在这种情况下,这不起作用,它用“pflash_write:未实现的flash cmd序列(偏移量00000000000000 40,wcycle 0x0 cmd 0x0 value 0x1000079)”填充终端,然后冻结。这是qemu上的错误。
[BITS 32]
MBOOT_PAGE_ALIGN equ 1 << 0
MBOOT_MEM_INFO equ 1 << 1
MBOOT_AOUT_KLUDGE equ 1 << 16
MBOOT_MAGIC equ 0x1BADB002
MBOOT_FLAGS equ MBOOT_PAGE_ALIGN | MBOOT_MEM_INFO | MBOOT_AOUT_KLUDGE
CHECKSUM equ -(MBOOT_MAGIC + MBOOT_FLAGS)
STACK_SIZE equ 0x1000
[global start]
[extern main]
[extern textEnd]
[extern dataEnd]
[extern bssEnd]
entry:
jmp start
align 4, db 0
mBootHeader:
dd MBOOT_MAGIC
dd MBOOT_FLAGS
dd CHECKSUM
dd mBootHeader
dd entry
dd dataEnd
dd bssEnd
dd entry
start:
call main
cli
hlt
$ nasm -f aout boot.s -o boot.o
$ gcc -c kernel.cpp -ffreestanding -nostdlib -fno-builtin -fno-rtti -fno-exceptions -m32
$ ld -T link.ld -o kernel.bin boot.o kernel.o -melf_i386