链接到内核

Fre*_*Cen 3 c++ assembly operating-system kernel iostream

请问,有人知道如何将启动与内核联系起来吗?例如,我有这个代码用于启动:

[BITS 16]   
[ORG 0x7C00]
[global start]
[extern _main]
start:
call _main
cli 
hlt
Run Code Online (Sandbox Code Playgroud)

这对我的C++文件:

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

现在我将.cpp文件编译为.o文件,将.asm文件编译为.o文件.但是,我现在如何将这些文件链接到kernel.bin?它有一些代码吗?这段代码会起作用吗?请帮我.

Adr*_*ado 5

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

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

我建议查看OSDev Wiki(user786653也发布了这篇文章)...它有许多有用的资源可以让你开始编写操作系统.

如果您真的想从头开始使用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的主要功能中,调用您的打印例程.

(注意这样做你必须具备高水平的C/C++知识,至少在汇编方面有一些知识)

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

希望这可以帮助!

-Adrian