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 consolettyS0,115200这里有个隐藏技巧如果内核启动卡住可以在g命令后加-s参数进入单步模式。有次调试驱动时我就是靠这个发现内核卡在SD卡初始化阶段。另外initrd不是必须的如果是内置根文件系统的内核可以直接g启动。2.2 U盘启动的避坑指南比起网络加载U盘启动更依赖硬件兼容性。首先要用devls确认U盘设备名通常是usb0或usb1。加载命令看起来简单load (usb0,0)/vmlinux但实际使用时我踩过两个坑一是U盘必须FAT32格式NTFS会识别失败二是分区表必须是MBRGPT分区会报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 consolettyS0,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 16d2查看半字d2 0x80000000 16d4查看字d4 0x80000000 16d8查看双字d8 0x80000000 16有次排查内存泄漏就是靠d4发现某地址数据异常增长。修改内存同样方便比如改GPIO状态m4 0xbfe10420 0x000000014.2 设备树动态调试龙芯的设备树操作简直黑科技print_dtb /soc/uart0xBFE20000能直接打印串口节点所有属性。更厉害的是支持运行时修改rm_dtb_node /soc/usb0xBFE10000这个在调试USB驱动时帮了大忙不用重新烧写就能禁用问题设备。5. 实战故障排查案例上周就遇到个典型问题板子启动卡在Starting kernel...。用以下步骤定位单步执行发现卡在内存初始化print_dtb查看发现内存参数错误通过m8命令修正内存大小重新烧写正确dtb文件整个过程不用接JTAG全靠PMON命令搞定。另外分享个冷知识PMON的ping命令其实能测网络延迟有时候比Linux下的ping还准。
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 consolettyS0,115200这里有个隐藏技巧如果内核启动卡住可以在g命令后加-s参数进入单步模式。有次调试驱动时我就是靠这个发现内核卡在SD卡初始化阶段。另外initrd不是必须的如果是内置根文件系统的内核可以直接g启动。2.2 U盘启动的避坑指南比起网络加载U盘启动更依赖硬件兼容性。首先要用devls确认U盘设备名通常是usb0或usb1。加载命令看起来简单load (usb0,0)/vmlinux但实际使用时我踩过两个坑一是U盘必须FAT32格式NTFS会识别失败二是分区表必须是MBRGPT分区会报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 consolettyS0,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 16d2查看半字d2 0x80000000 16d4查看字d4 0x80000000 16d8查看双字d8 0x80000000 16有次排查内存泄漏就是靠d4发现某地址数据异常增长。修改内存同样方便比如改GPIO状态m4 0xbfe10420 0x000000014.2 设备树动态调试龙芯的设备树操作简直黑科技print_dtb /soc/uart0xBFE20000能直接打印串口节点所有属性。更厉害的是支持运行时修改rm_dtb_node /soc/usb0xBFE10000这个在调试USB驱动时帮了大忙不用重新烧写就能禁用问题设备。5. 实战故障排查案例上周就遇到个典型问题板子启动卡在Starting kernel...。用以下步骤定位单步执行发现卡在内存初始化print_dtb查看发现内存参数错误通过m8命令修正内存大小重新烧写正确dtb文件整个过程不用接JTAG全靠PMON命令搞定。另外分享个冷知识PMON的ping命令其实能测网络延迟有时候比Linux下的ping还准。