簡體   English   中英

C ++中的引導加載程序

[英]A boot loader in C++

我通過在軟盤上制作一個小的裝配引導加載程序,並且想知道是否可以在c ++中創建引導加載程序,如果是這樣,我可以從哪里開始? 據我所知,我不確定它甚至會使用int main()

謝謝你的幫助。

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

裝配是第一階段的唯一選擇,因為您需要為運行更高級別的任何東西建立一個合理的環境。 做足夠的運行C代碼非常簡單 - 你需要:

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

然后,您可以在適當的位置(例如main() )跳轉到代碼,並期望基本語言功能可以工作。 (可能已經實現或鏈接的標准庫的任何功能可能需要在此階段進行額外的初始化。)

為C ++獲得合適的環境需要更多的努力,因為它需要更多的初始化,並且還具有需要運行時支持的核心語言功能(同樣,這是在考慮庫特性之前)。 這些包括:

  • 運行靜態構造函數;
  • 內存分配支持newdelete ;
  • 支持運行時類型信息(RTTI);
  • 支持例外;
  • 可能還有其他一些我忘記提及的事情。

在C環境啟動並運行之前,這些都不是必需的,因此處理這些的代碼可以用C而不是匯編程序編寫(甚至可以用不使用上述功能的C ++子集編寫)。

(相同的原則適用於嵌入式系統,這種系統使用C ++並不常見,但只能以有限的方式使用 - 例如沒有異常和/或RTTI,因為沒有實現運行時支持。)

自從我玩編寫bootloader以來已經有一段時間了,所以我要離開記憶了。

對於x86引導加載程序,您需要一個可以發出x86程序集的C ++編譯器,或者至少需要在16位程序集中編寫自己的前導碼,這將使CPU進入32位保護(或64 -bit long)模式,然后才能調用C ++函數。

但是,一旦你完成了這個,你就應該能夠利用大部分(如果不是全部)C ++的語言特性,只要你遠離那些需要底層libc的東西。 但是靜態地將所有內容聯系起來而沒有CRT,你就是金色的。

Bootloader沒有“int main()”,除非你編寫匯編代碼來調用它。 如果您正在編寫第1階段引導加載程序,那么嚴重不鼓勵它。

否則, osdev.org就該主題提供了很好的文檔。
雖然它可能能夠使C ++中的引導程序,切記不要你的代碼鏈接到任何動態庫,並記住,僅僅因為它是C ++,這並不意味着你可以/應該使用STL等。

對的,這是可能的。 這個問題中,您有答案元素和有用的鏈接

你也可以在這看一下 ,有一個C ++ bootloader示例。

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

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

暫無
暫無

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

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