PMON2000(以下简称 PMON)是一种类似于 BIOS,UEFI 的全功能固件,除了在加电的时候初始化整个电脑,它也可以作为 Bootloader 以及 Debugger,主要应用在嵌入式平台上,然而实际上除了龙芯一家子并没有什么平台使用 PMON。

PMON 功能很多,但是看起来简陋得不行,也比较难用。以下根据我的个人使用经验,说一下如何优雅地使用 PMON。

启动

x86 平台上的 BIOS 不同,PMON 的启动方式比较诡异。简单讲是:

  1. 找到第一块硬盘的第一个分区
  2. 读取这个分区的 boot.cfg 文件,显示菜单
  3. load 选择菜单项的内核和初始化内存盘,直接上操作系统

注意,MBR 看起来被优雅地绕过了;但是,这个分区表还得是 MBR 格式的。PMON 并不认 GPT 硬盘——换句话说,PMON 确实读取了 MBR,但是没有直接执行 MBR 的前 448 字节代码,因为它本身就可以充当 Bootloader 的角色。

所以,要用 PMON 引导系统,首要的条件是硬盘上的第一个分区有 boot.cfg,和别的嵌入式平台没什么两样——第一个分区是 /boot 就可以了。但是,PMON 只认两种文件系统,一种是 vfat,另一种是 ext2/3。注意,ext4 不受支持

我分了一个 ext3 的分区并挂载到 /boot但是在 PMON 内部,仍然以 ext2 表示一个 ext 分区。

引导方式

PMON 从固件层面支持多种引导方式:从硬盘启动,从 USB 启动,以及从网络启动(也就是说 PMON 是可以初始化网卡并联网的)。对于硬盘上的一个特定分区的特定文件,在 PMON 中有两种表达方式:

  1. (wdX,Y)/path/to/file
    • X 表示第 X 块硬盘
    • Y 表示第 Y 个分区
  2. /dev/fs/<FSTYPE>@wdX/path/to/file
    • X 表示第 X 块硬盘
    • <FSTYPE> 表示分区类型,比如 ext2vfatiso9600(好诡异)

同样地,对于 USB 设备,只需要把 wd 替换成 usb 即可。机器上有什么设备呢?要查看设备,输入:

devls

按着上面给出的设备名称输入即可。

网络启动我没试过,且不论。

Bootloader

PMON 的一个特色就是可以直接当引导器使用,可以直接起 Linux 内核;不过这个引导器的加载速度比较慢,不够 GRUB 快;而且根据这篇帖子(44 楼:“这说明MIPS的vmlinuz自解压代码或者PMON加载代码有问题”),目前 PMON 似乎还有一些奇奇怪怪的 BUG。不过绕开 GRUB 这个大块头也好。

首先要看看内核在哪,以及它的文件名。总不能盲打吧,难度有点大(我一开始确实是盲打)。输入:

ls

然后好像列出了一些奇奇怪怪的东西。有趣的是,ls 不是列出文件命令,而是调试器的列出符号(List Symbols)命令。这一点坑了不少人。要列出文件,输入:

dir (wdX,Y)/
# 或者
dir /dev/fs/<FSTYPE>@wdX/path/to/file

要载入内核,输入:

load (wdX,Y)/path/to/vmlinuz
# 或者
load /dev/fs/<FSTYPE>@wdX/path/to/vmlinuz

要载入初始化内存盘(initrd),输入:

initrd (wdX,Y)/path/to/initrd.img
# 或者
initrd /dev/fs/<FSTYPE>@wdX/path/to/initrd.img

PMON 会给出一些具体的专(zhuang)业(bi)参数,比如文件被 Load 到了哪个内存地址上。这时候我们要执行内核了:

PMON> boot
boot what?
PMON>

Excuse me? 实际上是这样:bootloadg 命令的组合(我猜是的)。换句话说,在 loadinitrd 完了以后,要执行:

g # 也就是“go”的意思

来引导内核。这时候 PMON 又会给出一堆专(zhuang)业(bi)参数,不要以为死机,内核很快就会启动。

Debugger

没用过,不知道。

刷新固件

没试过,不知道。

杂项

  • poweroff:关机
  • halt:挂起
  • reboot:重启
  • main:图形界面。PMON 其实是有图形界面的,但是功能也相当简陋,没有什么卵用。

参见