u-boot移植(四)---修改前工作:代码流程分析3---代码重定位

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

一、重定位  

  1.以前版本的重定位

    

  2.新版本

    

    我们的程序不只涉及一个变量和函数,我们若想访问程序里面的地址,则必须使用SDRAM处的新地址,即我们的程序里面的变量和函数必须修改地址。我们要修改地址,则必须知道程序的地址,就需要在链接的时候加上PIE选项:

    

    加上PIE选项后,链接时候的地址就会生成,然后存储在段里面,如下段(u-boot.lds):

    

    然后我们根据这些地址的信息来修改代码,程序就可以复制到SDRAM的任何地方去。

 二、代码流程 

  start.S中执行到了 bl _main,跳转到_main,_main函数入口在crt0.S (archarmlib) 中。

  1.crt0.S  

 1 ENTRY(_main)

 2 

 3 /*

 4  * Set up initial C runtime environment and call board_init_f(0).

 5  * 初始化C运行环境并且调用 board_init_f(0) 函数

 6  */

 7 

 8  /*

 9   * 初始化栈地址

10   */

11     /* Generic-asm-offsets.h (includegenerated)

12      * #define GENERATED_GBL_DATA_SIZE 192

13      * JZ2440.h(includeconfig)

14      * #define PHYS_SDRAM_1        0x30000000

15      * #define CONFIG_SYS_SDRAM_BASE    PHYS_SDRAM_1

16      * #define CONFIG_SYS_INIT_SP_ADDR    (CONFIG_SYS_SDRAM_BASE + 0x1000 - GENERATED_GBL_DATA_SIZE)

17      * 

18      * CONFIG_SYS_INIT_SP_ADDR = 0x30000000 + 0x1000 - 192(0xc0) = 0x30000f40

19      */

20     ldr    sp, =(CONFIG_SYS_INIT_SP_ADDR)        /* 设置CFIG_SYS_INIT_SP_ADDR定义的地址,include/configs/jz2440.h中定义 */

21 

22     /* sp 的8字节对齐 */

23     bic    sp, sp, #7    /* 8-byte alignment for ABI compliance */

24 

25     mov    r0, sp                    /* r0 = sp */

26     bl    board_init_f_mem        /*跳转到 board_init_f_mem 执行*/

27     mov    sp, r0                    

28 

29     mov    r0, #0

30     bl    board_init_f            /* 调用单板的初始化函数,跳转到 borad_init_f 处执行 */

二、代码流程 

  start.S中执行到了 bl _main,跳转到_main,_main函数入口在crt0.S (archarmlib) 中。


  1.crt0.S  


 1 ENTRY(_main)

 2 

 3 /*

 4  * Set up initial C runtime environment and call board_init_f(0).

 5  * 初始化C运行环境并且调用 board_init_f(0) 函数

 6  */

 7 

 8  /*

 9   * 初始化栈地址

10   */

11     /* Generic-asm-offsets.h (includegenerated)

12      * #define GENERATED_GBL_DATA_SIZE 192

13      * JZ2440.h(includeconfig)

14      * #define PHYS_SDRAM_1        0x30000000

15      * #define CONFIG_SYS_SDRAM_BASE    PHYS_SDRAM_1

16      * #define CONFIG_SYS_INIT_SP_ADDR    (CONFIG_SYS_SDRAM_BASE + 0x1000 - GENERATED_GBL_DATA_SIZE)

17      * 

18      * CONFIG_SYS_INIT_SP_ADDR = 0x30000000 + 0x1000 - 192(0xc0) = 0x30000f40

19      */

20     ldr    sp, =(CONFIG_SYS_INIT_SP_ADDR)        /* 设置CFIG_SYS_INIT_SP_ADDR定义的地址,include/configs/jz2440.h中定义 */

21 

22     /* sp 的8字节对齐 */

23     bic    sp, sp, #7    /* 8-byte alignment for ABI compliance */

24 

25     mov    r0, sp                    /* r0 = sp */

