2010-07-17 46 views
7

我在軟盤上製作了一個小程序集引導裝載程序,並想知道是否可以在C++中創建引導裝載程序,如果有的話,我可以從哪裏開始?對於我所知道的我不知道它甚至會使用int main()C++中的引導裝載程序

感謝您的任何幫助。

+0

可能的重複[要在C或C++中編寫自舉程序?](http://stackoverflow.com/questions/1629123/to-write-a-bootloader-in-c-or-c) – sbi 2010-07-17 22:22:34

+0

我相信它們是有區別的。這個問我應該如何繼續,另一個是關於C和C++之間的選擇。但是有一些重疊。 – kriss 2010-07-17 22:28:39

回答

9

如果你正在編寫一個引導加載程序,那麼你基本上從零開始:一小段代碼被加載到內存中並執行。您可以使用在C++中編寫大部分引導加載程序,但您需要首先引導您自己的C++運行時環境。

組裝是第一階段的唯一選擇,因爲您需要爲更高級別的運行設置合理的環境。做足夠的C代碼是非常簡單的 - 你需要:

  • 代碼和數據加載在正確的地方;
  • 可能有數據區的額外部分必須被零初始化;
  • 您需要將堆棧指針指向堆棧的適當內存區域。

然後,您可以在適當的位置跳轉到代碼(例如,main()),並期望基本語言功能將起作用。 (這是可能的,可能已經實施或掛在標準的任何功能可能在這個階段需要額外的初始化。)

獲得一個合適的環境去爲C++需要更多的努力,因爲在這裏需要更多的初始化並且還具有需要運行時支持的核心語言功能(再次,這是在考慮庫功能之前)。其中包括:

  • 運行靜態構造函數;
  • 內存分配支持newdelete;
  • 支持運行時類型信息(RTTI);
  • 支持異常;
  • 可能是我忘記提及的其他一些東西。需要

沒有這些,直至C環境是啓動和運行,以便處理這些可以用C語言編寫,而不是彙編(或甚至在C++,不利用上述的子集的代碼特徵)。 (同樣的原理適用於嵌入式系統,這種系統使用C++並不少見,但只能以有限的方式 - 例如沒有例外和/或RTTI,因爲沒有實現運行時支持。 )

2

引導加載程序沒有「int main()」,除非您編寫彙編代碼來調用它。 如果你正在編寫一個stage 1 bootloader,那麼它會受到嚴重的阻礙。

否則,osdev.org有關於該主題的很好的文檔。
雖然它很可能在C++中創建引導加載程序,但請記住不要將代碼鏈接到任何動態庫,並且請記住,僅僅因爲它是C++,並不意味着您可以/應該使用STL等

+0

如果是C++,則可以使用STL。這是故事結尾。如果你不能使用STL,那不是C++。 – Puppy 2010-07-17 22:04:06

+0

如果它有一條尾巴它是一條狗,如果它沒有它不是故事尾巴 – kriss 2010-07-17 22:07:46

+0

感謝該網站有很多很好的信息。 – nosedive25 2010-07-17 22:09:55

2

是的,這是可能的。你有答案和有用的鏈接元素this question

你也可以看看here,有一個C++ bootloader的例子。

需要理解的主要問題是您需要創建一個平面二進制文件而不是通常的花哨可執行文件格式(Windows上的PE或Unix上的ELF),因爲這些文件格式需要一個操作系統來加載它們,並且一個啓動加載器,你還沒有一個操作系統。

如果靜態鏈接(因爲上述可執行問題再次出現,沒有動態鏈接),使用庫不是問題。但顯然所有的OS API相關的入口點都不可用...

3

自從我開始編寫自舉程序,我已經有一段時間了,所以我要離開內存。

對於x86引導加載程序,您需要有一個可以發出x86程序集的C++編譯器,或者至少需要在16位程序集中編寫自己的前導碼,以便將CPU置於32位保護(或64位長)模式,然後才能調用C++函數。然而,一旦你完成了這些工作,只要你遠離需要底層libc的東西,你應該能夠利用C++語言特性的大部分(如果不是全部的話)。但靜態鏈接一切,沒有CRT,你是金。