链接到内核

时间:2011-07-27 13:05:18

标签: c++ assembly operating-system kernel iostream

请问,有没有人知道如何将启动链接到内核?例如,我有这个代码用于启动:

[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?它有一些代码吗?这段代码会起作用吗?请帮帮我。

2 个答案:

答案 0 :(得分:5)

首先,您不能使用C / C ++标准库,因为在业余爱好操作系统中,它不存在*。

其次,您的C ++代码似乎是32位格式,而汇编代码是16位格式。除非两者都是16或两者都是32,否则这些不能链接。

我建议查看OSDev Wiki(也发布了用户786653)...它有许多有用的资源可以让您开始编写操作系统。

如果您真的想从头开始使用16Bit程序集,并且希望能够使用32Bit C ++代码,则必须执行以下步骤:

  1. 创建一个Bootloader的第一个阶段(一个小文件加载其余的引导加载程序..它必须是512字节......
  2. 创建一个Bootloader的第二阶段(这个设置GDT,启用A20线路,并切换到32Bit保护模式.. - 它还可以设置视频模式,获取RAM信息,并将其传递到32Bit内核..)。
  3. 创建一个32位内核存根(在C / C ++中......最好是C)。这将为操作系统的内核创建主要环境。
  4. 编写一些C / C ++标准库例程。 String.h是您的主要优先级(C ++上的CString)。另外,Stdio.h文件很有用(C ++上的CStdio)
  5. 在Kernel Stub的主要功能中,调用您的打印例程。
  6. (注意这样做,你必须具备高水平的C / C ++知识,至少在汇编方面有一些知识)

    *如果您在自己的库中编程,则忽略第一个语句。

    希望这有帮助!

    -Adrian

答案 1 :(得分:2)

C++ Bare Bones查看OSDev wiki。但是,您的代码目前还远远无法使用iostream