如何將 FreeDOS 作為嵌入式系統使用
![](https://linuxstory.org/wp-content/uploads/2024/06/134734s6zuftzjgtt8herp-800x400.jpg)
FreeDOS 網站 宣稱,大多數人使用 FreeDOS 來完成三項主要任務:
- 玩經典的 DOS 遊戲
- 運行老式的 DOS 軟體
- 運行一款嵌入式系統
但是,運行一個「嵌入式」系統的意義是什麼呢?
嵌入式系統基本上是一款非常小的系統,專用於運行一個特定的任務。你可以把現在的嵌入式系統當作是 物聯網(IoT)的一部分,這包括感測器、恆溫器和門鈴攝像頭。現在,很多嵌入式系統都是在 Linux 上運行的。
但是,在很久很久以前,嵌入式系統要麼在一個定製的專有的平台上運行,要麼在 DOS 系統上運行。在現在,一些基於 DOS 的嵌入式系統仍然在運行,例如,收銀機或電話專用交換機(PBX)系統。舉個例子來說,在 2017 年,酷愛列車的人發現一個正在運行 FreeDOS 的俄羅斯的電動列車控制系統 (俄語: САВПЭ),它使用特殊的軟體來控制和監控郊區列車的線路,並發布乘客通告。
在 DOS 上建立一個嵌入式系統需要定義一個最小化的 DOS 環境來運行單個應用程序。幸運的是,設置一個最小化的 FreeDOS 環境是非常容易的。從技術上來說,啟動 FreeDOS 並運行 DOS 應用程序僅需要內核和一個 FDCONFIG.SYS
配置文件。
安裝一款最小化的系統
我們可以使用 QEMU 模擬器來模擬一個專用的、最小化的 FreeDOS 系統,並給它分配很少的資源。為了更準確地反映一個嵌入式系統,我將定義一個只有 8 MB 的存儲器和僅僅有 2 MB 的硬碟驅動器的虛擬機。
為創建這個微小的虛擬硬碟,我將使用這個 qemu-img
命令來定義一個 2M 的文件:
$ qemu-img create tiny.img 2M
Formatting 'tiny.img', fmt=raw size=2097152
下面的這行命令定義了一個 32 位的 「i386」 CPU、8MB 的存儲器,使用 2MB 的 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 轉移到硬碟上。
![embedded setup](/data/attachment/album/202111/24/134748ddur1k49tzrj1ruk.png "Boot into the LiveCD environment")
啟動到 LiveCD 環境之中(Jim Hall, CC-BY SA 4.0)
我們需要在虛擬硬碟驅動器上為我們的程序創建一個分區。為此,從命令行中運行 FDISK
程序。FDISK
是 FreeDOS 上的一個標準的 磁碟分區 實用程序。使用 FDISK
來創建一個單個硬碟驅動器分區,佔用整個(2 MB)硬碟驅動器。
![embedded setup](/data/attachment/album/202111/24/134748oihhkbbyszibsb8e.png "FDISK, after creating the 2 megabyte partition")
FDISK,在創建 2 MB 分區後(Jim Hall, CC-BY SA 4.0)
但是,在你重新啟動 FreeDOS 之前,FreeDOS 不會看到新的硬碟驅動器分區 — FreeDOS 僅在啟動時讀取硬碟詳細信息。退出 FDISK
,並重新啟動 FreeDOS 。
在重新啟動後,你需要在新的硬碟驅動器上創建一個 DOS 文件系統。因為這裡只有一個虛擬硬碟,FreeDOS 將識別其為 C:
驅動器。你可以使用 FORMAT
命令來在 C:
驅動器上創建一個 DOS 文件系統。使用 /S
選項將把操作系統文件(內核,外加一個 COMMAND.COM
shell 的副本)轉移到新的驅動器上。
![embedded setup](/data/attachment/album/202111/24/134748ebaai9w9vinpn09e.png "Format the new drive to create a DOS filesystem")
格式化新的驅動器來創建一個 DOS 文件系統(Jim Hall, CC-BY SA 4.0) 你已經創建了硬碟驅動器並將其格式化,現在,你可以安裝應用程序,這些應用程序是將會在新安裝的嵌入式系統上運行的。
安裝專用的應用程序
嵌入式系統實際上只是一個運行在一個專用系統上的單一用途的應用程序。這些應用程序通常是為其將要控制的系統而自定義構建的,例如,一台收銀機、顯示終端、或控制環境。在這個演示中,讓我們使用一個來自 FreeDOS 1.3 RC4 安裝光碟中的程序。它需要足夠小,以適應我們為其創建的 2 MB 微型硬碟驅動器。這可以是任何東西,所以,為了好玩,讓我們把它變成一個遊戲。
FreeDOS 1.3 RC4 包含一些有趣的遊戲。我喜歡的一個遊戲是一個名稱為 「Simple Senet」 的棋類遊戲。它是一個基於 Senet 的古埃及棋類遊戲。遊戲的細節對這個演示並不重要,我們將安裝它,並將其設置為嵌入式系統的專業應用程序。
為安裝應用程序,在 FreeDOS 1.3 RC4 LiveCD 上,進入 PACKAGESGAMES
目錄。你將在其中看到一個很長的軟體包列表,而我們想要的 SENET.ZIP
。
![embedded setup](/data/attachment/album/202111/24/134748s4caqvbowzvn4ggq.png "A list of game packages from FreeDOS 1.3 RC4")
來自 FreeDOS 1.3 RC4 的一個遊戲軟體包列表(Jim Hall, CC-BY SA 4.0)
為解壓縮 「Simple Senet」 軟體包到虛擬硬碟上,使用 UNZIP
命令。所有的 FreeDOS 軟體包都是 Zip 文件,因此,你可以使用任意與 Zip 兼容的檔案實用程序來管理它們。FreeeDOS 1.3 RC4 包含創建 Zip 檔案文件的 ZIP
和提取 Zip 檔案文件的 UNZIP
。它們都來自 Info-Zip 項目 。
UNZIP SENET.ZIP -d C:FDOS
通常,使用 UNZIP
來提取 Zip 文件到當前目錄中。在命令行結尾的 -d C:FDOS
選項將告訴 UNZIP
來提取 Zip 文件到 C:FDOS
目錄之中。(-d
指的是「目的地」)
![embedded setup](/data/attachment/album/202111/24/134749h89nfgt9y9qqyntt.png "Unzipping the Simple Senet game")
解壓縮 Simple Senet 遊戲(Jim Hall, CC-BY SA 4.0)
為了讓嵌入式系統啟動時運行 「Simple Senet」 遊戲,我們需要告訴 FreeDOS 來使用 Senet 作為系統的 「shell」 。 默認的 FreeDOS 的 shell 是 COMMAND.COM
程序,但是,你可以在 FDCONFIG.SYS
內核配置文件中使用 SHELL=
指令來定義一個不同的 shell 程序。我們可以使用 FreeDOS 的 Edit 來創建新的 C:FDCONFIG.SYS
文件。
![Embedded edit senet](/data/attachment/album/202111/24/134749af8lji8lfcz3jp7n.png "Embedded edit senet")
(Jim Hall, CC-BY SA 4.0)
如果你需要定義其它的參數來支持嵌入式系統,你可以將其添加到 FDCONFIG.SYS
文件之中。例如,你可能需要使用 SET
動作來設置環境變數,或者使用 FILES=
或 BUFFERS=
語句來調整 FreeDOS 內核。
運行嵌入式系統
在全面地完成嵌入式系統的定義之後,現在,我們可以重新啟動計算機來運行嵌入式應用程序。運行一個嵌入式系統通常僅需要有限的資源,因此,在這個演示中,我們需要調整 QEMU 命令行來只從硬碟驅動器(-boot order=c
)中啟動,而不再定義一個 CD-ROM 驅動器:
qemu-system-i386 -m 8 -hda tiny.img -boot order=c
當 FreeDOS 內核啟動時,它將讀取 FDCONFIG.SYS
文件以獲取啟動參數。然後,它將使用 SHELL=
行的定義來運行 shell 。這將自動地運行 「Simple Senet」 遊戲。
![embedded setup](/data/attachment/album/202111/24/134749ys2znchnc333s307.png "Running Simple Senet as an embedded system")
作為一個嵌入式系統運行 Simple Senet(Jim Hall, CC-BY SA 4.0)
我們已經使用了 「Simple Senet」 來演示如何在 FreeDOS 上設置一個嵌入式系統。根據你的需要,你可以使用任何你喜歡的獨立應用程序。在 FDCONFIG.SYS
中使用 SHELL=
行將其定義為 DOS 的 shell ,FreeDOS 將在啟動時自動地啟動該應用程序。
不過,在這裡有一個限制。嵌入式系統通常不需要退回到一個命令行提示符之中,因此這些專用應用程序通常不允許用戶退出到 DOS 之中。如果你設法退出了嵌入式應用程序,你可能會看到一個 「Bad or missing Command Interpreter」 的提示,你將需要在其中輸入一個新的 shell 的完整路徑。對於一個以用戶為中心的桌面系統來說,這將是一個問題。但是在一個嵌入式系統上,它只專註執行一種工作的,那麼,你也永遠不需要退出嵌入式應用程序。
via: https://opensource.com/article/21/6/freedos-embedded-system
作者:Jim Hall 選題:lujun9972 譯者:robsean 校對:wxy
本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive