如何在C中正确创建内核并链接到引导加载程序

问题描述 投票:2回答:1

我在这里有一个简单的引导加载程序:

;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 assembly x86 bootloader osdev
1个回答
3
投票

如何在C中正确创建内核并链接到引导加载程序

别。

操作系统通常是许多单独的可执行文件(引导加载程序,内核,GUI,文本编辑器,Web浏览器......),这些文件没有链接在一起构成一个大型文件(例如“Ubuntu.exe”)。

适用于80x86的引导加载程序;一般来说,你可能有:

  • 用于BIOS的引导加载程序,用于未分区的存储设备(例如古老的软盘)
  • 用于BIOS的引导加载程序,专为“MBR分区”存储设备而设计
  • 用于BIOS的引导加载程序,专为“GPT分区”存储设备而设计
  • 用于BIOS的引导加载程序,用于可引导CD(“无仿真El Torito”)
  • 用于PXE /网络启动的BIOS启动加载程序
  • 引导加载程序设计UEFI(并编译为32位)
  • 引导加载程序设计UEFI(并编译为64位)

这些事情中的每一个都涉及一些非常不同的代码(引导加载程序文件格式,固件限制,固件API,从哪里获取内核等)。

您希望确保任何引导加载程序都可以使用相同的内核(并确保可能是错误的一个特定引导加载程序尚未内置到内核中/与内核链接)。

不要忘记(最终,不是在早期开发期间)最终用户下载/获取某种“操作系统安装程序”;并且“操作系统安装程序”确定要与操作系统一起安装的正确引导加载程序(可能在询问用户是否/何地/如何安装操作系统之后以及在检测到有关安装操作系统的计算机的各种信息之后) - 什么类型的CPU,什么类型的固件,什么类型的分区方案,...)。在“OS安装程序”完成大量工作之前,您无法知道哪个引导加载程序是正确的引导加载程序(并且在构建项目时无法知道哪个引导加载程序是正确的引导加载程序)。

© www.soinside.com 2019 - 2024. All rights reserved.