Bootloader

来自osdev
Zhang3讨论 | 贡献2021年12月23日 (四) 08:06的版本 (创建页面,内容为“引导加载程序是为加载更复杂的 内核 而编写的程序。 实施细节收集在 Rolling Your Own Bootloader 中 == 引导加载程序是做什么的 == The boot loader ultimately has to: * 将内核 (以及所有需要引导的内核) 带入内存 * 为内核提供正确工作所需的信息 * 切换到内核会喜欢的环境 * 将控制转移到内核 在x86上,引导加载程序以 真实模式 运行。 因此,它…”)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳到导航 跳到搜索

引导加载程序是为加载更复杂的 内核 而编写的程序。 实施细节收集在 Rolling Your Own Bootloader

引导加载程序是做什么的

The boot loader ultimately has to:

  • 将内核 (以及所有需要引导的内核) 带入内存
  • 为内核提供正确工作所需的信息
  • 切换到内核会喜欢的环境
  • 将控制转移到内核

在x86上,引导加载程序以 真实模式 运行。 因此,它可以轻松访问BIOS资源和功能。 因此,它是执行内存映射检测,检测可用视频模式,加载附加文件等的好地方。 引导加载程序将收集这些信息,并以内核能够理解的方式呈现这些信息。

加载您的内核

内核的位在某些磁盘上 (大概是引导磁盘,但这不是强制性的)。 问题是: 磁盘上的位置?它是 FAT格式的 分区上的常规文件吗? 它是FAT文件系统 “保留区域” 中连续扇区的集合 (在这种情况下,您可能需要专用工具来格式化磁盘并在其上安装内核)?还是磁盘/分区只是简单地未格式化而内核直接用磁盘映像工具粘贴?

以上所有选项都是可能的。 也许我自己选择的是在FAT文件系统上保留足够的空间来存储内核文件使用的扇区列表。 BPB中的字段保留扇区是一个完美的地方。 完全胖的 “优点” 是,您无需每次重写内核时都重新编写引导扇区。

需要加载的内容主要取决于内核中的内容。 例如,Linux需要一个额外的 “初始化” 文件,其中将包含 “初始化过程” (作为用户级别)。 如果您的内核是模块化的,并且某些模块可以理解文件系统,则需要与内核一起加载模块。 磁盘/文件/内存服务等 “微内核服务” 也是如此。

给内核提供信息

有些内核需要一些额外的信息才能运行。 例如,您需要告诉Linux从开始的根分区。 非常有用的信息是地址空间的地图-实际上是物理内存在哪里和不在哪里的地图。 其他流行的查询涉及视频模式。

一般来说,任何涉及BIOS调用的事情在 真实模式 下都更容易做到,所以在真实模式下做这些事情比在以后尝试回到真实模式下旅行更好。

Establishing an environment

大多数内核都需要保护模式。对于这些内核,你必须

 before giving control to the kernel.

加载程序通常会禁用中断 (内核将在正确设置IDT后启用它们)。

Note: 花点时间想想你是否会在这里启用分页。 请记住,在没有异常处理程序帮助的情况下调试分页初始化代码可能很快就会成为一场噩梦!

Bootloader design

实际上,任何引导加载程序都遵循通用设计。

单级引导加载器

单级引导加载程序由完全由BIOS加载的单个文件组成。 然后,此映像执行上述步骤以启动内核。 但是,在x86上,第一阶段通常限制为512个字节 (无仿真 El-Torito 是一个例外),这并不多。 而且,这种大小的很多可能专用于bios结构和 FAT 标头,从而留出了更少的空间来使用

两阶段引导加载程序

两阶段引导加载程序实际上由两个引导加载程序组成。 第一个很小,唯一的目的是加载第二个。 然后,第二个可以包含加载内核所需的所有代码。 GRUB uses two (or arguably, three) stages.

混合引导加载器

避免512字节障碍的另一种方法是将引导加载程序分为两部分,其中前半部分 (512字节) 可以加载其余部分。 这可以通过在ASM代码中插入 “512字节” 中断来实现,确保加载器的其余部分放在引导扇区之后。

引导多个os

启动另一个OS的最简单方法是一种称为chainloading的机制。 Windows在其安装的分区的引导扇区中存储类似于第二阶段引导加载程序的内容。 安装Linux时,也可以选择将例如LILO或GRUB写入分区引导扇区而不是MBR。 现在,你的MBR引导部门可以做的事情是重新定位自己 (从0x0000:0x7c00复制到,传统上,0x0060:0x0000),解析分区表,显示某种菜单,让用户选择从哪个分区启动。 然后,您的 (重新定位的) MBR引导扇区将该分区引导扇区加载到0x0000:0x7c00,然后跳转到那里。 分区引导扇区不会更明智,因为之前已经加载了一个引导扇区,并且实际上可以加载另一个引导扇区-这就是为什么它被称为chainloading。

您会看到,通过以某种可理解的方式显示菜单并接受击键,这样的多选项引导加载程序可以变得相当复杂,相当快。 我们甚至没有触及从扩展分区启动的主题,这将需要在打印菜单之前顺序读取和解析多个扩展分区表。

到了极致,像这样的引导管理器可以变得像一个简单的操作系统一样复杂,GRUB 就是一个很好的例子: 它提供从各种文件系统的读取、引导 多引导 内核、链式加载、加载 initrd ramdisks等。

另见

Articles

  • BootProg is able to load COM/MZ programs from a FAT12/16/32-formatted media
  • Bootf is a small FAT12 floppy bootloader for protected mode OS images
  • Gujin is a GPLed bootloader for the PC
  • GRUB is a huge, bloated Grand Unified Bootloader, used by many OSes
  • BOOTBOOT for booting 64 bit kernels on BIOS, UEFI, El Torito CDROM etc.
  • Limine is a bootloader capable of natively booting 64-bit kernels and Linux
  • SysLinux is the Linux kernel loader
  • Rolling Your Own Bootloader

Threads

External Links

de:Bootloader