我们使用本节的BTRFS启动ReactOS

哈Ha!

我叫Victor,今年我是ReactOS项目的Google Summer of Code计划的唯一学生。 今天,我将告诉您一些我作为实习工作的情况。

ReactOS支持各种读写文件系统(fat32,ext2, ReiserFSBTRFS ),但是它仍然只能从fat32格式化的分区启动。 今年春天,我认为是时候开始纠正这种情况了,并申请了GSoC。 因此,几个月后,我写了这篇文章:)

为什么选择BTRFS? 答案很简单-WinBtrfs文件系统驱动程序是当前ReactOS代码中所有组件中最稳定,功能最全的。 在此阶段,我们要修复阻止其他FS用于加载的内核错误,因此FS驱动程序错误对我们完全没有用。



但是我必须不是从OS内核开始,而是从安装程序开始。 幸运的是,安装程序几乎已经准备就绪:所需要做的就是在我们的安装程序(usetup)中启用WinBtrfs驱动程序下载,并添加几行代码以支持必要文件系统中的格式化。 之后,我能够(几乎)轻松地将ReactOS文件复制到以BTRFS格式化的分区。

他们很快处理了安装程序,但是下一个任务要有趣得多。 ReactOS引导加载程序-FreeLdr几乎仅支持两个文件系统-fat32和iso(存在ext2和ntfs的代码,但是大约5年前没有人试图运行它)。 由于FreeLdr重复了MS的ntldr引导加载程序的原理,因此它由两部分组成-将MBR传输到磁盘的部分开头的引导扇区,以及将处理器置于保护模式的主要部分,将ntoskrnl.exe内核加载到内存中,然后执行一堆的东西。


(这就是ReactOS启动过程的样子)

因此,为了支持新的文件系统,您需要编写分区(VBR)的引导记录,其任务是在磁盘的根目录中找到引导加载程序主要部分的可执行文件(我们将其称为freeldr.sys),将其加载到内存中并在那里进行控制转移。 但这还不是全部,freeldr.sys本身需要一个几乎完整的只读文件系统驱动程序才能读取配置文件,内核,注册表灌木等。

首先,您必须处理BTRFS文件系统本身。 在此之前,我选择的最困难的东西是fat32和ext2,因此花了很多时间来学习BTRFS收割机。 wiki.kernel.org上的文档有助于弄清楚这一点,但要完全理解它是不够的-您必须查阅grub,u-boot和其他引导加载程序的来源。 事实证明,我编写的用于将文件系统结构输出到控制台的python 实用程序对于研究文件系统的结构非常有用。 使用它,我编写了引导扇区的第一个原型,该原型从具有BTRFS文件系统的带有磁盘映像的二进制文件中提取引导程序。


(根目录的元素在图片中可见)

现在是时候使用真正的引导扇区了。 由于我们在一个真实的处理器模式下工作而导致的所有后果(〜1mb的内存,分段寻址以及通过BIOS中断使用磁盘)的事实使情况变得复杂。 为像我这样的老派粉丝膨胀:)

在BTRFS结构中,几乎所有字段的大小都是64位,这是一个非常“膨胀”的代码,因为必须积极使用32位x86指令。 通常,您必须使用以下结构:

mov si, SOME_OFFSET lea si, [esi+ecx*8] lea si, [esi+ecx*8] lea si, [esi+ecx*8] // one element is 24 bytes long 

最耗时的任务是编写b树遍历过程,调试时间最多。 经过几个不眠之夜,我仍然设法从第二个下载阶段获得了令人垂涎的错误消息:



freeldr.sys成功地将其加载到内存中,甚至不需要使用诸如Unreal Mode之类的魔术。 640kb足够每个人使用!

可以在我的github存储库中查看引导扇区代码(重构仍在等待中),并且线程中有关BTRFS的所有工作。

现在轮到引导程序第二部分了-您需要教它从新文件系统中读取配置文件。 关注新闻!

Source: https://habr.com/ru/post/zh-CN416367/


All Articles