主题 : linux卡在starting kernel...后在compressed/head.S里点灯调试出错 复制链接 | 浏览器收藏 | 打印
级别: 新手上路
UID: 85734
精华: 0
发帖: 3
金钱: 15 两
威望: 3 点
贡献值: 0 点
综合积分: 6 分
注册时间: 2013-01-08
最后登录: 2013-01-17
楼主  发表于: 2013-01-09 14:24

 linux卡在starting kernel...后在compressed/head.S里点灯调试出错

最近做移植官方linux到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及其内部实现所需要的一些宏,__right_p需要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,而且有其他错误信息:
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!
[ 此帖被aishuishou在2013-01-09 14:54重新编辑 ]
*無鈳取玳
级别: 论坛版主
UID: 27
精华: 12
发帖: 5398
金钱: 40120 两
威望: 17929 点
贡献值: 71 点
综合积分: 11036 分
注册时间: 2008-01-16
最后登录: 2014-11-22
1楼  发表于: 2013-01-09 15:35

 回 楼主(aishuishou) 的帖子

我的建议是***不要***在arch/arm/boot/compressed/head.S里加任何debug的代码,这是一段对位置非常敏感的代码。
另外,在分析这个问题之前,我想你需要给出一些基本信息,我在http://www.aiothome.net/read.php?tid-27538.html里已经说了。
"If you have an apple and I have an apple and we exchange apples, then you and I will
still each have one apple. But if you have an idea and I have an idea and we exchange
these ideas, then each of us will have two ideas."
级别: 新手上路
UID: 111250
精华: 0
发帖: 12
金钱: 60 两
威望: 12 点
贡献值: 0 点
综合积分: 24 分
注册时间: 2014-12-19
最后登录: 2018-09-10
2楼  发表于: 2015-03-01 01:17
你好,请问解决了吗?
http://www.aiothome.net/read.php?tid=86329
请帮,帮忙看一下,谢谢!