Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

内核太大,加载的时候panic了。 #8

Open
wangwenbin opened this issue Oct 18, 2014 · 9 comments
Open

内核太大,加载的时候panic了。 #8

wangwenbin opened this issue Oct 18, 2014 · 9 comments

Comments

@wangwenbin
Copy link

我使用教程编译了内核,并且做了 tftp 的 server 和 nfs 的 server。 但是发现无法启动路由器,通过日志发现不停的加载vmlinuz,然后分析可能是内核加载的时候出问题了。

我拆了路由器引出串口线。观察启动过程发现应该是内核太大panic了。看readme里面说的3M内核也没什么问题,但是在我这里就出问题了。

我的路由器是那个带1TB硬盘的那个,和本项目的硬件应该是一样的。

我想知道,如何设置可以解决加载比较大的内核,比如该3M的内核,或者该如何调整内核编译使得编译的内核更小(<262144 KBytes,根据日志发现)。 make menuconfig 的时候那些模块取消比较好。

内核加载过程的部分日志如下:


CFE version v1.0.4                                                              
BSP: 6.37.14.34 (r415984) based on BBP 1.0.37 for BCM947XX (32bit,SP,)          
Build Date: Tue Jul 22 14:47:07 CST 2014 (xqdevel@fanjialin-ct)                 
Copyright (C) 2000-2008 Broadcom Corporation.                                   

Init Arena                                                                      
Init Devs.                                                                      
Boot up from NOR flash...                                                       
Boot partition size = 262144(0x40000)                                           
Can't find nandflash! ccrev = 42, chipst= 0                                     
DDR Clock: 800 MHz                                                              
Info: DDR frequency set from clkfreq=1000,*800*                                 
et0: Broadcom BCM47XX 10/100/1000 Mbps Ethernet Controller 6.37.14.34 (r415984) 
CPU type 0x0: 1000MHz                                                           
Tot mem: 262144 KBytes                                                          

CFE mem:    0x00F00000 - 0x0179FE88 (9043592)                                   
Data:       0x00F583E4 - 0x00F5891C (1336)                                      
BSS:        0x00F58928 - 0x00F9DE88 (284000)                                    
Heap:       0x00F9DE88 - 0x0179DE88 (8388608)                                   
Stack:      0x0179DE88 - 0x0179FE88 (8192)                                      
Text:       0x00F00000 - 0x00F4CCF0 (314608)                                    
Boot:       0x017A0000 - 0x017E0000                                             
Reloc:      I:00000000 - D:00000000                                             

Device eth0:  hwaddr 8C-BE-BE-2D-38-8D, ipaddr 192.168.1.1, mask 255.255.255.0  
        gateway not set, nameserver not set                                     
********** flag_tftp_bootup=on **********                                       
tftp network: ifconfig eth0 -addr=192.168.1.1 -mask=255.255.255.0 -gw=192.168.11
Device eth0:  hwaddr 8C-BE-BE-2D-38-8D, ipaddr 192.168.1.1, mask 255.255.255.0  
        gateway 192.168.1.1, nameserver not set                                 
kernel: boot -raw -z -addr=0x8000 -max=0x800000 192.168.1.2:vmlinuz             
Loader:raw Filesys:tftp Dev:eth0 File:192.168.1.2:vmlinuz Options:(null)        
Loading: .PANIC: out of memory!                                                 
PANIC: out of memory!                                                           
PANIC: out of memory!                                                           
PANIC: out of memory!                                                           
PANIC: out of memory!                                                           
PANIC: out of memory!                                                           
PANIC: out of memory!                                                           
PANIC: out of memory!                                                           
PANIC: out of memory!                                                           
PANIC: out of memory!                                                           
.. 1271708 bytes read                                                           
Failed.                                                                         
Could not load 192.168.1.2:vmlinuz: Error                                       
Digital core power voltage set to 1.0V                                          
Decompressing...done                                                            
Digital core power voltage set to 1.0V                                          
Decompressing...done                                                            
Found a ST compatible (Marconix) serial flash with 256 64KB blocks; total size B

@comcat
Copy link
Owner

comcat commented Oct 28, 2014

可先把 kernel/linux-2.6.36/usr/ramfs/usr/bin/busybox 删除,再将内核配置里的NFS关闭,将内核镜像的大小控制在2.7MB左右,再试试能否 tftp 加载成功

@simophin
Copy link

我也遇到这个问题了。是不是CFE更新了在搞一些限制啊?有没有办法更新CFE呢?

@comcat
Copy link
Owner

comcat commented Nov 29, 2014

有可能小米稍微改了CFE,加了限制。当时的测试环境是:

