【问题标题】:Linking to a kernel链接到内核
【发布时间】:2011-10-14 06:13:47
【问题描述】:

请问,有人知道如何将引导与内核链接吗?例如我有这个启动代码:

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

【问题讨论】:

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


    【解决方案1】:

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

    其次,您的 C++ 代码似乎是 32 位格式,而您的汇编代码是 16 位格式。除非都是 16 岁或都是 32 岁,否则这些无法关联。

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

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

    1. 创建引导加载程序的第一阶段(加载引导加载程序其余部分的小文件。它必须正好是 512 字节...
    2. 创建引导加载程序的第二阶段(此阶段设置 GDT,启用 A20 线路,并切换到 32 位保护模式.. - 它还可以设置视频模式,获取 RAM 信息,并将其传递到 32 位内核..)。
    3. 创建一个 32 位内核存根(在 C/C++ 中。最好是 C)。这将为操作系统内核创建主环境。
    4. 编写一些 C/C++ 标准库例程。 String.h 是您的主要优先事项(C++ 上的 CString)。此外,Stdio.h 文件也会很有用(C++ 上的 CStdio)
    5. 在内核存根的主函数中,调用您的打印例程。

    (注意要做到这一点,您必须具备高水平的 C/C++ 知识和至少一些汇编知识)

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

    希望这会有所帮助!

    -阿德里安

    【讨论】:

      【解决方案2】:

      OSDev wikiC++ Bare Bones。但是你的代码目前还远远不能使用iostream

      【讨论】:

        猜你喜欢
        • 2021-02-01
        • 2015-05-29
        • 1970-01-01
        • 2014-05-14
        • 2011-10-14
        • 1970-01-01
        • 2018-09-30
        • 2013-11-02
        • 1970-01-01
        相关资源
        最近更新 更多