- 论坛徽章:
- 1
|
本帖最后由 registcn 于 2013-01-09 14:55 编辑
最近做移植官方linux到x210ii(s5pv210)开发板,linux卡在starting kernel...看遍网上各种贴子,ID,频率,分区(貌似此处还不涉及,都说卡在uncompressing后才可能是分区问题),串口驱动,都检查过,也开过低级调试信息,没发现问题,按照厂商说的,设定bootcmd、bootargs就成,但是我这不行啊。请前辈们赐教,这里先把我的问题描述如下:
首先printascii(自己用一段汇编封装了这个函数)确认了不能进入arch/arm/kernel/head.S(因为正常kernel用本人的程序有提示性输出)。然后在arch/arm/boot/compressed/head.S里添加点灯程序(写成了宏,也保存恢复了寄存器),发现,加在文件开头_start紧后,可以亮,但是在文件bl decompress_kernel语句(两条可能的分支都加了)前、后都没结果,灯不亮。
我是否应该把问题锁定在head.S解压出错?或者,有没有可能是我加的位置不对?因为直接加载含有.word,.type(没仔细研究过at&t)的汇编语句上下文中,不亮,但是放在bl 1f所指向的标签“1:”里就可以亮,这几个字段莫非有干扰?
希望大家给个问题范围,现在脑袋大了。。。今天我把汇编(节选自我的arch/arm/boot/compressed/head.S)贴出来。
#include <linux/linkage.h>
//下面这句自己加的,这里面有printascii及其内部实现所需要的一些宏
#include "../../kernel/debug.S"
//这个过程写的没问题吧?复制的一个调试成功的人的代码。
__right_p:
adr r13,spbuf1
stmia r13, {R1-R4,R7}
mov r7,lr
mov r4, r0
adr r0, str_p3
bl printascii
mov r0 ,r4
bl printhex8
adr r0,str_p4
bl printascii
mov lr,r7
ldmia r13,{R1-R4,R7}
mov pc,lr
str_p3: .asciz "\nkernel boot step 0x"
str_p4: .asciz "\n"
.align
ENDPROC(__right_p)
spbuf1: .space 20
//这个宏写的也没问题吧?
.macro ledon
stmea sp!,{r0,r1}
ldr r0,=0xE0200240
mov r1,#0x10000
str r1,[r0]
ldr r0,=0xE0200244
mov r1,#0x7f
str r1,[r0]
ldmea sp!,{r0,r1}
.endm
/*
* Debugging stuff
*
* Note that these macros must not contain any code which is not
* 100% relocatable. Any attempt to do so will result in a crash.
* Please select one of the following when turning on debugging.
*/
/*
次数省略很多调试宏,他们怎么用呢?
还有上面英文注释里说的话(must not contain any code which is not 100% relocatable),
感觉和我下面添加代码导致的错误有关系,但是不知道怎么个意思?
重定位是指从flash到sdram吗,还是只编译原理上的代码重定位呢?
*/
start:
//这里出错,uboot提示找不到image,可能是这句话在最终文件里占据了空间干扰了image解压的位置?那怎么调试啊,调试总不能不加语句吧?
//mov r0,#0x110
//bl __right_p
.type start,#function
.rept 8
mov r0, r0
.endr
//ledon宏放在这里,也会导致同样的错误,找不到image。还是同问,怎么写100%可重定位的程序呢?
//ledon
b 1f
.word 0x016f2818 @ Magic numbers to help the loader
.word start @ absolute load/run zImage address
.word _edata @ zImage end address
1:
//这个宏放在这里就可以!灯就亮了!!!这是因为这里的代码100%可重定位?
//但是这种标签有限啊,调试的地方不都是有标签的。
//我想在任意处添加调试代码,结果就是上面错误!请大侠指教怎么破?
//ledon
mov r7, r1 @ save architecture ID
mov r8, r2 @ save atags pointer
添加调试代码后不仅没有到达starting kernel,而且有其他错误信息,分析如下:
在do_bootm函数里,if (*(ulong *)(addr + 9*4) == LINUX_ZIMAGE_MAGIC) 判断为不等于,
导致未能直接跳转到goto after_header_check,
最终在 if (os_len == 0) { puts ("ERROR: can't get kernel image!\n");return 1; }里面终止,
dnw输出错误信息:ERROR: can't get kernel image!
|
|