如何优雅地使用 PMON 2000
PMON2000(以下简称 PMON)是一种类似于 BIOS,UEFI 的全功能固件,除了在加电的时候初始化整个电脑,它也可以作为 Bootloader 以及 Debugger,主要应用在嵌入式平台上,然而实际上除了龙芯一家子并没有什么平台使用 PMON。
PMON 功能很多,但是看起来简陋得不行,也比较难用。以下根据我的个人使用经验,说一下如何优雅地使用 PMON。
启动
与 x86
平台上的 BIOS 不同,PMON 的启动方式比较诡异。简单讲是:
- 找到第一块硬盘的第一个分区
- 读取这个分区的
boot.cfg
文件,显示菜单 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 中有两种表达方式:
(wdX,Y)/path/to/file
X
表示第 X 块硬盘Y
表示第 Y 个分区
/dev/fs/<FSTYPE>@wdX/path/to/file
X
表示第 X 块硬盘<FSTYPE>
表示分区类型,比如ext2
,vfat
,iso9600
。(好诡异)
同样地,对于 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? 实际上是这样:boot
是 load
和 g
命令的组合(我猜是的)。换句话说,在 load
与 initrd
完了以后,要执行:
g # 也就是“go”的意思
来引导内核。这时候 PMON 又会给出一堆专(zhuang)业(bi)参数,不要以为死机,内核很快就会启动。
Debugger
没用过,不知道。
刷新固件
没试过,不知道。
杂项
poweroff
:关机halt
:挂起reboot
:重启main
:图形界面。PMON 其实是有图形界面的,但是功能也相当简陋,没有什么卵用。
参见
- Pmon常用命令 - 龙芯开源社区:这个讲得比较详细。