gpt4 book ai didi

kernel - 将内核加载到内存中——如何编写加载器本身?

转载 作者:行者123 更新时间:2023-12-01 09:36:42 25 4
gpt4 key购买 nike

我正在努力在 D 中制作我自己的引导加载程序和内核,但我遇到了一个绊脚石。
背景:

  • 我在写 一切从头开始。所以引导扇区正在组装中。我是 不是 使用 GRUB。
  • 我正在使用 Qemu 进行测试。
  • 引导扇区从“磁盘”(目前只是一个平面二进制文件,其第一个扇区是引导加载程序,其余扇区是内核代码)中读取内核到虚拟地址 0xC0000000,并调用 kmain() ,我的内核的入口点。
  • 我正在使用 PE文件格式对于我的内核。 (请不要告诉我使用 Elf——我选择的是 PE。)

  • 问题
    能够加载 PE 文件是内核工作的一部分。那么我如何首先将内核本身加载到内存中,以便它能够真正正确执行呢?
    我无法从引导扇区执行此操作,因为 (1) 它不适合 512 字节,并且 (2) 它是 痛苦 在组装中做。显然,我也不能在内核本身中做到这一点。那么我该怎么做呢?

    最佳答案

    GRUB 是如何做到的?

    在 GRUB 中,512 字节的引导扇区不会加载内核。相反,它加载引导加载程序的其余部分,这远大于 512 字节。加载内核的正是这个第二阶段的引导加载程序。你将不得不做类似的事情。

    加载第二阶段的代码比加载完整内核的代码简单得多——它基本上将几个扇区直接加载到一个固定的内存地址中(在低内存中——此时它仍处于实模式)并跳转到一个固定的内存地址。

    第二阶段主要可以用 C 编写。在跳转到 C 函数执行其余操作之前,您只需要在汇编中进行一些设置(进入保护模式、设置堆栈和其他一些低级处理器内容)的设置。

    Linux 内核过去曾做过类似的事情。您可以将原始内核直接复制到软盘中。它的前 512 个字节是一个软盘引导扇区,它将接下来的几个扇区(仍处于实模式)加载到低内存中的一个固定地址。接下来的几个扇区有代码(仍在汇编中)将内核的其余部分加载到固定的内存地址中,并跳转到其真正的入口点。如今,IIRC 大部分代码都被删除了,Linux 内核现在依赖于外部引导加载程序。

    关于kernel - 将内核加载到内存中——如何编写加载器本身?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6405229/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com