如何將 FreeDOS 作為嵌入式系統(tǒng)使用
現(xiàn)在,很多嵌入式系統(tǒng)都是在 Linux 上運行的。但是,在很久很久以前,嵌入式系統(tǒng)要么在一個定制的專有的平臺上運行,要么在 DOS 上運行。
FreeDOS 網(wǎng)站 宣稱,大多數(shù)人使用 FreeDOS 來完成三項主要任務(wù):
- 玩經(jīng)典的 DOS 游戲
- 運行老式的 DOS 軟件
- 運行一款嵌入式系統(tǒng)
但是,運行一個“嵌入式”系統(tǒng)的意義是什么呢?
嵌入式系統(tǒng)基本上是一款非常小的系統(tǒng),專用于運行一個特定的任務(wù)。你可以把現(xiàn)在的嵌入式系統(tǒng)當作是 物聯(lián)網(wǎng)(IoT)的一部分,這包括傳感器、恒溫器和門鈴攝像頭?,F(xiàn)在,很多嵌入式系統(tǒng)都是在 Linux 上運行的。
但是,在很久很久以前,嵌入式系統(tǒng)要么在一個定制的專有的平臺上運行,要么在 DOS 系統(tǒng)上運行。在現(xiàn)在,一些基于 DOS 的嵌入式系統(tǒng)仍然在運行,例如,收銀機或電話專用交換機(PBX)系統(tǒng)。舉個例子來說,在 2017 年,酷愛列車的人發(fā)現(xiàn)一個正在運行 FreeDOS 的俄羅斯的電動列車控制系統(tǒng) (俄語: САВПЭ),它使用特殊的軟件來控制和監(jiān)控郊區(qū)列車的線路,并發(fā)布乘客通告。
在 DOS 上建立一個嵌入式系統(tǒng)需要定義一個最小化的 DOS 環(huán)境來運行單個應(yīng)用程序。幸運的是,設(shè)置一個最小化的 FreeDOS 環(huán)境是非常容易的。從技術(shù)上來說,啟動 FreeDOS 并運行 DOS 應(yīng)用程序僅需要內(nèi)核和一個 FDCONFIG.SYS
配置文件。
安裝一款最小化的系統(tǒng)
我們可以使用 QEMU 仿真器來模擬一個專用的、最小化的 FreeDOS 系統(tǒng),并給它分配很少的資源。為了更準確地反映一個嵌入式系統(tǒng),我將定義一個只有 8 MB 的存儲器和僅僅有 2 MB 的硬盤驅(qū)動器的虛擬機。
為創(chuàng)建這個微小的虛擬硬盤,我將使用這個 qemu-img
命令來定義一個 2M 的文件:
$ qemu-img create tiny.img 2M
Formatting 'tiny.img', fmt=raw size=2097152
下面的這行命令定義了一個 32 位的 “i386” CPU、8MB 的存儲器,使用 2MB 的 tiny.img
文件作為硬盤驅(qū)動器鏡像,使用 FreeDOS 1.3 RC4 LiveCD 作為 CD-ROM 介質(zhì)。我們也將機器設(shè)置為從 CD-ROM 驅(qū)動器啟動(-boot order=d
),盡管我們只需要用它來安裝系統(tǒng)。在我們完成所有的設(shè)置后,我們將從該硬盤啟動完成的嵌入式系統(tǒng):
qemu-system-i386 -m 8 -hda tiny.img -cdrom FD13LIVE.iso -boot order=d
使用 “現(xiàn)場環(huán)境模式” 來啟動系統(tǒng),這將為我們提供一個正在運行的 FreeDOS 系統(tǒng),我們可以使用它來將一個最小化的 FreeDOS 轉(zhuǎn)移到硬盤上。
啟動到 LiveCD 環(huán)境之中(Jim Hall, CC-BY SA 4.0)
我們需要在虛擬硬盤驅(qū)動器上為我們的程序創(chuàng)建一個分區(qū)。為此,從命令行中運行 FDISK
程序。FDISK
是 FreeDOS 上的一個標準的 磁盤分區(qū) 實用程序。使用 FDISK
來創(chuàng)建一個單個硬盤驅(qū)動器分區(qū),占用整個(2 MB)硬盤驅(qū)動器。
FDISK,在創(chuàng)建 2 MB 分區(qū)后(Jim Hall, CC-BY SA 4.0)
但是,在你重新啟動 FreeDOS 之前,F(xiàn)reeDOS 不會看到新的硬盤驅(qū)動器分區(qū) — FreeDOS 僅在啟動時讀取硬盤詳細信息。退出 FDISK
,并重新啟動 FreeDOS 。
在重新啟動后,你需要在新的硬盤驅(qū)動器上創(chuàng)建一個 DOS 文件系統(tǒng)。因為這里只有一個虛擬硬盤,F(xiàn)reeDOS 將識別其為 C:
驅(qū)動器。你可以使用 FORMAT
命令來在 C:
驅(qū)動器上創(chuàng)建一個 DOS 文件系統(tǒng)。使用 /S
選項將把操作系統(tǒng)文件(內(nèi)核,外加一個 COMMAND.COM
shell 的副本)轉(zhuǎn)移到新的驅(qū)動器上。
格式化新的驅(qū)動器來創(chuàng)建一個 DOS 文件系統(tǒng)(Jim Hall, CC-BY SA 4.0) 你已經(jīng)創(chuàng)建了硬盤驅(qū)動器并將其格式化,現(xiàn)在,你可以安裝應(yīng)用程序,這些應(yīng)用程序是將會在新安裝的嵌入式系統(tǒng)上運行的。
安裝專用的應(yīng)用程序
嵌入式系統(tǒng)實際上只是一個運行在一個專用系統(tǒng)上的單一用途的應(yīng)用程序。這些應(yīng)用程序通常是為其將要控制的系統(tǒng)而自定義構(gòu)建的,例如,一臺收銀機、顯示終端、或控制環(huán)境。在這個演示中,讓我們使用一個來自 FreeDOS 1.3 RC4 安裝光盤中的程序。它需要足夠小,以適應(yīng)我們?yōu)槠鋭?chuàng)建的 2 MB 微型硬盤驅(qū)動器。這可以是任何東西,所以,為了好玩,讓我們把它變成一個游戲。
FreeDOS 1.3 RC4 包含一些有趣的游戲。我喜歡的一個游戲是一個名稱為 “Simple Senet” 的棋類游戲。它是一個基于 Senet 的古埃及棋類游戲。游戲的細節(jié)對這個演示并不重要,我們將安裝它,并將其設(shè)置為嵌入式系統(tǒng)的專業(yè)應(yīng)用程序。
為安裝應(yīng)用程序,在 FreeDOS 1.3 RC4 LiveCD 上,進入 \PACKAGES\GAMES
目錄。你將在其中看到一個很長的軟件包列表,而我們想要的 SENET.ZIP
。
來自 FreeDOS 1.3 RC4 的一個游戲軟件包列表(Jim Hall, CC-BY SA 4.0)
為解壓縮 “Simple Senet” 軟件包到虛擬硬盤上,使用 UNZIP
命令。所有的 FreeDOS 軟件包都是 Zip 文件,因此,你可以使用任意與 Zip 兼容的檔案實用程序來管理它們。FreeeDOS 1.3 RC4 包含創(chuàng)建 Zip 檔案文件的 ZIP
和提取 Zip 檔案文件的 UNZIP
。它們都來自 Info-Zip 項目 。
UNZIP SENET.ZIP -d C:\FDOS
通常,使用 UNZIP
來提取 Zip 文件到當前目錄中。在命令行結(jié)尾的 -d C:\FDOS
選項將告訴 UNZIP
來提取 Zip 文件到 C:\FDOS
目錄之中。(-d
指的是“目的地”)。
解壓縮 Simple Senet 游戲(Jim Hall, CC-BY SA 4.0)
為了讓嵌入式系統(tǒng)啟動時運行 “Simple Senet” 游戲,我們需要告訴 FreeDOS 來使用 Senet 作為系統(tǒng)的 “shell” 。 默認的 FreeDOS 的 shell 是 COMMAND.COM
程序,但是,你可以在 FDCONFIG.SYS
內(nèi)核配置文件中使用 SHELL=
指令來定義一個不同的 shell 程序。我們可以使用 FreeDOS 的 Edit 來創(chuàng)建新的 C:\FDCONFIG.SYS
文件。
(Jim Hall, CC-BY SA 4.0)
如果你需要定義其它的參數(shù)來支持嵌入式系統(tǒng),你可以將其添加到 FDCONFIG.SYS
文件之中。例如,你可能需要使用 SET
動作來設(shè)置環(huán)境變量,或者使用 FILES=
或 BUFFERS=
語句來調(diào)整 FreeDOS 內(nèi)核。
運行嵌入式系統(tǒng)
在全面地完成嵌入式系統(tǒng)的定義之后,現(xiàn)在,我們可以重新啟動計算機來運行嵌入式應(yīng)用程序。運行一個嵌入式系統(tǒng)通常僅需要有限的資源,因此,在這個演示中,我們需要調(diào)整 QEMU 命令行來只從硬盤驅(qū)動器(-boot order=c
)中啟動,而不再定義一個 CD-ROM 驅(qū)動器:
qemu-system-i386 -m 8 -hda tiny.img -boot order=c
當 FreeDOS 內(nèi)核啟動時,它將讀取 FDCONFIG.SYS
文件以獲取啟動參數(shù)。然后,它將使用 SHELL=
行的定義來運行 shell 。這將自動地運行 “Simple Senet” 游戲。
作為一個嵌入式系統(tǒng)運行 Simple Senet(Jim Hall, CC-BY SA 4.0)
我們已經(jīng)使用了 “Simple Senet” 來演示如何在 FreeDOS 上設(shè)置一個嵌入式系統(tǒng)。根據(jù)你的需要,你可以使用任何你喜歡的獨立應(yīng)用程序。在 FDCONFIG.SYS
中使用 SHELL=
行將其定義為 DOS 的 shell ,F(xiàn)reeDOS 將在啟動時自動地啟動該應(yīng)用程序。
不過,在這里有一個限制。嵌入式系統(tǒng)通常不需要退回到一個命令行提示符之中,因此這些專用應(yīng)用程序通常不允許用戶退出到 DOS 之中。如果你設(shè)法退出了嵌入式應(yīng)用程序,你可能會看到一個 “Bad or missing Command Interpreter” 的提示,你將需要在其中輸入一個新的 shell 的完整路徑。對于一個以用戶為中心的桌面系統(tǒng)來說,這將是一個問題。但是在一個嵌入式系統(tǒng)上,它只專注執(zhí)行一種工作的,那么,你也永遠不需要退出嵌入式應(yīng)用程序。