2012-10-29 176 views
3

似乎有相當多的相同的信息在互聯網有關編寫以下3個引導程序上:調用32位或64位程序從啓動加載程序

  1. 無限循環jmp $
  2. 打印單個字符
  3. 打印「Hello World」。

這真是太棒了,我已經經歷了這三種變化,而且幾乎沒有麻煩。

我想在C中編寫一些32位或64位代碼並編譯它,並從bootloader調用該代碼......基本上是一個引導加載程序,例如,它將計算機設置爲運行一些簡單數值模擬。例如,我將首先列出素數,然後可能會從用戶輸入/輸出以計算傅里葉變換。我不知道。

我還沒有找到任何有關如何做到這一點的信息,但我甚至可以在開始之前預見到一些問題。

首先,編譯C程序將其編譯爲幾個不同文件之一,具體取決於目標。對於Windows,它是一個PE文件。對於Linux,它是一個.out文件。這些文件完全不同。在我的例子中,目標不是Windows或Linux,它只是我在引導加載程序中編寫的任何內容。其次,實際代碼在哪裏?自舉程序正好是512字節,但我用C編寫的程序肯定會編譯得更大。它需要坐在我的(虛擬)硬盤上,可能是某種文件系統(我甚至沒有定義!),我甚至需要將這個文件中的信息加載到內存中,然後才能考慮執行它。但從我的理解來看,所有這些都比12行的「Hello World」引導加載程序複雜得多很多很多。

所以我的問題是:如何從我的16位引導加載程序調用一個32位或64位的大型程序(用C/C++編寫)。

+5

我會建議看看http://wiki.osdev.org。您可以使用BIOS [從磁盤加載更多數據](http://wiki.osdev.org/ATA_in_x86_RealMode_(BIOS)),然後您需要進入[保護模式](http://wiki.osdev.org/ Protected_Mode)或[長時間模式](http://wiki.osdev.org/X86-64)。你可以解析一個可執行文件,或者只是創建一個可以直接跳轉到的平面二進制文件(gcc/ld可以做到這一點)。 – ughoavgfhw

回答

相關問題