gpt4 book ai didi

assembly - 如何加载内核或能够在自己的引导加载程序中使用更多空间?

转载 作者:行者123 更新时间:2023-12-04 17:40:44 26 4
gpt4 key购买 nike

我一直在关注这个:
( http://www.codeproject.com/KB/tips/boot-loader.aspx )
但不确定接下来要做什么以及如何做。
如何在其中加载自己编写的内核?或者如何比单段获得更多的位置?
如何处理二进制文件?我必须将引导加载程序复制到第一个扇区,好的,但是内核等怎么办,只需放在软盘/光盘上?

最佳答案

“如何加载内核”归结为了解内核在磁盘上的位置以及您希望它在内存中的位置,然后使用 BIOS 磁盘服务来读取它。如果您希望内核加载到 0x00100000 以上,那么您可能需要将每个部分加载到一个临时缓冲区中(BIOS 可以在实模式下访问),然后使用保护模式或“非实模式”将其从缓冲区复制到你真正想要的地方。如果您想支持压缩,那么您可能需要加载文件然后解压缩它们。如果您希望内核使用复杂的文件格式(例如 ELF 或 PE,而不是简单的平面二进制文件),那么您可能还需要解析头文件、重新定位部分等。

我的引导加载程序通常比 1 个扇区大得多。第一个扇区中的代码加载第二个扇区,第一个和第二个扇区中的代码加载引导加载程序的其余部分。通过这种方式,引导加载程序可以是 20 KiB(例如),只要您小心并且不要尝试使用任何尚未加载的代码或数据。你也可以有一个第二阶段(如果你愿意,还有第三、第四等阶段),引导加载程序加载第二阶段,第二阶段加载下一个阶段,等等。

对于存储二进制文件的位置,这取决于您计划使用的文件系统。如果您不想要任何文件系统(或者您想要使用的文件系统在开始时有足够的“保留”空间),那么您可以将二进制文件连接在一起并在引导加载程序之后立即存储它们。否则,引导加载程序(和/或其他阶段)将需要在您使用的任何文件系统中查找文件。

注意:不同的引导加载程序的工作方式不同。对于从网络引导之类的东西,引导加载程序可以是 512 KiB,并且需要使用 PXE API 从网络下载数据。对于 CD-ROM,您可能最终会使用 ISO9660 文件系统(和 2 KiB 扇区)。对于硬盘,您需要处理分区(并且可能有一个用于“MBR 分区”的引导加载程序和另一个用于“GPT 分区”的引导加载程序)。你最终会得到几个完全不同的引导加载程序,它们都加载内核(或者可能是某种 RAM 磁盘镜像,如果它是微内核)并在启动内核时让计算机处于某种状态(例如特定的 CPU 模式、特定地址的内核、特定位置的其他文件等),这样内核本身就不必关心哪个引导加载程序加载了它。对于额外的复杂性,可以在此“预定义状态”中包含更多内容(例如 ACPI 表的地址、预配置视频模式的描述等),以便可以为其他类型的系统编写引导加载程序,而内核不会不需要关心它是否从“PC BIOS”或 UEFI 或 OpenFirmware 或其他任何启动。

关于assembly - 如何加载内核或能够在自己的引导加载程序中使用更多空间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4785448/

26 4 0
文章推荐: wpf - 如何从 ListViewItem 获取 ListView?
文章推荐: assembly - 比较两个二进制文件
文章推荐: jsf - 在 JSF 中迭代,使用 for 每个循环渲染纯 HTML
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com