u-boot移植(二)---修改前工作:代码流程分析1

发布者:未来画家最新更新时间:2023-07-03 来源: elecfans关键字:u-boot  移植 手机看文章 扫描二维码
随时随地手机看文章

一、代码执行总体流程图

1.1 代码路径 

  • U-boot.lds (archarmcpu) 

  • vectors.S (archarmlib) 

  • start.S (archarmcpuarm920t) 

  • lowlevel_init.S (boardsamsungjz2440) 

  • crt0.S (archarmlib)

  • relocate.S (archarmlib) 

  • Board_init.c (commoninit) 

  • Board_f.c (common) 

  • Jz2440.h (includeconfigs) 

  • Generic-asm-offsets.h (includegenerated) 

1.2 启动代码流程图

  

 

二、链接文件

  目录:u-boot-2017.03/arch/arm/cpu

  文件:u-boot.lds

  编写好的 .lds 文件,在用 arm-Linux-ld 连接命令时带 -Tfilename 来调用执行,如:arm-linux-ld-Tnand.lds x.o y.o -o xy.o

  也用-Ttext参数直接指定连接地址,如 arm-linux-ld-Ttext 0x30000000 x.o y.o -oxy.o

  既然程序有了两种地址,就涉及到一些跳转指令的区别。 
  ARM汇编中,常有两种跳转方法:b跳转指令、ldr指令向PC赋值。 
  要特别注意这两条指令的意思: 
  1> b step:b跳转指令是相对跳转,依赖当前PC的值,偏移量是通过该指令本身的bit[23:0]算出来的,这使得使用b指令的程序不依赖于要跳到的代码的位置,只看指令本身。 
  2> ldr pc, =board_init_r :该指令是一个伪指令编译后会生成以下代码:ldr pc, [pc, #8]

    从内存中的某个位置读出数据并赋给PC,同样依赖当前PC的值,所以可以用它实现从Flash到RAM的程序跳转。

  2种方式指明程序地址,这里分析下第二种方式,在根目录 Makefile文件有如下一行:

  

  在文件 include/configs/jz2440.h 有定义:

  

  我们在这里可以用下面的命令生成 u-boot.dis文件(注意交叉编译器的名字):

  arm-2440-linux-gnueabi-objdump -D -m arm u-boot > u-boot.dis

  

  在0 地址执行的是 _start.S文件,然后跳转到reset执行,接着定义异常向量表:

  

  在u-boot.lds 脚本中并没有指定基地址, 根目录下的 u-boot 脚本是由 arch/arm/cpu/u-boot.lds 在编译的时候生成的,所以如果要修改u-boot.lds 需要找到正确的地方。

  u-boot.lds 分析:  1 #include

  2 /* 指定输出可执行文件是elf格式,32位ARM指令,小端模式  */

  3 OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")

  4 OUTPUT_ARCH(arm) /* 指定输出文件的的平台体系为ARM */

  5 ENTRY(_start)    /* 指定可执行映像文件的起始段的段名是 _start,这里跳转到vector.S执行 */

  6 SECTIONS

  7 {

  8     /DISCARD/ : { *(.rel._secure*) }

  9     /* 指定可执行的 image 文件的全局入口点,通常这个地址都发给你法rom(flash)0x0位置。

 10      * 必须使编译器知道这个地址,一般不修改此处,而是修改其它地方的宏定义*/

 11     . = 0x00000000;

 12     . = ALIGN(4);

 13     .text :

 14     {

 15         /* 映像文件赋值起始地址,它在文件 arch/arm/lib/sections.c 中定义:

 16          * char __image_copy_start[0] __attribute__((section(".__image_copy_start")));*/

 17         *(.__image_copy_start)

 18         /* arch/arm/lib/vectors.S 里有一句:.section ".vectors"  */

 19         /* 这里的 vectors 是让vector.S 链接的二进制文件的开头部分 */

 20         *(.vectors)

 21         CPUDIR/start.o (.text*)        /* 执行 start.S */

 22         *(.text*)                    /* 其他代码 */

 23     }

 24 

 25     . = ALIGN(4);

 26     /* 只读数据段,所有的只读数据段都放在这个位置  */

 27     .rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }

 28 

 29     . = ALIGN(4);

 30     /* 可读写数据段,所有的可读写数据段都放在这个位置 */

 31     .data : {

 32         *(.data*)

 33     }

 34 

 35     . = ALIGN(4);

 36 

 37     . = .;

 38 

 39     . = ALIGN(4);

     /* U-BOOT命令段 */

 40     .u_boot_list : {

 41         KEEP(*(SORT(.u_boot_list*)));

 42     }

 43 

 44     . = ALIGN(4);

 45 

 46     .image_copy_end :

 47     {

 48         *(.__image_copy_end)

 49     }

 50 

    /* 相对动态信息段 */

 51     .rel_dyn_start :

 52     {

 53         *(.__rel_dyn_start)

 54     }

 55 

 56     .rel.dyn : {

 57         *(.rel*)

 58     }

 59 

 60     .rel_dyn_end :

 61     {

 62         *(.__rel_dyn_end)

 63     }

 64 

 65     .end :

 66     {

 67         *(.__end)

 68     }

 69 

 70     _image_binary_end = .;

 71 

 72     /*

 73      * Deprecated: this MMU section is used by pxa at present but

 74      * should not be used by new boards/CPUs.

 75      */

 76     . = ALIGN(4096);

 77     .mmutable : {

 78         *(.mmutable)

 79     }

 80 

 81 /*

 82  * Compiler-generated __bss_start and __bss_end, see arch/arm/lib/bss.c

 83  * __bss_base and __bss_limit are for linker only (overlay ordering)

     * bss段,里面放置的是初始值为0的全局变量和静态变量,这些变量不会保存在

        * 二进制文件中


 84  */

 85 

 86     .bss_start __rel_dyn_start (OVERLAY) : {

 87         KEEP(*(.__bss_start));

 88         __bss_base = .;

 89     }

 90 

 91     .bss __bss_base (OVERLAY) : {

 92         *(.bss*)

 93          . = ALIGN(4);

 94          __bss_limit = .;

 95     }

 96 

 97     .bss_end __bss_limit (OVERLAY) : {

 98         KEEP(*(.__bss_end));

 99     }

100 

101     .dynsym _image_binary_end : { *(.dynsym) }

102     .dynbss : { *(.dynbss) }

103     .dynstr : { *(.dynstr*) }

104     .dynamic : { *(.dynamic*) }

105     .plt : { *(.plt*) }

106     .interp : { *(.interp*) }

107     .gnu.hash : { *(.gnu.hash) }

108     .gnu : { *(.gnu*) }

109     .ARM.exidx : { *(.ARM.exidx*) }

110     .gnu.linkonce.armexidx : { *(.gnu.linkonce.armexidx.*) }

111 }

  链接执行,首先是进入到arch/arm/vector.S 中执行,在其中执行 _start.S ,_start.S 的首行就跳转到 start.S 中的 reset 中去执行了。

  这里没有执行SPL,若要加上SPL,则还需要加上 nandflash 

  链接脚本暂时的流程为:

  

  跳转A处,A代码在Vector.S中,执行_start.S代码,下一节看 _start.S的代码,并分析其过程。

 

