从 EPROM 启动 Linux
本文介绍了一种在没有硬盘的嵌入式系统中运行 Linux 的方法。所描述的应用是由波音飞行测试部门开发的监控和显示系统中的操作员界面。机载环境需要相当坚固耐用的设备,能够承受常见的电源中断。为了满足这些要求,我们决定构建一个不带硬盘的操作员界面。
基本概念包括从固态硬盘 (SSD) 中的Erasable Programmable Read-Only Memory (EPROM) 启动,将根文件系统从 EPROM 复制到 RAM 磁盘,从主机加载操作员界面软件并执行它。本文重点介绍系统如何工作的细节以及使用的开发技术。
所选硬件是基于 VME 的单板计算机 (SBC) 80486,配备 16M 内存、一个能够容纳 4Meg EPROM 的 PC104 SSD 电缆以及其他一些 PC104 板。此 SBC 具有使用 SSD 的内置 BIOS 支持。系统使用可编程键盘和标准 VGA 显示器。
对于启动,考虑了两个选项
启动 DOS,然后从 autoexec.bat 运行 loadlin 程序(加载 Linux)
安装 LILO 并直接启动 Linux
第二个选项的优点是启动时间稍短。但是,我们实现了第一个选项,因为我们想使用可编程键盘——用于编程键盘的软件在 DOS 下运行。
需要进行一些内核 hacking 才能使系统工作。 ramdisk.c 代码被更改为从任何块设备加载,而不仅仅是软盘(参见列表 1,ramdisk.c)。此外,还编写了一个新的块驱动程序以从 EPROM 设备读取(参见列表 2,epromdsk.c)。
在决定如何实现 EPROM 设备驱动程序时,第一个想法是在 EPROM 中创建一个磁盘映像。这将提供一个与 EPROM 大小相同的 RAM 磁盘,在本例中为 3.5MB(SSD 的 DOS 部分占用 1/2 MB)。相反,为了允许更大的 RAM 磁盘,使用了压缩磁盘映像。使用的压缩很简单——任何相同的扇区都只存储一次。这带来的主要优势是磁盘映像的空白区域不需要占用 EPROM 空间。列表 1 显示了使用的 SSD 磁盘压缩。
为了自动运行操作员界面应用程序,编写了一个程序来替换 getty。此程序 (dboot.c) 将为给定用户运行登录,并将 stdin、stdout 和 stderr 设置为指定的虚拟控制台。
启动顺序是
上电并运行内存测试
加载 DOS,它执行 AUTOEXEC.BAT
运行键盘编程应用程序
运行 loadlin——这从 DOS 磁盘读取 Linux 内核并执行它
Linux 内核接管
从 EPROM 磁盘加载 RAM 磁盘
将根文件系统切换到 RAM 磁盘
init 将读取 inittab,它执行 dboot 而不是 getty
操作员界面应用程序启动
在有趣的部分——弄清楚如何制作 EPROM 驱动程序以及如何启动系统——之后,必须完成更平凡的任务,即组装 EPROM 磁盘内容。这是使用开发磁盘完成的,该磁盘被分区如下
/dev/hda1 - 80MB “完整” Linux 系统
/dev/hda2 - 6MB EPROM 开发
/dev/hda3 - 20MB DOS 分区
LILO 用于允许启动 Linux 或 DOS。
编程 EPROM 是一项耗时的任务,应尽可能避免。因此,大多数开发都是使用磁盘完成的。
磁盘映像开发的第一个阶段是确定所需和期望的项目。第一步是提出一个最小系统,然后添加操作员界面所需的项目。由于不是 Unix 专家,因此提出最小系统最终成为一个反复试验的过程。我从我认为需要的开始,然后尝试运行它。当由于缺少程序或库而发生错误时,会添加该文件。这个过程一直持续到系统愉快地运行为止。
大部分工作是通过将文件从“完整” Linux 分区复制到 6MB 分区,启动 DOS 并使用 loadlin 行来完成的
loadlin zimage root=/dev/hda2 ro
一旦系统相当稳定,6MB 分区就被加载到 RAM 磁盘中。这与从 EPROM 加载 RAM 磁盘非常相似,但是由于没有编程 EPROM,因此开发速度更快。为了在不编程 EPROM 的情况下测试系统,系统启动 DOS 并使用以下行运行 loadlin
loadlin zimage root=/dev/hda2 ramdisk=6144 ro
由于对 ramdisk.c 的修改,/dev/hda2 磁盘映像被加载到 RAM 磁盘中,然后根文件系统切换到 RAM 磁盘。细化磁盘映像的过程一直持续到一切都“完美”为止。
编程(“刻录”)EPROM 的过程首先是通过 tar 归档小磁盘驱动器,然后将文件解压缩到干净(清零)的文件系统上。通过将文件系统放到干净的磁盘上,所有未使用的扇区都被清零,并且磁盘压缩工作(列表 1)。
要 tar 磁盘映像,启动“完整” Linux 分区,并挂载 6MB 分区。通过这样做,proc 文件系统不包含在 tar 中。可以使用以下命令
mount -t ext2 /dev/hda2 /mnt cd /mnt tar -cpf /tmp/eprom.tar *
为了创建(未压缩的)磁盘映像,我使用了另一台带有 6MB RAM 磁盘的机器和以下命令
dd if=/dev/zero of=/dev/ram count=12288 mke2fs /dev/ram 6144 mount -t ext2 /dev/ram /mnt cd /mnt tar -xpf ~/eprom.tar . dd if=/dev/ram of=~/eprom.dsk count=12288
这会创建一个文件 (eprom.dsk),它是磁盘的扇区到扇区映像。要编程到 EPROM 中的数据是压缩映像。这是通过一个程序 (med.c) 完成的,该程序读取磁盘映像 (eprom.dsk),运行磁盘压缩,并输出一个将编程到 EPROM 中的二进制文件 (eprom.img)。
med ~/eprom.dsk ~/eprom.img
然后将 EPROM 映像移动到 EPROM 编程器,并刻录映像。
幸运的是,SBC 随附了 SSD 实用程序来帮助构建磁盘映像。DOS SSD 磁盘中包含最少的文件:DOS 启动文件、command.com、autoexec.bat、键盘加载程序、loadlin 和 zImage。
Dave Bennett 在波音公司的商业飞行测试组“与计算机打交道”。不在工作时,他喜欢与他的另一半、两只猫、一群鱼和数百万酵母菌为伴。Dave 喜欢制作东西,其中一些在网页 www.halcyon.com/bennett 上有介绍。可以通过 bennett@halcyon.com 或 dave.bennett@boeing.com 联系到 Dave。