2011-07-27 102 views
3

請問有誰知道如何鏈接引導與內核?比如我有開機驗證碼:鏈接到內核

[BITS 16] 
[ORG 0x7C00] 
[global start] 
[extern _main] 
start: 
call _main 
cli 
hlt 

,這對我的C++文件:

#include <iostream> 
#include <string> 
int main() 
{ 
    std::cout << "Hello World" << std::endl; 
    return 0; 
} 

現在我將編譯.cpp文件,以.o文件中,並.asm的文件,以.o文件中。但是我現在怎麼把這些文件鏈接到kernel.bin?它有一些代碼呢?這個代碼會起作用嗎?請幫幫我。

回答

5

首先,您不能使用C/C++標準庫,因爲在業餘操作系統中,它不存在*。其次,你的C++代碼似乎是32Bit格式,而你的彙編代碼是16Bit格式。除非兩者都是16或者兩者都是32,否則這些鏈接是不可鏈接的。

我推薦查看OSDev Wiki(也發佈了user786653)...它有許多有用的資源可幫助您掌握編寫操作系統的方法。

如果你真的想使用16位大會從頭開始,並希望能夠使用32位C++代碼,你將不得不做以下步驟:

  1. 創建一個引導程序的第一階段(A加載引導加載程序其餘部分的小文件..它必須正好512字節...
  2. 創建引導加載程序的第二階段(這一個設置GDT,啓用A20線路,並切換到32位保護模式.. - 它也可以設置一個視頻模式,獲得RAM信息,並將其傳遞到32Bit內核上。)
  3. 創建一個32位內核存根(在C/C++ .. Pre可以C)。這將爲操作系統內核創建主環境。
  4. 編寫一些C/C++標準庫例程。 String.h是你的主要優先級(C++上的CString)。此外,Stdio.h文件將很有用(C++上的CStdio)
  5. 在Kernel Stub的主函數中,調用您的打印例程。

(注意要做到這一點,你必須在大會高級別的C/C知識++和至少一些知識)

*如果您在自己的庫程序則忽略第一個語句。

希望這會有所幫助!

-Adrian