当前位置: 技术问答>linux和unix
bootloader高手请进,急啊!!!!!
来源: 互联网 发布时间:2017-03-04
本文导语: 正在改u-boot的代码,发现了奇怪的问题 1,步骤:我在代码中加入几条printf语句后,编译并烧写到板子上后,重启进入boot的命令行 现象:在命令行下任意输入某个命令后板子就挂掉了,串口上没有任何显示 ...
正在改u-boot的代码,发现了奇怪的问题
1,步骤:我在代码中加入几条printf语句后,编译并烧写到板子上后,重启进入boot的命令行
现象:在命令行下任意输入某个命令后板子就挂掉了,串口上没有任何显示
修改:如果将新加入的这几行printf语句注释掉后,就恢复正常了
2,步骤:在函数内调用某个函数后,此函数中也有新加入的printf语句,编译并烧写到板子上后,重启进入boot的命令行
现象:同上
修改:将该函数注释掉后,恢复正常
排除硬件问题,因为已经试过几块板子,都有这问题;会不会是堆栈或内存之类的问题呢?
总结:推断应该是板子出现异常,但是在挂掉板子前,底层没有打印任意信息,在加上手头上也没有仿真器,不能对问题进行定位,现在很是纠结。
希望有遇到过类似问题的朋友多多指教,弄了两天了,没什么头绪啊!
1,步骤:我在代码中加入几条printf语句后,编译并烧写到板子上后,重启进入boot的命令行
现象:在命令行下任意输入某个命令后板子就挂掉了,串口上没有任何显示
修改:如果将新加入的这几行printf语句注释掉后,就恢复正常了
2,步骤:在函数内调用某个函数后,此函数中也有新加入的printf语句,编译并烧写到板子上后,重启进入boot的命令行
现象:同上
修改:将该函数注释掉后,恢复正常
排除硬件问题,因为已经试过几块板子,都有这问题;会不会是堆栈或内存之类的问题呢?
总结:推断应该是板子出现异常,但是在挂掉板子前,底层没有打印任意信息,在加上手头上也没有仿真器,不能对问题进行定位,现在很是纠结。
希望有遇到过类似问题的朋友多多指教,弄了两天了,没什么头绪啊!
|
应该是内存越界了,也就是缓冲区溢出。
你可以做这样的测试:
将原来printf语句改成其他没用的语句,例如:n=1;i++之类的。
看看板子是否会挂掉。
如果同样会挂掉,则可能的问题如下:
1、代码的其他部分有内存溢出之类的Bug,你添加了这些指令后,使得某处内存正好溢出。(这样的问题比较难排查。)排除的方法比较简单:在程序其他任意地方(最好是不同的函数层次中)加入这样的没用的语句,如果每次加入哪怕一条语句都会挂掉的话,就可以基本排除是内存溢出。
2、硬件设计可能有bug(指内存模块的设计,也许地址线什么的连错了)。
如果不会挂掉,则很可能是你使用printf有问题,要么使用了空指针之类的东西,要么打印的目标内存地址不对,造成了系统的崩溃。
你可以做这样的测试:
将原来printf语句改成其他没用的语句,例如:n=1;i++之类的。
看看板子是否会挂掉。
如果同样会挂掉,则可能的问题如下:
1、代码的其他部分有内存溢出之类的Bug,你添加了这些指令后,使得某处内存正好溢出。(这样的问题比较难排查。)排除的方法比较简单:在程序其他任意地方(最好是不同的函数层次中)加入这样的没用的语句,如果每次加入哪怕一条语句都会挂掉的话,就可以基本排除是内存溢出。
2、硬件设计可能有bug(指内存模块的设计,也许地址线什么的连错了)。
如果不会挂掉,则很可能是你使用printf有问题,要么使用了空指针之类的东西,要么打印的目标内存地址不对,造成了系统的崩溃。
|
是否只要有printf调用,你的uboot都会死掉?
如果是,可能是printf相关的串口设置有问题。
如果是,可能是printf相关的串口设置有问题。
|
以上情况,可能有几种可能的原因。第一:你的printf代码放在了串口初始化之前,应该还在之后;第二:没有初始化串口,printf在哪都不行。
|
楼上正解,printf最终通过串口打印出来的
|
有可能存在地址越界或者野指针,改写了代码段或者某个关键位置。加了printf可能刚好避开了这个修改。
如果把你加的造成问题的printf 换成别的代码会怎么样?
如果把你加的造成问题的printf 换成别的代码会怎么样?
|
这个应该不是问题, 我的 uboot 因为增加启动画面等,都达到 500k 了, 没有问题。
你试试检查 printf 中但变量参数, 参数里是否有指针, 指针是否有效?
uboot 不同于内核, 是没有 oops 信息打印出来的。
|
因为base是uint型的指针。
它每次加1相当于char型指针加4
它每次加1相当于char型指针加4