簡體   English   中英

如何在C中正確創建內核並鏈接到引導加載程序

[英]How to properly create a kernel in C and link to bootloader

我在這里組裝了一個簡單的引導程序:

;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中正確鏈接引導程序和內核:

void kernel_main()
{
    printf("Hello World!");
}

我如何將它們鏈接在一起並將它們編譯為可以在qemu /任何普通計算機中打開的文件?

如何在C中正確創建內核並鏈接到引導加載程序

別。

操作系統通常是許多單獨的可執行文件(引導加載程序,內核,GUI,文本編輯器,Web瀏覽器等),這些文件沒有鏈接在一起,成為可以執行所有操作的單個大文件(例如“ Ubuntu.exe”)。

對於80x86的引導加載程序; 一般來說,您可能會:

  • 用於未分區存儲設備(例如,古老的軟盤)的BIOS引導加載程序
  • 用於“ MBR分區”存儲設備的BIOS引導加載程序
  • 用於“ GPT分區”存儲設備的BIOS引導加載程序
  • 用於可引導CD的BIOS引導加載程序(“無仿真El Torito”)
  • 用於PXE /網絡引導的BIOS引導加載程序
  • 引導加載程序設計的UEFI(並編譯為32位)
  • 引導加載程序設計的UEFI(並針對64位進行編譯)

所有這些都涉及一些非常不同的代碼(引導加載程序文件格式,固件限制,固件API,從何處獲取內核等)。

您要確保您的任何引導加載程序都可以與同一內核一起使用(並確保沒有將一個特定的引導加載程序錯誤地嵌入內核或與內核鏈接)。

不要忘記(最終,不是在早期開發期間)最終用戶下載/獲取某種“ OS安裝程序”; 並且“操作系統安裝程序”確定要與操作系統一起安裝的正確引導加載程序(可能是在詢問用戶是否/在何處/如何安裝操作系統之后,以及在檢測到有關要安裝操作系統的計算機的各種信息之后-什么類型的CPU,什么類型的固件,什么類型的分區方案,...)。 在“ OS安裝程序”完成大量工作之前,您不知道哪個引導程序是正確的引導程序(並且在構建項目時也不知道哪個引導程序是正確的引導程序)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM