最近在调试龙芯2K0300开发板时遇到一个典型需求:需要取消PMON固件默认的Linux系统自动启动行为。这个需求在嵌入式开发、系统定制和产线测试场景中非常常见。PMON作为龙芯处理器常用的Bootloader,其自动启动机制虽然对普通用户友好,但在开发调试阶段反而会成为阻碍。
我手头的这块2K0300开发板每次上电都会自动加载内核镜像,这对于需要频繁进入PMON命令行进行底层操作的情况非常不便。特别是在以下场景中:
龙芯的PMON本质上是一个增强版的Bootloader,其启动流程可以分为几个关键阶段:
在2K0300的默认配置中,PMON会在完成硬件初始化后,自动从预设存储设备加载vmlinux内核镜像。这个行为由内置的启动脚本控制,通常存储在/dev/mtd1分区。
通过PMON的set命令可以查看影响启动行为的关键参数:
code复制PMON> set
al=(wd0,0)/boot/vmlinux
auto=1
baudrate=115200
bootdev=wd0
其中auto=1就是控制自动启动的关键参数:
最快捷的方式是在启动过程中按下任意键中断启动流程:
这种方法适合临时调试,但每次重启都需要手动干预,不适合长期使用。
更彻底的解决方案是修改PMON的NVRAM配置:
code复制PMON> set auto 0
PMON> set al ""
PMON> save
关键操作说明:
set auto 0 - 禁用自动启动功能set al "" - 清空自动加载的内核路径save - 将配置写入非易失性存储修改后可以通过reset命令重启验证效果。
对于需要产品级定制的场景,可以重新编译PMON源码:
bash复制git clone http://www.loongnix.org/pmon
cd pmon-zloader
c复制// targets/LS2K0300/conf/config.ls2k
#define AUTOBOOT_DEFAULT 0 // 修改默认autoboot为禁用
bash复制make TARGET=ls2k0300
flashcp pmon.bin /dev/mtd0
问题1:save命令执行后配置不生效
cat /proc/mtdflash_eraseall /dev/mtd1pmon_upgrade -f pmon.bin问题2:自动启动意外恢复
grep -r "set auto" /dev/mtd*code复制PMON> set debug 3
PMON> reset
通过提高调试级别可以查看详细的启动过程信息。
/boot目录下创建init.sh,添加:bash复制#!/bin/sh
set auto 0
save
code复制PMON> env save /tmp/env.bak
PMON> env restore /tmp/env.bak
在批量生产测试中,可以结合自动启动和手动模式:
bash复制PMON> boot -f tftp://192.168.1.100/test_kernel
利用PMON的脚本功能实现多系统选择:
code复制# /boot/select.sh
echo "1) Production System"
echo "2) Test System"
read choice
case $choice in
1) boot -f (wd0,0)/boot/vmlinux-prod ;;
2) boot -f (wd0,0)/boot/vmlinux-test ;;
esac
在PMON中配置:
code复制PMON> set bootcmd "source /boot/select.sh"
PMON> save
code复制PMON> env save /dev/sda1/env_backup.bin
谨慎使用flash操作命令,错误的擦除操作可能导致设备变砖
生产环境中建议保留串口访问权限控制:
code复制PMON> set password $1$xyz123
我在实际项目中发现,龙芯2K0300的PMON版本差异较大,建议在操作前先确认固件版本:
code复制PMON> version
对于2018年之前的旧版本,可能需要使用不同的命令语法。遇到问题时,查看硬件手册中的PMON章节往往比网上搜索更有效。