在基于 Intel 的 PC 系统上,BIOS 固件设置系统,然后从 DOS 文件系统的引导块加载要运行的镜像。这或多或少是 MILO 在基于 Alpha 的系统上所做的事情,但是 BIOS 固件和 MILO 之间存在几个有趣的差异,其中最重要的是 MILO 包含并使用了未经修改的标准 Linux 设备驱动程序。MILO 是固件,不像 LILO 那样依赖 BIOS 固件来加载自身。MILO 的主要功能部分包括:
PALcode,
内存设置代码(构建页表并启用虚拟寻址),
视频代码(BIOS 模拟代码和 TGA (21030)),
Linux 内核代码。这包括真实的 Linux 内核代码(例如,中断处理)和模拟或伪造的 Linux 内核,
Linux 块设备驱动程序(例如,软盘驱动程序),
文件系统支持(ext2、MS-DOS 和 ISO9660),
用户界面代码 (MILO),
内核接口代码(为 Linux 设置 HWRPB 和内存映射),
用于管理环境变量的 NVRAM 代码。
以下段落更详细地描述了这些功能部分。
PALcode 可以被认为是一个微小的软件层,它使芯片适应特定的操作系统。它在特殊模式 (PALmode) 下运行,该模式具有某些限制,但它使用标准的 Alpha 指令集,只增加了五个额外的指令。通过这种方式,Alpha 芯片可以运行各种不同的操作系统,如 Windows NT、OpenVMS、Digital Unix,当然还有 Linux。MILO 使用的 PALcode(以及因此 Linux 本身)与 MILO 的其余部分一样,是免费软件。它来源于 Digital 的评估板软件示例 Digital Unix PALcode。不同 PALcode 之间的差异是由于 Alpha 芯片(基于 21066 的系统具有与 21064+2107x 系统不同的 I/O 映射)和不同的基于 Alpha 的系统之间存在的地址映射和中断处理差异造成的。
为了使 MILO 正常运行,它需要知道可用的内存量、Linux 最终将在哪里运行,并且它必须能够为 Linux 设备驱动程序分配临时内存。该代码维护一个内存映射,其中包含永久和临时分配页面的条目。在启动时,MILO 将自身解压缩到物理内存中的正确位置。当它将控制权传递给 Linux 内核时,它会为自身的压缩版本、PALcode(内核需要)和一些数据结构保留内存。这留下了大部分系统内存供 Linux 本身使用。
内存代码的最后一个动作是设置并启用虚拟寻址,以便 Linux 期望看到的数据结构位于虚拟内存中的正确位置。
MILO 包含视频代码,用于初始化和使用系统的视频设备。如果存在 VGA 设备,它将检测并使用 VGA 设备,否则它将尝试使用 TGA (21030) 视频设备。如果两者都失败,它将假定没有图形设备。标准的、预构建的镜像包含的 BIOS 模拟是 Digital 自己的 BIOS 模拟,它支持大多数(如果不是全部)可用的标准图形设备。
Linux 设备驱动程序存在于内核中,并期望从内核获得某些服务。其中一些服务由 Linux 内核代码直接提供,例如中断处理,而另一些服务由类似内核的例程提供。
MILO 最强大的功能是您可以将未经修改的 Linux 设备驱动程序嵌入到其中。这使其有可能支持 Linux 支持的每个设备。MILO 包含配置到与其构建的 Linux 内核中的所有块设备,以及许多块设备代码(例如,ll_rw_blk())。
MILO 从真实的文件系统而不是从引导块和其他奇怪的位置加载 Linux 内核。它理解 MSDOS、EXT2 和 ISO9660 文件系统。支持 Gzip 压缩文件,并且建议使用它们,特别是如果您要从速度较慢的软盘加载。MILO 通过它们的 .gz 后缀来识别这些文件。
MILO 内置了一个简单的键盘驱动程序,它与同样简单的视频驱动程序一起,使其能够拥有一个简单的用户界面。该界面允许您列出配置设备上的文件系统、启动 Linux 或运行闪存更新实用程序以及设置控制系统启动的环境变量。与 LILO 一样,您可以将参数传递给内核。
MILO 必须告诉 Linux 内核这是什么类型的系统,有多少内存以及其中哪些内存是空闲的。它使用 HWRPB(硬件重启参数块)数据结构和相关的内存集群描述来完成此操作。这些数据结构和描述在控制权传递给 Linux 内核之前被放置在虚拟内存中的适当位置。