26     bl    board_init_f_mem        /*跳转到 board_init_f_mem 执行*/

27     mov    sp, r0                    

28 

29     mov    r0, #0

30     bl    board_init_f            /* 调用单板的初始化函数,跳转到 borad_init_f 处执行 */


  执行到 board_init_f 处,则跳转到Board_f.c (common) 中去执行。


  2.baord_init_f


 1 /*

 2  * 单板的初始化函数

 3  */

 4 void board_init_f(ulong boot_flags)

 5 {

 6     gd->flags = boot_flags;

 7     gd->have_console = 0;

 8 

 9     if (initcall_run_list(init_sequence_f))

10         hang();

11 

12 #if !defined(CONFIG_ARM) && !defined(CONFIG_SANDBOX) &&

13         !defined(CONFIG_EFI_APP)

14     /* NOTREACHED - jump_to_copy() does not return */

15     hang();

16 #endif

17 }


  在其中最重要的函数则是 initcall_run_list(init_sequence_f) ,init_sequence_f 执行单板的各种初始化任务,如下:


  1 static init_fnc_t init_sequence_f[] = {

  2     //gd->mon_len = (ulong)&__bss_end - CONFIG_SYS_MONITOR_BASE;

  3     //CONFIG_SYS_MONITOR_BASE = _start = 0

  4     //设置gd->mon_len为编译出来的u-boot.bin+bss段的大小

  5     setup_mon_len,    

  6     initf_malloc,

  7     initf_console_record,

  8     //这个函数应该是留给移植人员使用的,里面什么都没做,而且被__weak修饰,

  9     //所以我们可以在别的地方重新定义这个函数来取代它

 10     arch_cpu_init,        /* basic arch cpu dependent setup:CPU初始化*/

 11     initf_dm,

 12     arch_cpu_init_dm,    //同上

 13     mark_bootstage,        /* need timer, go after init dm */

 14 #if defined(CONFIG_BOARD_EARLY_INIT_F)

 15     /* 初始化CPU时钟和各种IO(待修改) */

 16     board_early_init_f,

 17 #if defined(CONFIG_ARM) || defined(CONFIG_MIPS) ||

 18         defined(CONFIG_BLACKFIN) || defined(CONFIG_NDS32) ||

 19         defined(CONFIG_SPARC)

 20     /* 初始化定时器 */

 21     timer_init,        /* 初始化定时器 */ 

 22 #endif

 23     env_init,        /* 初始化环境变量 */ 

 24     init_baud_rate,        /* 初始化波特率为: 115200 */

 25     serial_init,        /* 设置串口通讯 */

 26     console_init_f,        /* stage 1 init of console */

 27     // 打印版本信息,你可以修改include/version.h中的CONFIG_IDENT_STRING选项,

 28     // 加入自己的身份信息 

 29     display_options,    /* say that we are here */

 30     //打印bss段信息及text_base, 需要 #define DEBUG

 31     display_text_info,    /* show debugging info if required */

 32     print_cpuinfo,        /* 打印CPUID和时钟频率 */

 33     INIT_FUNC_WATCHDOG_INIT

 34         INIT_FUNC_WATCHDOG_RESET

 35     announce_dram_init,    //输出"DRAM: " 然后在下面进行SDRAM参数设置

 36     /* TODO: unify all these dram functions? */

 37 #if defined(CONFIG_ARM) || defined(CONFIG_X86) || defined(CONFIG_NDS32) ||

 38         defined(CONFIG_MICROBLAZE) || defined(CONFIG_AVR32)

 39     dram_init,        /* 在smdk2440.c中定义,配置SDRAM大小,可根据实际进行修改 */

 40 #endif

 41     INIT_FUNC_WATCHDOG_RESET

 42     INIT_FUNC_WATCHDOG_RESET

 43     /*

 44      * Now that we have DRAM mapped and working, we can

 45      * relocate the code and continue running from DRAM.

 46      *

 47      * Reserve memory at end of RAM for (top down in that order):

 48      *  - area that won't get touched by U-Boot and Linux (optional)

 49      *  - kernel log buffer

 50      *  - protected RAM

 51      *  - LCD framebuffer

 52      *  - monitor code

 53      *  - board info struct

 54      */

 55     setup_dest_addr,    //将gd->relocaddr、gd->ram_top指向SDRAM最顶端           

 56     reserve_round_4k,    //gd->relocaddr 4K对齐

 57 #if !(defined(CONFIG_SYS_ICACHE_OFF) && defined(CONFIG_SYS_DCACHE_OFF)) &&

 58         defined(CONFIG_ARM)

 59     //gd->arch.tlb_size = PGTABLE_SIZE; 预留16kb的MMU页表

 60     //gd->relocaddr -= gd->arch.tlb_size;

 61     //gd->relocaddr &= ~(0x10000 - 1); 64kb对齐

 62     //gd->arch.tlb_addr = gd->relocaddr;

 63     reserve_mmu,

 64 #endif

 65 #if defined(CONFIG_VIDEO) && (!defined(CONFIG_PPC) || defined(CONFIG_8xx)) &&

 66         !defined(CONFIG_ARM) && !defined(CONFIG_X86) &&

 67         !defined(CONFIG_BLACKFIN) && !defined(CONFIG_M68K)

 68     reserve_video,

 69 #endif

 70 #if !defined(CONFIG_BLACKFIN)

 71     //gd->relocaddr -= gd->mon_len;    一开始设置的u-boot.bin + bss段长度

 72     //gd->relocaddr &= ~(4096 - 1);    4k对齐,这是最终重定位地址

 73     //gd->start_addr_sp = gd->relocaddr;  设置重定位后的栈指针

 74     reserve_uboot,

 75 #endif

 76 #ifndef CONFIG_SPL_BUILD

 77     //gd->start_addr_sp = gd->start_addr_sp - TOTAL_MALLOC_LEN; 

 78     //预留4MB MALLOC内存池

 79     reserve_malloc,

 80     //gd->start_addr_sp -= sizeof(bd_t);  预留空间给重定位后的gd_t->bd

[1] [2] [3]
关键字:u-boot  移植  重定位 引用地址:u-boot移植(四)---修改前工作:代码流程分析3---代码重定位

上一篇:u-boot移植(五)---代码修改---时钟修改、SDRAM
下一篇:u-boot移植(三)---修改前工作:代码流程分析2

推荐阅读最新更新时间:2024-11-11 10:22

第四章、TIny4412 U-BOOT移植四 配置时钟频率源码分析
上篇讲了配置时钟的原理,今天就结合源码具体分析一下。在U-Boot的源码中,系统时钟的初始化是放在板文件夹下的(board/Samsung/mytiny4412)的clock_init_zthtiny4412.S文件中的system_clock_init函数中。我们的Tiny4412是拷贝的smdk4212来的,所以,大家可以先参看smdk4212的clock_init_smdk4212.S文件中的system_clock_init函数来分析,完了再修改适合自己板子的程序。 对于芯片手册中每一个模块的学习,在了解前面的基本原理后,关键的寄存器的操作,可以先浏览一下这个模块的所有寄存器的简介,对各个寄存器的作用做到心中有数,这样
[单片机]
第四章、TIny4412 <font color='red'>U-BOOT</font><font color='red'>移植</font>四 配置时钟频率源码分析
如何将ThreadX移植到STM32H7平台
前面我们将ThreadX成功移植到了STM32F4平台,但这只是我们的部分应用。我们希望将ThreadX的优势发挥到我们的更多应用中,所以在这一篇中我们就来实现将ThreadX移植到STM32H7平台中。 1、前期准备   在开始将ThreadX移植到STM32H7平台之前,我们需要做一些软硬件方面的准备。   首先,我们需要准备STM32H7的硬件平台。这次我们采用STM32H750VBT6为控制单元来作为目标平台。这是一款我们在实际项目中使用的,经过验证的,硬件能够稳定运行的平台。   其次,我们需要准备相应的软件资源,也就是ThreadX的源码。ThreadX的源码已经开源到Github上,其地址为: , /
[单片机]
如何将ThreadX<font color='red'>移植</font>到STM32H7平台
Linux2.6.32移植到MINI2440(1)初步移植
根据友善之臂提供的手册——《MINI2440 Linux移植开发实战指南-内核部分-2010.9.9》以及网络上一些帖子,在此对他们的工作表示感谢,基本过程大都一致,主要是为了熟悉内核的基本移植方法,目的是为了能够生成一个MINI2440上可用的内核。 开发环境: 主机:fedora 14 虚拟机:vmware workstation 10 交叉编译工具:arm-linux-gcc 4.3.2 开发板:mini2440(2m nor ,64m sdram,256m nand) 一、下载源码包解压到指定位置 下载地址:http://www.kernel.org/pub/l
[单片机]
ok6410 u-boot-2012.04.01移植六完善MLC NAND支持
继ok6410 u-boot-2012.04.01移植四、五后,开发板基本已支持MLC NAND,支持DM9000.但是通过NAND命令更新u-boot到NAND,还存在问题,需要根据u-boot的nand命令继续修改,最终实现通过网卡tftp程序到内存,接着通过NAND命令写到NAND。 开发环境: 系统:ubuntu 10.04.4 单板:ok6410 NAND FLASH:K9GAG08U0D 2048MB NOR Flash:EN29LV160AB 2MB DDR:K4X1G163PCX2 256MB NET:DM9000AEP 编译器:arm-linux-gcc-4.3.2 搭建开发环境详见ubuntu 10.04.4开
[单片机]
iptables1.4.12.1移植到arm平台
平台介绍:主机端 ubuntu11.04 开发板内核 linux-2.6.30 iptables版本 1.4.12.1 移植过程: 内核需要对iptables的支持并加上nat功能 Networking support --- Networking options --- Network packet filtering framework (Netfilter) │ │ --- Network packet filtering framework (Netfilter) │ │ │ │ Network packet fi
[单片机]
tslib移植中环境变量编辑
(1)将/usr/local/tslib下的所有文件复制到移植系统文件中/usr/local (2)编辑移植系统中/etc/profile添加触摸屏支持内容: 在/etc/profile文件中设置tslib环境变量: # 指定tslib主目录位置 export TSLIB_ROOT=/home/system/tslib # 指定触摸屏设备 export TSLIB_TSDEVICE=/dev/input/touchscreen0 # 指定触摸屏校准文件pointercal存放位置 export TSLIB_CALIBFILE=/etc/pointercal # 指定TSLIB配置文件的位置 export TSLIB_CONFFILE
[单片机]
Linux-4.9.2内核在mini2440上的移植(三)——编译环境测试
3.1 linux-4.9.2源码获取 为什么选择4.9.2移植呢? 因为太新的linux源码yaffs文件系统跟不上,编译过程会导致大量错误无法使用,所以选择比较新的源码就可以了。具体的说明到移植yaffs文件系统时再说。 我们的工作目录定在/root下面,进入到目录 root@ubuntu:/home/ubuntu# cd /root (1)下载linux4.9.2源码 root@ubuntu:~# wget https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.9.2.tar.gz (2)解压源码 root@ubuntu:~ # tar -zx
[单片机]
Linux-4.9.2内核在mini2440上的<font color='red'>移植</font>(三)——编译环境测试
内核移植(1)首次生成uImage映象文件
1、先修改顶层Makefile,如下: ARCH ?= $ (SUBARCH) CROSS_COMPILE ?= 改为: ARCH ?= arm CROSS_COMPILE ?= arm-linux- 2、执行make s3c2410_defconfig 3、make uImage,首次编译完内核用了4分钟,尾部出现如下信息: LD arch/arm/boot/compressed/vmlinux OBJCOPY arch/arm/boot/zImage Kernel: arch/arm/boot/zImage is ready UIMAGE arch/arm/boot
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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