我在这里有一个简单的引导加载程序:
;initialization type stuff
[bits 16]
[org 0x7c00]
;make message and print it
mov si, MESSAGE
call print
;infinite loop to stall
jmp $
;print "method"
print:
pusha
print_loop:
mov al, [si]
cmp al, 0
jne print_char
popa
ret
print_char:
mov ah, 0x0e
int 0x10
add si, 1
jmp print_loop
;actual assigning of message
MESSAGE: db "Hello World!", 0
;padding & magic number (end)
times 510-($-$$) db 0
dw 0xaa55
我的目标是让大部分操作系统都用C编程,目前我正在尝试在C中正确链接bootloader和内核:
void kernel_main()
{
printf("Hello World!");
}
我如何将这些链接在一起并将它们编译成我可以在qemu /任何普通计算机中打开的东西?
如何在C中正确创建内核并链接到引导加载程序
别。
操作系统通常是许多单独的可执行文件(引导加载程序,内核,GUI,文本编辑器,Web浏览器......),这些文件没有链接在一起构成一个大型文件(例如“Ubuntu.exe”)。
适用于80x86的引导加载程序;一般来说,你可能有:
这些事情中的每一个都涉及一些非常不同的代码(引导加载程序文件格式,固件限制,固件API,从哪里获取内核等)。
您希望确保任何引导加载程序都可以使用相同的内核(并确保可能是错误的一个特定引导加载程序尚未内置到内核中/与内核链接)。
不要忘记(最终,不是在早期开发期间)最终用户下载/获取某种“操作系统安装程序”;并且“操作系统安装程序”确定要与操作系统一起安装的正确引导加载程序(可能在询问用户是否/何地/如何安装操作系统之后以及在检测到有关安装操作系统的计算机的各种信息之后) - 什么类型的CPU,什么类型的固件,什么类型的分区方案,...)。在“OS安装程序”完成大量工作之前,您无法知道哪个引导加载程序是正确的引导加载程序(并且在构建项目时无法知道哪个引导加载程序是正确的引导加载程序)。