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

游戏进行中 游戏进行中     2022-09-03     476

关键词:

一、代码执行总体流程图

1.1 代码路径 

  • U-boot.lds (arch\arm\cpu) 

  • vectors.S (arch\arm\lib) 

  • start.S (arch\arm\cpu\arm920t) 

  • lowlevel_init.S (board\samsung\jz2440) 

  • crt0.S (arch\arm\lib)

  • relocate.S (arch\arm\lib) 

  • Board_init.c (common\init) 

  • Board_f.c (common) 

  • Jz2440.h (include\configs) 

  • Generic-asm-offsets.h (include\generated) 

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 <config.h>

  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移植---修改前工作:代码流程分析3---代码重定位

...链接时候的地址就会生成,然后存储在段里面,如下段(u-boot.lds):     查看详情

u-boot移植---代码修改---时钟修改sdram

...现在就需要做的是代码的修改,配置成适合目标板使用的u-boot。一、时钟修改  在代码流程分析中,我们知道,系统的启动是:设置CPU为管理员模式关闭看门狗屏蔽中断设置启动参数:时钟 FCLK:HCLK:PCLK=1:2:4   FCLK... 查看详情

u-boot-2016.07移植(第一篇)初步分析

U-BOOT-2016.07移植 (第一篇) 初步分析目录U-BOOT-201607移植 第一篇 初步分析目录编译和移植环境更新交叉编译工具1下载arm-linux-gcc4432安装arm-linux-gcc443安装环境Ubuntu910下载u-boot-201607并解压分析顶层Makefile1找出目标依赖关系2总结... 查看详情

移植最新u-boot之裁剪和修改默认参数

...ceinsight工程、编译、烧写、如果无运行分析原因  tarxjfu-boot-2012.04.01.tar.bz2  cdu-boot-2012.04.01  makesmdk2410_config  make2.分析u-boot:通过链接命令分析组成文件、阅读代码分析启动过程  a.初始化硬件:关看门狗、设置时钟、... 查看详情

u-boot移植---代码修改---支持dm9000网卡

一、准备工作1.1原理图    CONFIG_DM9000_BASE  片选信号是接在nGCS4引脚,若要确定网卡的基地址,则要根据片选信号的接口去确定。  在三星2440的DATASHEET中memorycontrol这一章的Figure5-1.S3C2440AMemoryMapafterReset已经说明了片选4的... 查看详情

linux系统移植:u-boot工程创建(代码片段)

文章目录Linux系统移植:U-Boot工程创建一、U-Boot文件目录二、U-Boot目录解析2.1arch文件夹2.2board文件夹2.3config文件夹2.4.u-boot.xxx_cmd文件2.5顶层Makefile文件2.6u-boot.xxx文件2.7.config文件2.8README文件三、U-Boot过程创建3.1打开工程文件夹3... 查看详情

u-boot移植---代码修改---nand

一、NAND原理    NAND无地址空间,地址和数据的发送都依赖于LDATA[0:7]这一串数据总线。     不看随机页编程,看到从高位到低位的页,总共分为64个页面,每个页的组成是2K+64 个byte,一个块的大小是(128K+4K)b... 查看详情

u-boot移植(十三)---代码修改---支持文件系统及补丁制作

一、烧写文件系统1.1jffs2烧写  1.下载文件系统:tftp30000000fs_mini_mdev.jffs2    2.擦除文件的块:nanderase.partrootfs    3.烧入文件系统:nandwrite.jffs2300000000x00260000 5b89a8    4.设置启动参数:setbootargsconsole=ttySAC0root=/d... 查看详情

u-boot的移植与分析(第一阶段硬件初始化)(代码片段)

1.UBOOT运行的第一个文件是:cpu/arm920t/start.S(从程序的链接脚本中知道)1.globl_start                    //.globl定义一个全局符号"_start"2_start:breset          //系统复位设置3ldrpc,_undefined_instructio... 查看详情

u-boot移植(十三)---代码修改---裁剪及环境变量一

一、内核裁剪  内核的裁剪首先就是修改我们的配置文件,即include/configs/jz2440.h文件,里面定义的很多宏,我们也许用不上的就要去掉。1/*2*(C)Copyright20023*SysgoReal-TimeSolutions,GmbH<www.elinos.com>4*MariusGroeger<[email protected]>... 查看详情

10th.u-boot——代码结构分析

简介    U-Boot(UniversalBootLoader),通用BootLoader,一是可以引导多种操作系统,二是支持多种架构CPU。     教程中是在sourcefoge网站上下载的U-boot-1.1.6源码,进行分析与移植。 结构分析    U-boot-1.1.6有26个子目录... 查看详情

linux系统移植:u-boot启动流程(下)(代码片段)

目录Linux系统移植:U-Boot启动流程(下)一、run_main_loop函数详解二、cli_loop函数详解三、cmd_process函数详解Linux系统移植:U-Boot启动流程(下)一、run_main_loop函数详解uboot启动以后会进入3秒倒计时,如果... 查看详情

u-boot移植---代码修改---支持norflash

一、问题定位    开发板重启后打印了2个提醒和一个错误,caches的提醒先不看,看看flash和nand下面的提醒,badCRC,Usingdefaultenviroment,我们可以定位Usingdefaultenviroment定位到代码位置,如下:    Env_common.c(common)   ... 查看详情

u-boot-1.1.6移植

...smdk2410.h直接复制为my2440.h)②修改两个Makefile   u-boot-1.1.6/Makefile  在 smd 查看详情

linux系统移植:u-boot顶层makefile分析(下)(代码片段)

目录Linux系统移植:U-Boot顶层Makefile分析(下)一、调用scripts/Kbuild.include二、导出交叉编译工具变量设置三、导出其他变量四、makexxx_config过程五、make过程Linux系统移植:U-Boot顶层Makefile分析(下)继续沿着... 查看详情

u-boot移植---代码修改---存储控制器

一、CPU访问芯片的条件    CPU通过访问存储控制器,来读取外部设备的数据。  CPU想访问一个芯片,需要如下条件(配置信息):地址线数据线:8位/16位/32位数据宽度时钟/频率 其他芯片相关的特性:比如SDRAM,有行地... 查看详情

u-boot移植---准备工作

一、工具链的制作1.1工具  软件工具:crosstool-ng  下载地址:gitclonehttps://github.com/crosstool-ng/crosstool-ng  crosstool-ng的环境需要libncurse5-dev   sudoapt-get installlibncurse5-dev  安装autoconf:  sudoapt-get&nbs 查看详情

armv8架构u-boot启动流程详细分析(代码片段)

1.u-bootarmv8链接脚本在进行源码分析之前,首先看看u-boot的链接脚本,通过链接脚本可以从整体了解一个u-boot的组成,并且可以在启动分析中知道某些逻辑是在完成什么工作。在armv8中,u-boot使用arch/arm/cpu/armv8/u-boot... 查看详情