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

Neo*_*mex 4 assembly operating-system kernel inline-assembly

我一直在关注这个:
(http://www.codeproject.com/KB/tips/boot-loader.aspx)
但不确定接下来会做什么以及如何做.
如何在其中加载自写内核?或者如何比单段制作更多的地方?
如何处理二进制文件?我必须将bootloader复制到第一个扇区,好吧,但内核等,只是放在软盘/光盘上?

Bre*_*dan 7

"如何加载内核"归结为知道内核在磁盘上的位置以及内存中的所需位置,然后使用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或其他任何东西启动的.