LoongSon——PMON实战命令手册:从启动到调试
1. PMON基础入门:龙芯平台的启动管家
第一次接触龙芯开发板时,看到黑屏上跳动的PMON>提示符,我整个人都是懵的。这玩意儿既不像BIOS也不像U-Boot,输入help还全是晦涩的缩写命令。后来才发现,PMON其实是龙芯平台的"大管家",从硬件初始化到内核加载全都归它管。
PMON全称Processor Monitor,是龙芯处理器专属的Bootloader。和常见的U-Boot不同,它直接内嵌在处理器内部,上电后第一个跑的就是它。我经手过的龙芯2K1000、3A4000开发板,启动时都会先进入这个蓝底白字的界面。最神奇的是它支持完整的命令行交互,不仅能加载内核,还能直接操作内存、修改设备树,甚至自带网络协议栈。
这里有个新手容易踩的坑:PMON的命令风格特别像Unix,但又有自己的"方言"。比如查看内存不是用md而是用d系列命令,修改环境变量不是用printenv/setenv而是直接用set。刚开始我总把U-Boot的习惯带过来,结果各种报错。后来总结了个规律——所有命令都不超过3个字母,功能越基础命令越短。
2. 系统启动全流程实战
2.1 网络加载内核的三种姿势
最常用的启动方式莫过于网络加载了,特别是在调试阶段。我习惯先用devls确认网卡设备名,龙芯板子一般显示为syn0或rtl0。设置IP只需要一句:
ifaddr syn0 192.168.1.100接着就是经典的tftp三部曲:
load tftp://192.168.1.1/vmlinux initrd tftp://192.168.1.1/initrd.gz g console=ttyS0,115200这里有个隐藏技巧:如果内核启动卡住,可以在g命令后加-s参数进入单步模式。有次调试驱动时,我就是靠这个发现内核卡在SD卡初始化阶段。另外,initrd不是必须的,如果是内置根文件系统的内核可以直接g启动。
2.2 U盘启动的避坑指南
比起网络加载,U盘启动更依赖硬件兼容性。首先要用devls确认U盘设备名,通常是usb0或usb1。加载命令看起来简单:
load (usb0,0)/vmlinux但实际使用时我踩过两个坑:一是U盘必须FAT32格式,NTFS会识别失败;二是分区表必须是MBR,GPT分区会报"invalid device"。建议专门准备个老式U盘做启动盘,新买的USB3.0盘反而容易翻车。
3. 固件烧写的正确姿势
3.1 NAND Flash操作三板斧
给龙芯板烧写系统要格外小心,我见过有人误操作把整片Flash擦成砖。安全流程应该是:
- 查看分区表:
mtdparts- 擦除分区(一定要带r后缀跳过坏块):
mtd_erase /dev/mtd0r- 烧写内核:
devcp tftp://192.168.1.1/vmlinux /dev/mtd0特别注意:mtd_erase不带r参数会强制擦除坏块,可能导致Flash寿命缩短。有次批量烧写时偷懒没加r,结果有块板子的NAND直接写保护了,血的教训。
3.2 环境变量的妙用
PMON的环境变量比U-Boot灵活得多,可以存整个启动流程:
set al1 /dev/mtd0 set rd /dev/mtd1/initrd.gz set append "console=ttyS0,115200 root=/dev/mtdblock1"调试时我常建个debug变量组:
set debug_cmd "load tftp://192.168.1.1/vmlinux;g"需要时直接执行:
$debug_cmd4. 内存与设备树调试技巧
4.1 内存查看的四种武器
PMON的d系列命令堪称调试利器:
- d1查看字节:
d1 0x80000000 16 - d2查看半字:
d2 0x80000000 16 - d4查看字:
d4 0x80000000 16 - d8查看双字:
d8 0x80000000 16
有次排查内存泄漏,就是靠d4发现某地址数据异常增长。修改内存同样方便,比如改GPIO状态:
m4 0xbfe10420 0x000000014.2 设备树动态调试
龙芯的设备树操作简直黑科技:
print_dtb /soc/uart@0xBFE20000能直接打印串口节点所有属性。更厉害的是支持运行时修改:
rm_dtb_node /soc/usb@0xBFE10000这个在调试USB驱动时帮了大忙,不用重新烧写就能禁用问题设备。
5. 实战故障排查案例
上周就遇到个典型问题:板子启动卡在"Starting kernel..."。用以下步骤定位:
- 单步执行发现卡在内存初始化
- print_dtb查看发现内存参数错误
- 通过m8命令修正内存大小
- 重新烧写正确dtb文件
整个过程不用接JTAG,全靠PMON命令搞定。另外分享个冷知识:PMON的ping命令其实能测网络延迟,有时候比Linux下的ping还准。
