您的位置:首页 > 编程语言 > PHP开发

INIT_LIST_HEAD无法初始化链表指针

2012-05-19 19:35 183 查看
    解决了函数调用多时系统无响应的问题,现在来解决初始化 buddy 链表头时卡在INIT_LIST_HEAD 宏的问题,把难啃的骨头留在后边,最后再腾出功夫来看中断无法初始化是怎么回事。
    函数卡在INIT_LIST_HEAD 宏,无法初始化全局链表数组,该数组的每个元素分别是一组同阶的buddy链表的链表头。数组为全局变量,存储在bss段。既然无法修改bss的内容,尝试在函数内部定义一个连表节点变量,将该变量的两个指针成员指向自身,结果是成功的。查看变量的地址,靠近内存最高端的栈里,这是因为arm的堆栈是满递减结构,从顶向下增长的。再回头看数组的地址:0x00000420,在前4K,这个地址是CPU内部STEPSTONE使用的,那么要解决这个问题就要修改bss段的链接地址了,将其避开前4K地址。做法是将链接脚本中bss段从kernel段上边拿到下边,原链接脚本:
 /********************************************************************

 *

 * @ File Name  : link.lds

 * @ Date       : 2012-03-24

 * @ Author     : gaofeilong <gaofeilonglcu@163.com>

 *

 * @ Description: link scripts, determin all section layout

 *

 * *****************************************************************/
OUTPUT_FORMAT("elf32-littlearm","elf32-littlearm", "elf32-littlearm")

OUTPUT_ARCH(arm)

ENTRY(_start)
SECTIONS

{

        . = 0x00000000;

        . = ALIGN(4);

        .bootloader    :

        {

               start.o(.text .rodata* .data)

               init.o(.text .rodata* .data)

               serial.o(.text .rodata* .data)

               nand.o(.text .rodata* .data)

        }
       . = ALIGN(4);

        __bss_start = .;

       .bss            : {*(.bss) }

        . = ALIGN(4);

        __bss_end = .;

        . = ALIGN(4);

        .kernel 0x30000000 : AT(0x1000) {*(.text .rodata* .data .bss) }

}
 修改后的链接文件:
/********************************************************************

 *

 * @ File Name  : link.lds

 * @ Date       : 2012-03-24

 * @ Author     : gaofeilong <gaofeilonglcu@163.com>

 *

 * @ Description: link scripts, determin all section layout

 *

 * *****************************************************************/
OUTPUT_FORMAT("elf32-littlearm","elf32-littlearm", "elf32-littlearm")

OUTPUT_ARCH(arm)

ENTRY(_start)
SECTIONS

{

        . = 0x00000000;

        . = ALIGN(4);

        .bootloader    :

        {

               start.o(.text .rodata* .data)

               init.o(.text .rodata* .data)

               serial.o(.text .rodata* .data)

               nand.o(.text .rodata* .data)

        }

        . = ALIGN(4);

        .kernel 0x30000000 : AT(0x1000) {*(.text .rodata* .data .bss) }
       . = ALIGN(4);

        __bss_start = .;

       .bss            : {*(.bss) }

        . = ALIGN(4);

        __bss_end = .;

}
编译报警:warning: section `.kernel' type changed to PROGBITS,这是看到kernel段中也有bss信息,应该是和下边的bss段信息重叠了,删除kernel中的bss,最后的样子:
 /********************************************************************

 *

 * @ File Name  : link.lds

 * @ Date       : 2012-03-24

 * @ Author     : gaofeilong <gaofeilonglcu@163.com>

 *

 * @ Description: link scripts, determin all section layout

 *

 * *****************************************************************/
OUTPUT_FORMAT("elf32-littlearm","elf32-littlearm", "elf32-littlearm")

OUTPUT_ARCH(arm)

ENTRY(_start)
SECTIONS

{

        . = 0x00000000;

        . = ALIGN(4);

        .bootloader    :

        {

               start.o(.text .rodata* .data)

               init.o(.text .rodata* .data)

               serial.o(.text .rodata* .data)

               nand.o(.text .rodata* .data)

        }
 
       . = ALIGN(4);

        .kernel 0x30000000 : AT(0x1000) {*(.text .rodata* .data) }
        .= ALIGN(4);

        __bss_start = .;

       .bss            : {*(.bss) }

        . = ALIGN(4);

        __bss_end = .;
}
再编译,OK通过。
   烧到板子上运行,结果正常,能够初始化链表头数组了。
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息