前提:
Linux内核Debian系统开发板,痛点是无外接显示屏,仅靠ModeXterm之类的终端进行串口和网口远程访问,系统已具有UBoot工具在开机阶段可按任意键进入uboot命令模式,错误修改了/etc/rc.local文件导致卡在了启动流程。由于是公司不知道屯了多久的板子,只有官方网站,没有开发光盘。我是小白,完全是误打误撞才用这个方式修复的。
一、进入U-Boot
使用断电、复位按键等方式重启系统,注意终端工具中打印倒计时时按下任意键,即可进入U-Boot命令模式:
二、找到文件系统地址
U-Boot的命令可适用两种格式文件系统,即fat和etx,没有用对命令是会读不到文件的。
U-Boot能够对ext2/3/4以及fat文件系统设备进行访问, 可使用fstype命令判断存储介质分区使用的是什么类型的文件系统(但是我的U-Boot里并没有这个命令)。
fatls | 查看存储设备的fat分区里的内容 |
ext2ls | 查看存储设备的ext2分区里的内容 |
ext4ls | 查看存储设备的ext4分区里的内容 |
好在我知道我的是Debian系统,ext4分区对应的就是Debian根文件系统。于是使用遍历法很快找到了我的文件位置:
三、将要修改的文件读取到内存中
fatload | 从fat分区里读出文件到指定的内存地址 |
ext2load | 从ext2分区里读出文件到指定的内存地址 |
ext4load | 从ext4分区里读出文件到指定的内存地址 |
要修改文件,就要先读取文件到DRAM 中,这个内存地址我也不知道有什么规律,反正不成功就换一个地址:
请记住这个文件的字节大小,到后面保存文件的时候要用到。
四、查看文本对应的内存地址
md 内存地址 //用于查看内存地址上的值
用法:
md.b 0x40008000 100 //从内存地址0x40008000开始,查看0x100个字节并输出值
md.w 0x40008000 100 //从内存地址0x40008000开始,查看0x100个16位值并输出值
md.l 0x40008000 100 //从内存地址0x40008000开始,查看0x100个32位值并输出值
本人的文件:
整个文件实际上是从0x87800000地址开始的,这里设置了从中间开始读取255个字节。
五、修改内存值
mw //用于修改内存地址上的值
用法:
mw.b 0x40008000 0xab 100 //从内存地址0x40008000开始的0x100字节空间,设值为0xab
mw.w 0x40008000 0xabcd 100 //从内存地址0x40008000开始的0x200字节空间,每16位值设为0xabcd
mw.l 0x40008000 0xabcdef88 100 //从内存地址0x40008000开始的0x400字节空间,每32位值设为0xabcdef88
使用md.w命令,修改文件字符对应的地址内存值,我需要删除这段文字,即从0x878001ab地址开始,往后的33个值都更改为0x0a或0xff。
mw.b 0x878001ab 0a 0x21
然后重复md.b指令查看自己是否更改正确,若是发现改错了,可以重复步骤三重新打开文件。
六、将文件从内存覆盖到文件系统
fatwrite | 把内存上的数据存储到fat分区的一个文件里 |
ext2write | 把内存上的数据存储到ext2分区的一个文件里 |
ext4write | 把内存上的数据存储到ext4分区的一个文件里 |
我们要把内存中0x87800000地址开始的470字节的文件储存到文件系统:
这样就会将原先的rc.local覆盖掉。如果你写的是其他文件地址,就会覆盖其他的文件中的470个字节,或者这个路径没有这个文件的时候,会新建一个文件。
七、重启系统
rc.local文件被错误修改的问题已经解决了,使用uboot::reset命令重启系统吧。