• u-boot链接脚本分析


    eclipse 64位下载地址:http://www.eclipse.org/downloads/download.php?file=/technology/epp/downloads/release/kepler/SR1/eclipse-standard-kepler-SR1-win32-x86_64.zip

    如果从nand flash 启动,0地址就对应的是nand flash ,nand flash 不能像内存那样去写,通过这个可以判断是否是从nand flash 启动

    U-boot最根本的目标:启动内核
    1.从flash中读出内核
    2.启动内核

    单板初始化等一系列初始化

    环境变量,先看flash上有没有环境变量,没有就使用默认的环境变量

    start_armboot
    flash_init
    nand_init

    -->main_loop

    一:启动内核:
    s = getenv("bootcmd")
    run_command(s...)

    U-boot界面:
    readline (读入串口数据)
    run_command

    U-boot的核心:command(命令!)

    U-boot命令:
    1.输入命令字符串->动作(函数name) ,这里会有个命令结构体。

    从Usb口下载文件到内存的时候会生成一些环境变量或宏

    u-boot链接脚本的分析:

    OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
    OUTPUT_ARCH(arm)//指定输出可执行文件的平台为ARM
    ENTRY(_start)
    SECTIONS
    {
    . = 0x34000;
    . = ALIGN(4);

    .text :
    {
    arch/start.o(.text)
    *(.text)
    }

    . = ALIGN(4);
    .data :
    {
    *(.data)
    }

    . = ALIGN(4);

    .rodata :
    {
    *(.rodata)
    }


    . = ALIGN(4);

    _bss_start = .;
    .bss :
    {
    *(.bss)
    }
    _bss_end = .;

    }


    链接脚本的意义:
    一个可执行img(镜像)文件必须有一个入口点,并且只能有一个全局入口点,通常这个入口点的地址放在ROM(Flash)的0x0000000位置,
    因此我们必须使编译器知道这个入口地址,而该过程是通过修改连接脚本文件来完成的。

    OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm"):指定可执行文件输出格式是elf32,小端 和arm体系结构

    OUTPUT_FORMAT(DEFAULT,BIG,LITTLE) : 这一行的目的是指定输出目标文件的输出文件格式,一共三种,缺省是第一种DEFAULT若有命令行选项-EB, 则使用
    第2个BFD格式; 若有命令行选项-EL,则使用第3个BFD格式. 否则默认选第一个BFD格式.

    三个分别指定在缺省、大端、小端 情况下的输出可执行文件格式,u-boot-1.1.6在这里(缺省为第一种,即elf32-littlearm)
    指定可执行文件输出格式是elf32,小端 和arm体系结构

    OUTPUT_ARCH(arm)//指定输出可执行文件的平台为ARM

    ENTRY(_start)
    ENTRY(_start)在这里的意思是——指定启动时的函数入口地址,_start在每个CPU目录下的start.S中定义,真正的启动运行
    地址段在编译时在/u-boot-1.1.6/board/smdk2410/config.mk中由TEXT_BASE宏定义,即TEXT_BASE?=?0x33F80000

    下面开始分析SECTIONS:
    SECTIONS
    {
    . = 0x00000000;
    这里的点”.”,是定位器符号(GNU风格的一个典型)。
    把定位器符号置为0x00000000 (若不指定, 则该符号的初始值为0)。
    定系统启动从偏移地址零处开始。注意这只是个代码地址偏移值,真正的起始地址是由编译时指定的CFLAGS指定的。
    . = ALIGN(4);
    4字节对齐调整,那么ALIGN(0x10) 即16字节对齐后

    .text
    {
    cpu/arm920t/start.o (.text) /*.text段空间 */
    *(.text) /*后续.text段内容的分配*/
    }

    这段脚本的意思是将所有输入文件的.text?section,以及cpu/arm920t/start.o合并成一个.text?section,
    该section的地址由定位器符号的值指定(字节对齐后定位器符号的值)。

    . = ALIGN(4);
    .rodata : /*.rodata只读数据段*/
    {
    *(.rodata)
    }
    这段脚本的意思是先进行4字节对齐,然后将所有输入文件的.rodata section,合并成一个.rodata section,
    该section的地址由定位器符号的值指定(字节对齐后定位器符号的值)。

    . = ALIGN(4);
    __bss_start =.; /* .bss段开始位置 */
    .bss :
    {
    *(.bss)
    }
    _end =.; /* .bss段结束位置 */ }
    ***************************************************************************************************************************************************************
    ***************************************************************************************************************************************************************
    ***************************************************************************************************************************************************************
    ***************************************************************************************************************************************************************

  • 相关阅读:
    每日立会2015-11-30
    Some Modern Softwares' drawbacks: User experience 12/29/2015
    Sprint 5 summary: UI 界面更新,Azure端部署和用户反馈分析 12/28/2015
    Daily Scrum 12/25/2015
    Daily Scrum 12/24/2015
    Daily Scrum 12/23/2015
    Daily Scrum 12/21/2015
    Daily Scrum 12/18/2015
    Daily Scrum 12/17/2015
    Performance standard (ALPHA release) 12/17/2015
  • 原文地址:https://www.cnblogs.com/cnlg/p/4375302.html
Copyright © 2020-2023  润新知