zoukankan      html  css  js  c++  java
  • 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段结束位置 */ }
    ***************************************************************************************************************************************************************
    ***************************************************************************************************************************************************************
    ***************************************************************************************************************************************************************
    ***************************************************************************************************************************************************************

  • 相关阅读:
    HTB-靶机-Charon
    第一篇Active Directory疑难解答概述(1)
    Outlook Web App 客户端超时设置
    【Troubleshooting Case】Exchange Server 组件状态应用排错?
    【Troubleshooting Case】Unable to delete Exchange database?
    Exchange Server 2007的即将生命周期,您的计划是?
    "the hypervisor is not running" 故障
    Exchange 2016 体系结构
    USB PE
    10 months then free? 10个月,然后自由
  • 原文地址:https://www.cnblogs.com/cnlg/p/4375302.html
Copyright © 2011-2022 走看看