CFE version v1.0.4
BSP: 6.37.14.34 (r415984) based on BBP 1.0.37 for BCM947XX (32bit,SP,)
Build Date: Wed Apr 30 18:03:21 CST 2014 (szy@shenzhiyong-ct) <<<<-------------

可以把整个固件刷回去。官方的固件更新,不定期会带 CFE 的更新,可以刷 0.4.92 这个版本

参考:http://wiki.jackslab.org/%E5%AE%98%E6%96%B9%E5%8F%91%E5%B8%83%E7%9A%84%E5%9B%BA%E4%BB%B6%E6%94%B6%E9%9B%86

固件的解包打包,参考:http://wiki.jackslab.org/%E5%B0%8F%E7%B1%B3%E8%B7%AF%E7%94%B1%E5%9B%BA%E4%BB%B6%E8%A7%A3%E5%8C%85%E6%89%93%E5%8C%85

@bruce322
Copy link

bruce322 commented Dec 3, 2014

0.4.92版本的CFE还是不行;和内核大小没关系,我编译了一个内核比固件里解包出来的内核还小,但是我的内核加载就会报panic;
应该是CFE里有限制。

@bruce322
Copy link

bruce322 commented Dec 3, 2014

比较了下两个内核文件,应该是lzma压缩时头部没有写解压的文件大小导致;看了下lzma的命令是没有记录文件大小选项的,可能是小米改了lzma

@comcat
Copy link
Owner

comcat commented Dec 3, 2014

CFE 版本是什么?

内核的压缩格式参考这个页面:http://wiki.jackslab.org/%E5%B0%8F%E7%B1%B3%E8%B7%AF%E7%94%B1vmlinuz.trx%E6%A0%BC%E5%BC%8F%E8%A7%A3%E6%9E%90

@comcat
Copy link
Owner

comcat commented Dec 3, 2014

记忆有偏差,刷 0.4.85 试试

官方发布的固件,带有 CFE 的版本(如 0.4.85, 0.4.92)内部只有两个文件 brcm4709_nor.bin 和 root.ext4.lzma,brcm4709_nor.bin 这个文件实际是直接写入 /dev/mtd8 这个分区的(实际是映射到整个16MB flash),这个可以查看路由系统下 /bin/flash.sh 这个脚本:

104 upnor() {
105 if [ -f brcm${surfix_ver}_nor.bin ]; then
106 klogger -n "Burning Full NOR Flash Image..."
107 mtd write brcm${surfix_ver}_nor.bin firmware >& /dev/null <------
108 if [ $? -eq 0 ]; then
109 klogger "Done"
110 else
111 klogger "Error"
112 exit 1
113 fi
114 fi
115 }

${surfix_ver} 变量的值在R1D上为4709


官方固件可以在路由系统上,用如下命令解包:

root@XiaoQiang:/userdisk/rom/0.4.85# mkxqimage -x ../brcm4709_hdr_039ef_0.4.85.bin
root@XiaoQiang:/userdisk/rom/0.4.85# ls
brcm4709_nor.bin root.ext4.lzma

额外再接一下flash 包即可,这个看看路由系统的 /bin/flash.sh 的做法即知:

292 [ -f brcm${surfix_ver}_nor.bin ] && {
293 dd if=brcm4709_nor.bin of=mice_cfe bs=64k count=4 >& /dev/null
294 dd if=brcm4709_nor.bin of=vmlinuz.trx bs=64k count=48 skip=4 >& /dev/null
......

mice_cfe 为 CFE 镜像
vmlinuz.trx 为内核 + initramfs,详细格式参考 小米路由vmlinuz.trx格式解析

@bruce322
Copy link

bruce322 commented Dec 4, 2014

看了下vmlinuz,代码编译出来的头为5D 00 00 10 00 FF FF FF FF FF FF FF FF,标记解压包长度为FFFF,而小米的固件解包后的vmlinuz头为5D 00 00 01 00 80 BB 51 00 00 00 00 00 00 ,包含了长度信息;所以应该是小米做了改动。

@hedgehog-young
Copy link

就像bruce322说的,现在的vmlinuz的lzma header缺少未压缩时的文件大小。
这个应该是lzma工具的的问题。lzma已经被xz替代了,新一些的系统所装的lzma就是指向xz的一个符号链接。在xz utils的git里bisect了半天,发现是这个commit引入的:
http://git.tukaani.org/?p=xz.git;a=commit;h=7d17818cec8597f847b0a2537fde991bbc3d9e96。
看样子是作者当时简化了lzma的文件格式。
遇到问题的朋友,可以手动编辑那8个字节的文件大小。也可以改用老的lzma utils。也可以直接用zImage,利用kernel自带的解压,记得CFE引导时把-z去了。
也可能xz带什么命令选项可以添加uncompressed size,而我没注意到……

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

5 participants