pmon 是一个兼有BIOS和bootloader部分功能的开放源码软件,多用于嵌入式系统。



与BIOS相比功能不足,与常见的bootloader 相比,功能要丰富的多。

基于龙芯的系统采用 pmon 作为类 BIOS 兼 bootloader,并做了很多完善工作。

其有如下主要特点:
     
     * 支持ext2 fat32 ram 文件系统
     * 支持网络引导(tftp),磁盘引导,flash 引导
     * 内建调试功能(强大,调试内核举重若轻)
     * USB 2.0 Mass Storage 支持
     * 支持MIPS、ARM、PowerPC 平台
     * BSD Licensed
     ...


以下结合实际,给出开发中常用的命令介绍

1. pmon 日常命令 

     a. load --- 加载文件
       
       load [-options] pathname

       -o offset     将文件加载到内存 load_address + offset 处
       -f addr         将文件加载到 flash 的地址 addr 处
       pathname     要加载的文件路径或URL

       其他选项 h load 查看


       例子:

       加载位于硬盘第一个分区的(pmon 只认第一个分区)内核:

           load /dev/fs/ext2@wd0/boot/vmlinux   # 第一个分区是ext2文件系统

           load /dev/fs/msdos@wd0/boot/vmlinux # 第一个分区是fat32文件系统(未测试)
     

       从远程tftp服务器上加载内核: (该功能在反复编译调试内核中很方便)

         load tftp://192.168.10.100/vmlinux   # 先要配置好网络


       其他格式:
           
       load /dev/fs/iso9660@cd0/boot/vmlinux
           load /dev/ram@address
           load /dev/ram@address,size
           load /dev/ram/logger

           这些在龙梦电脑上很少用到,不知有没有被支持(未测试)


         PS: 以上 wd0, cd0, ram 为pmon 对设备的命名,可以用 devls 命令查看他发现并支持
             的所有设备, 龙梦电脑上常见的设备为:

               wd0 --------- 磁盘
               rtl0 --------- 网卡
               usb0 --------- usb 存储设备

               cd0 --------- 光盘
               ram --------- 内存

               
   b. g ------ 执行程序

       g [-st] [-b addr] [-e addr] [-- args...]     

       当 load 完一个文件后, 通过 g 命令告诉 pmon 开始执行刚刚载人的文件


       例子:     

         g       # 从 epc 寄存器指定的地址处开始执行

           g -e addr # 从内存地址 addr 处开始执行

           g -e addr -b add2 # 从内存地址 addr 处开始执行, 在addr2处设置一个临时断点
                       # 在下一次执行挂起时删除该断点

           g console=tty root=/dev/hda1 # 从 epc 寄存器指定的地址处开始执行, 并将参数
                               # console=tty root=/dev/hda1 传递给程序(内核)


   c. devls ------- 显示设备

       devls [-a]

         例子:

           devls -a # 显示所有设备
   


     d. ifaddr ------ 配置网卡

       ifaddr ifname ipaddr[:ifparameters]

     其中 第二个字段可以为 ipaddr:netmask:broadcast:gateway

         例子:

           ifaddr rtl0 192.168.10.99 # 设置网卡 rtl0 的 IP 地址
           
           ifaddr rtl0 192.168.10.99:255.255.255.0::192.168.10.2 # 设置网卡 IP 地址和网关
     

     e. ping 

       ping 192.168.10.188 # 测试网络是否配置好

       给几个您可能感兴趣的参数

       -f         flood ping. Send packages as fast as possible
       -c n     send n packages and stop
       -s sz     size of packet expressed in bytes
       -i sec     wait sec seconds before sending next packet


     f. usb 相关命令

       usb help # 列出所有 usb 命令

       usb stor # 扫描所有 usb 存储设备

       usb info # 显示所有可用的 usb 存储设备
       
       usb dev   # 显示当前所用之 usb 存储设备

       usb dev usb0           # 设置当前所用之 usb 存储设备为usb0

       usb read 0x80000000 0x200 a # 从当前usb 存储设备中读取10个512 Byte的块到内存0x80000000 处


   g. h 

       帮助命令

       h     # 显示所有命令
         h ping # 显示命令 ping 的帮助信息


   h. reboot

       重启命令



下次写点开发调试用命令 :)


[补充]

A. PMON 更新命令

load -r -f bfc00000 tftp://SERVER_IP/gzrom.bin

load -r -f bfc00000 /dev/fs/ext2@wd0/gzrom.bin

可以从系统更新PMON:

modprobe physmap     [装上mtd驱动以识别eeprom]

mknod /dev/mtd0 c 90 0     [创建mtd设备文件]

cp gzrom.bin /dev/mtd0     [写入]
sync

reboot


B. 从 USB 光驱加载 kernel:

   load iso9660/usb0/path/to/kernel


C. 从 U 盘或者移动硬盘加载 kernel:

   load /dev/fs/ext2@usb0/path/to/kernel

   注意:如果根文件系统位于 U 盘或者移动硬盘的话,传给内核的参数应为:

     root=8:1 rootdelay=5



设置 PMON 开始自动加载的内核:

   set al /dev/fs/ext2@wd0/vmlinux-2.6.14-longmeng2e

该命令会将用户设置的值保存,重启后亦有效。