备注:后续会更新此文档


关键字:u-boot  移植 引用地址:u-boot移植(二)---修改前工作:代码流程分析1

上一篇:u-boot移植(三)---修改前工作:代码流程分析2
下一篇:u-boot移植(一)---准备工作

推荐阅读最新更新时间:2024-11-08 07:46

AM335x(TQ335x)学习笔记——u-boot-2014.10移植
最近移植了下u-boot-2014.10到TQ335x,如果基于am335x evm进行移植,需要修改的地方并不多。 由于TI的am335x evm开发使用了一个eeprom保存了板载配置信息,用来区分不同板子的型号的,而TQ335x没有这个eeprom,因此,需要修改eeprom相关的部分,使u-boot适应TQ335x开发板。 使用source insight查看代码,很容易发现,所有获取板载配置的部分都是通过读取eeprom获得的,因此,首选修改read_eeprom(board/ti/am335x/board.c)函数,具体的修改如下: static int read_eeprom(struct am335x_bas
[单片机]
移植U-boot_2016.09到JZ2440开发板
一.下载源码:U-Boot源代码下载地址 http://www.linuxidc.com/Linux/2011-07/38897.htm 二.初始化编译:   ①make smdk2410_defconfig  #首先使用默认配置,减少后续的配置工作   ②make menuconfig   #根据自身需求进一步配置   ③修改Makefile ,开头只能架构和编译器:      ARCH=arm      CROSS_COMPILE=arm-linux- ④修改uboot代码:    1. 设置PLL的时钟的函数在_main中的board_init_f中初始化函数列表中的 boad_early_init_f 中,
[单片机]
msp430的printf函数的简单移植
这几个月都在做一个基于TCS34725的RGB颜色传感器的工程,我使用的主控是MSP430,平时调试的时候用485总线发送到上位计(电脑或上层主控机),开始直接用串口发送函数直接发送,但是很多数据显示超级不方便,比如浮点数和有特地格式的数据流,先前都是自己用串口发送函数组一函数就是调用了int putchar(char *) 函数,于是我花了几分钟写了一个putchar函数,已使用,还真的成功了…….,想想先前傻逼的一个一个的构造格式,转化数字为字符串,现在终于可以使用printf函数了…. int putchar(int ch) { if (ch == 'n') { RS485Send
[单片机]
μC/OS-III在S12X架构上的移植
引言 S12X架构是飞思卡尔公司推出的16位CPU,占有一定的单片机应用市场。μC/OS—III是.Micrium公司推出的一款实时操作系统(RTOS),它的前身——μC/OS—II,由于源码公开、实时性好、便于学习等优点,应用非常广泛,并被移植到了几乎所有主流的CPU架构上。但是到目前为止,μC/OS—III在S12X架构上还没有官方的移植版本。 μC/OS-III相比μC/OS—II作了很大的改进,整个内核基本被重写。任务的数量可无限多,只受限于系统存储器的大小;由于支持时间片轮转调度,任务的优先级可以相同;采用了延迟中断处理机制(deferred post),中断服务所要访问的全局变量数变得很少,使得大部分临界代码的
[单片机]
μC/OS-III在S12X架构上的<font color='red'>移植</font>
Microchip扩展PIC单片机产品线 全新PIC32系列尽显32位优势
提供由单一开发环境支持的8位、16位及32位产品线的唯一单片机供应商 全球领先的单片机和模拟半导体供应商——美国微芯科技公司(Microchip Technology Inc.)今天宣布推出全新32位PIC32单片机(MCU)系列。PIC32系列在性能和存储上均有显著提升,其引脚、外设和软件也保持了与Microchip 16位单片机/数字信号控制器系列的兼容性。此外,新系列器件还得到Microchip免费MPLAB集成开发环境的全面支持,使移植过程化繁为简,同时能够省去客户在开发工具方面的重复投资。MPLAB集成开发环境具备前所未有的兼容性,可支持Microchip包括8位、16位及32位器件在内的完整产品线。 Microch
[单片机]
基于2.6.19内核的小型Linux系统制作与移植
引言 ARM9 S3C2410微处理器与Linux的结合越来越紧密,逐渐在嵌入式领域得到广范的应用。目前,在便携式消费类电子产品、无线设备、汽车、网络、存储产品等都可以看到S3C2410与Linux相结合的身影。 S3C2410微处理器是一款由Samsung公司为手持终端设计的低价格、低功耗、高性能,基于ARM920T核的微处理器。它带有内存管理单元(MMU),采用0.18mm工艺和AMBA新型总线结构,主频可达203MHz。同时,它支持Thumb 16位压缩指令集,从而能以较小的存储空间获得32位的系统性能。 在众多嵌入式操作系统中,Linux目前发展最快、应用最为广泛 。性能优良、源码开放的Linux具有体积小、内核可裁
[应用]
S3C2440 Linux驱动移植——NAND驱动
1. 修改分区表 打开文件arch/arm/plat-s3c24xx/common-smdk.c,修改mtd_partition结构体数组。 修改后如下: view plain copy static struct mtd_partition smdk_default_nand_part = { = { .name = Uboot , .size = 0x00040000, .offset = 0x00000000, }, = { .name = K
[单片机]
S3C2440 Linux驱动<font color='red'>移植</font>——NAND驱动
18.U-boot的工作流程分析-210
210启动流程: 前面在2440和6410中虽然有BL1和BL2之分,210也是一样的:
[单片机]
18.U-boot的工作<font color='red'>流程</font>分析-210
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved