如何将FreeDOS作为一个嵌入式系统使用

422 阅读6分钟

FreeDOS网站说,大多数人使用FreeDOS有三个主要任务。

  1. 玩经典的DOS游戏
  2. 运行传统的DOS软件
  3. 运行嵌入式系统

但是,运行一个 "嵌入式 "系统是什么意思?

一个嵌入式系统基本上是一个非常小的系统,专门用于运行一个特定的任务。你可能认为今天的嵌入式系统是物联网(IoT)的一部分,包括传感器、恒温器和门铃摄像头。今天的许多嵌入式系统运行在Linux上。

但在很久以前,嵌入式系统要么运行在一个定制的、专有的平台上,要么运行在DOS上。其中一些基于DOS的嵌入式系统至今仍在运行,如收银机或电话专用分支交换(PBX)系统。在最近2017年的一个例子中,火车侦察员发现了一个俄罗斯电动火车控制系统(俄语:САВПЭ),该系统运行FreeDOS的特殊软件,用于控制和监测郊区火车的路线,并进行乘客广播。

在DOS上设置一个嵌入式系统需要定义一个最小的DOS环境,以运行一个应用程序。幸运的是,建立一个最小的FreeDOS环境是相当容易的。从技术上讲,启动FreeDOS和运行DOS应用程序所需要的只是内核和一个FDCONFIG.SYS 配置文件。

安装一个最小的系统

我们可以通过使用QEMU模拟器来模拟一个专用的、最小的FreeDOS系统,为了更准确地反映一个嵌入式系统,我将定义一个只有8兆内存的虚拟机和一个仅有2兆的虚拟硬盘。

为了创建这个小小的虚拟硬盘,我将使用这个qemu-img 命令来定义一个2兆字节的文件。

$ qemu-img create tiny.img 2M
Formatting 'tiny.img', fmt=raw size=2097152

这个命令行定义了一个32位的 "i386 "CPU,内存为8兆字节,使用2兆字节的tiny.img 文件作为硬盘镜像,FreeDOS 1.3 RC4 LiveCD作为CD-ROM介质。我们还将设置机器从CD-ROM驱动器(-boot order=d )启动,尽管我们只需要安装。在我们设置好一切之后,我们将从硬盘启动完成的嵌入式系统。

qemu-system-i386 -m 8 -hda tiny.img -cdrom FD13LIVE.iso -boot order=d

使用 "实时环境模式 "启动系统--这为我们提供了一个正在运行的FreeDOS系统,我们可以用它将一个最小的FreeDOS转移到硬盘上。

我们需要在虚拟硬盘上为我们的程序创建一个分区。要做到这一点,从命令行中运行FDISK程序。FDISK是FreeDOS上的标准固定磁盘工具。使用FDISK来创建一个跨越整个(2兆)硬盘的单一硬盘分区。

但是,在你重新启动之前,FreeDOS不会看到新的硬盘分区--FreeDOS只在启动时读取硬盘的详细信息。退出FDISK并重新启动,你就可以进行下一步了。

重启后,你需要在新硬盘上创建一个DOS文件系统。由于只有一个虚拟硬盘,FreeDOS将把它识别为C: 。你可以用FORMAT命令在C: 上创建一个DOS文件系统。/S 选项将操作系统文件(内核,加上COMMAND.COM shell的副本)转移到新的驱动器上。

现在你已经创建了驱动器并格式化了它,你可以安装将在嵌入式系统上运行的应用程序。

安装专用应用程序

一个嵌入式系统实际上只是一个在专用系统上运行的单一用途的应用程序。这种应用程序通常是为它要控制的系统定制的,如收银机、显示终端或控制环境。在这个演示中,让我们使用FreeDOS 1.3 RC4安装光盘中的一个程序。它需要小到足以装入我们为它创建的2兆字节的小硬盘。它可以是任何东西--所以只是为了好玩,让我们把它变成一个游戏。

FreeDOS 1.3 RC4包括几个有趣的游戏。我喜欢的一个游戏是一个叫做 "简单塞内 "的棋盘游戏。它是基于Senet,一种古埃及的棋盘游戏。这个游戏的细节对这个演示并不重要,只是我们要安装它并把它设置为嵌入式系统的专用应用程序。

要安装该应用程序,请进入FreeDOS 1.3 RC4 LiveCD的\PACKAGES\GAMES 目录。你会看到一长串的软件包,我们要的是SENET.ZIP

要将Simple Senet软件包解压到虚拟硬盘上,请使用UNZIP 命令。所有的FreeDOS软件包都是Zip文件,所以你可以使用任何与Zip兼容的存档工具来管理它们。FreeDOS 1.3 RC4包括ZIP 来创建Zip档案,以及UNZIP 来提取Zip档案。两者都是来自Info-Zip项目

UNZIP SENET.ZIP -d C:\FDOS

通常情况下,使用UNZIP 将提取当前目录下的Zip文件。命令行末尾的-d C:\FDOS 选项告诉UNZIP 将Zip文件解压缩到C:\FDOS 目录中。(-d 意思是 "目的地"。)

为了在嵌入式系统启动时运行简单的Senet游戏,我们需要告诉FreeDOS使用Senet作为系统 "外壳"。FreeDOS的默认shell是COMMAND.COM ,但是你可以使用FDCONFIG.SYS 内核配置文件中的SHELL= 指令定义一个不同的shell程序。我们可以使用FreeDOS Edit来创建新的C:\FDCONFIG.SYS 文件。

如果你需要定义其他参数来支持嵌入式系统,你可以将这些参数添加到FDCONFIG.SYS 文件中。例如,你可能需要用SET 动作来设置环境变量,或者用FILES=BUFFERS= 语句来调整FreeDOS内核。

运行嵌入式系统

在完全定义了嵌入式系统之后,我们现在可以重新启动机器来运行嵌入式应用程序。运行一个嵌入式系统通常只需要有限的资源,所以在这个演示中,我们将调整QEMU的命令行,只从硬盘驱动器(-boot order=c )启动,而不定义光盘驱动器。

qemu-system-i386 -m 8 -hda tiny.img -boot order=c

当FreeDOS内核启动时,它读取FDCONFIG.SYS 文件作为其启动参数。然后,它使用SHELL= 行运行 shell。这就自动运行了Simple Senet游戏。

我们用Simple Senet来演示如何在FreeDOS上建立一个嵌入式系统。根据你的需要,你可以使用你喜欢的任何独立的应用程序。使用FDCONFIG.SYS 中的SHELL= 行将其定义为DOS外壳,FreeDOS将在启动时自动启动该应用程序。

然而,这里有一个限制。嵌入式系统通常不需要退出到命令提示符,所以这些专用应用程序通常不允许用户退出到DOS。如果你设法退出嵌入式应用程序,你可能会看到一个 "坏的或缺少命令解释器 "的提示,在那里你需要输入一个新外壳的完整路径。对于一个以用户为中心的桌面系统,这将是一个问题。但在一个专门做一项工作的嵌入式系统上,无论如何你都不应该需要退出。