写在前面:

我的博客已迁移至自建服务器:博客传送门,CSDN博客暂时停止,如有机器学习方面的兴趣,欢迎来看一看。

此外目前我在gitHub上准备一些李航的《统计学习方法》的实现算法,目标将书内算法全部手打实现,欢迎参观并打星。GitHib传送门

正文

1.在make的过程中,最后会显示链接文件,如下

UNDEF_SYM=`arm-linux-objdump -x board/samsung/smdk2410/libsmdk2410.o api/libapi.o arch/arm/cpu/arm920t/libarm920t.o arch/arm/cpu/arm920t/s3c24x0/libs3c24x0.o arch/arm/lib/libarm.o common/libcommon.o disk/libdisk.o drivers/bios_emulator/libatibiosemu.o drivers/block/libblock.o drivers/dma/libdma.o drivers/fpga/libfpga.o drivers/gpio/libgpio.o drivers/hwmon/libhwmon.o drivers/i2c/libi2c.o drivers/input/libinput.o drivers/misc/libmisc.o drivers/mmc/libmmc.o drivers/mtd/libmtd.o drivers/mtd/nand/libnand.o drivers/mtd/onenand/libonenand.o drivers/mtd/spi/libspi_flash.o drivers/mtd/ubi/libubi.o drivers/net/libnet.o drivers/net/phy/libphy.o drivers/pci/libpci.o drivers/pcmcia/libpcmcia.o drivers/power/libpower.o drivers/rtc/librtc.o drivers/serial/libserial.o drivers/spi/libspi.o drivers/twserial/libtws.o drivers/usb/eth/libusb_eth.o drivers/usb/gadget/libusb_gadget.o drivers/usb/host/libusb_host.o drivers/usb/musb/libusb_musb.o drivers/usb/phy/libusb_phy.o drivers/usb/ulpi/libusb_ulpi.o drivers/video/libvideo.o drivers/watchdog/libwatchdog.o fs/cramfs/libcramfs.o fs/ext2/libext2fs.o fs/fat/libfat.o fs/fdos/libfdos.o fs/jffs2/libjffs2.o fs/reiserfs/libreiserfs.o fs/ubifs/libubifs.o fs/yaffs2/libyaffs2.o lib/libfdt/libfdt.o lib/libgeneric.o lib/lzma/liblzma.o lib/lzo/liblzo.o lib/zlib/libz.o net/libnet.o post/libpost.o | sed  -n -e 's/.*\(__u_boot_cmd_.*\)/-u\1/p'|sort|uniq`; cd /work/system/u-boot-2012.04.01 && arm-linux-ld  -pie -T u-boot.lds -Bstatic -Ttext 0x0 $UNDEF_SYM arch/arm/cpu/arm920t/start.o --start-group api/libapi.o arch/arm/cpu/arm920t/libarm920t.o arch/arm/cpu/arm920t/s3c24x0/libs3c24x0.o arch/arm/lib/libarm.o common/libcommon.o disk/libdisk.o drivers/bios_emulator/libatibiosemu.o drivers/block/libblock.o drivers/dma/libdma.o drivers/fpga/libfpga.o drivers/gpio/libgpio.o drivers/hwmon/libhwmon.o drivers/i2c/libi2c.o drivers/input/libinput.o drivers/misc/libmisc.o drivers/mmc/libmmc.o drivers/mtd/libmtd.o drivers/mtd/nand/libnand.o drivers/mtd/onenand/libonenand.o drivers/mtd/spi/libspi_flash.o drivers/mtd/ubi/libubi.o drivers/net/libnet.o drivers/net/phy/libphy.o drivers/pci/libpci.o drivers/pcmcia/libpcmcia.o drivers/power/libpower.o drivers/rtc/librtc.o drivers/serial/libserial.o drivers/spi/libspi.o drivers/twserial/libtws.o drivers/usb/eth/libusb_eth.o drivers/usb/gadget/libusb_gadget.o drivers/usb/host/libusb_host.o drivers/usb/musb/libusb_musb.o drivers/usb/phy/libusb_phy.o drivers/usb/ulpi/libusb_ulpi.o drivers/video/libvideo.o drivers/watchdog/libwatchdog.o fs/cramfs/libcramfs.o fs/ext2/libext2fs.o fs/fat/libfat.o fs/fdos/libfdos.o fs/jffs2/libjffs2.o fs/reiserfs/libreiserfs.o fs/ubifs/libubifs.o fs/yaffs2/libyaffs2.o lib/libfdt/libfdt.o lib/libgeneric.o lib/lzma/liblzma.o lib/lzo/liblzo.o lib/zlib/libz.o net/libnet.o post/libpost.o board/samsung/smdk2410/libsmdk2410.o --end-group /work/system/u-boot-2012.04.01/arch/arm/lib/eabi_compat.o  -L /usr/local/arm/4.3.2/bin/../lib/gcc/arm-none-linux-gnueabi/4.3.2/armv4t -lgcc -Map u-boot.map -o u-boot

其中 arm-linux-ld -pie -T u-boot.lds -Bstatic -Ttext 0x0 $UNDEF_SYM arch/arm/cpu/arm920t/start.o --start-group api/libapi.o arch/arm/cpu/arm920t/libarm920t.o 这句话就是链接,打开start.S,看看里面是什么内容。

2.分析start.S
1.进入管理模式,代码开始执行,

start_code:/** set the cpu to SVC32 mode*/mrs    r0, cpsrbic r0, r0, #0x1forr    r0, r0, #0xd3msr    cpsr, r02.关闭看门狗
ldr r0, =pWTCONmov r1, #0x0str r1, [r0]3.屏蔽中断
/** mask all IRQs by setting all bits in the INTMR - default*/mov   r1, #0xffffffffldr  r0, =INTMSKstr r1, [r0]4.设置分频系数
/* FCLK:HCLK:PCLK = 1:2:4 *//* default FCLK is 120 MHz ! */ldr r0, =CLKDIVNmov    r1, #3str   r1, [r0]4.板子初始化,这里开始使用C函数,所以要初始化栈
call_board_init_f:ldr   sp, =(CONFIG_SYS_INIT_SP_ADDR)bic  sp, sp, #7 /* 8-byte alignment for ABI compliance */ldr r0,=0x00000000bl   board_init_f

5.进入call_board_init_f函数
这里初始化了一个指针,指向了栈的同一位置,他们并不冲突,栈是向下 增长的,指针是向上的。

gd = (gd_t *) ((CONFIG_SYS_INIT_SP_ADDR) & ~0x07);

可以看到存了一些数据进入,关于bss段以及一些其他信息的,还有很多gd的配置,没有贴出来,占了挺大一段的

gd->mon_len = _bss_end_ofs;

这里面有这句话,init_fnc_ptr 是一个指针,init_sequence是一个数组,里面有很多函数,这个for就是去循环执行这些函数

for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {if ((*init_fnc_ptr)() != 0) {hang ();}}

里面都是条件编译,我把没宏定义的代码段都去掉了,留下的函数是执行函数,看起来比较方便

init_fnc_t *init_sequence[] = {#if defined(CONFIG_BOARD_EARLY_INIT_F)board_early_init_f,
#endiftimer_init,       /* initialize timer */
#endifenv_init,     /* initialize environment */init_baudrate,      /* initialze baudrate settings */serial_init,       /* serial communications setup */console_init_f,        /* stage 1 init of console */display_banner,        /* say that we are here */
#if defined(CONFIG_DISPLAY_CPUINFO)print_cpuinfo,       /* display cpu info (and speed) */
#endifdram_init,        /* configure available RAM banks */NULL,
};

5.1 board_early_init_f,板子早期初始化函数
设置了分频系数,有点奇怪汇编里面已经设置过了,我要去查一查两个哪个是对的

writel(0xFFFFFF, &clk_power->locktime);/* configure MPLL */writel((M_MDIV << 12) + (M_PDIV << 4) + M_SDIV,&clk_power->mpllcon);/* some delay between MPLL and UPLL */pll_delay(4000);/* configure UPLL */writel((U_M_MDIV << 12) + (U_M_PDIV << 4) + U_M_SDIV,&clk_power->upllcon);GPIO端口的初始化
/* set up the I/O ports */writel(0x007FFFFF, &gpio->gpacon);writel(0x00044555, &gpio->gpbcon);writel(0x000007FF, &gpio->gpbup);writel(0xAAAAAAAA, &gpio->gpccon);writel(0x0000FFFF, &gpio->gpcup);writel(0xAAAAAAAA, &gpio->gpdcon);writel(0x0000FFFF, &gpio->gpdup);writel(0xAAAAAAAA, &gpio->gpecon);writel(0x0000FFFF, &gpio->gpeup);writel(0x000055AA, &gpio->gpfcon);writel(0x000000FF, &gpio->gpfup);writel(0xFF95FFBA, &gpio->gpgcon);writel(0x0000FFFF, &gpio->gpgup);writel(0x002AFAAA, &gpio->gphcon);writel(0x000007FF, &gpio->gphup);

5.2 在int timer_init(void)里面,有一个get_PCLK()函数被调用,再往里走get_HCLK(),再往里走

ulong get_HCLK(void)
{struct s3c24x0_clock_power *clk_power = s3c24x0_get_base_clock_power();
#ifdef CONFIG_S3C2440switch (readl(&clk_power->clkdivn) & 0x6) {default:case 0:return get_FCLK();case 2:return get_FCLK() / 2;case 4:return (readl(&clk_power->camdivn) & (1 << 9)) ?get_FCLK() / 8 : get_FCLK() / 4;case 6:return (readl(&clk_power->camdivn) & (1 << 8)) ?get_FCLK() / 6 : get_FCLK() / 3;}

可以看出里面是有关于2440的宏定义的,当前并没有被定义,所以之后要把这段代码宏定义了,才能执行。
到这里已经有点懵逼了,uboot的代码绕圈程度有点大了。要改的地方感觉挺多的,移植的难度应该会很大。

6.在board_init_f函数的最后面relocate_code(addr_sp, id, addr);重定位代码。
在反汇编文件中一开始的代码位置就是0,让人感觉不需要重定位了。

u-boot:     file format elf32-littlearmDisassembly of section .text:00000000 <__image_copy_start>:0:   ea000013    b   54 <start_code>4: e59ff014    ldr pc, [pc, #20]   ; 20 <_undefined_instruction>8:   e59ff014    ldr pc, [pc, #20]   ; 24 <_software_interrupt>c:  e59ff014    ldr pc, [pc, #20]   ; 28 <_prefetch_abort>10: e59ff014    ldr pc, [pc, #20]   ; 2c <_data_abort>14: e59ff014    ldr pc, [pc, #20]   ; 30 <_not_used>18:   e59ff014    ldr pc, [pc, #20]   ; 34 <_irq>1c:    e59ff014    ldr pc, [pc, #20]   ; 38 <_fiq>00000020 <_undefined_instruction>:20:    000001e0    .word   0x000001e0

实际上是链接的时候可以看到 arm-linux-ld -pie -T u-boot.lds -Bstatic -Ttext ,输入命令arm-linux-ld --help | grep pie,搜索pie命令,回复-pie, --pic-executable Create a position independent executable,也就是说链接的时候加上pie可以生成位置无关的可执行程序。

移植uboot第二步:分析uboot相关推荐

  1. 嵌入式uboot移植之三星官方uboot开始移植

    注:以下内容来自朱老师物联网课件 1. 移植前的准备工作 1.1 获取三星移植过的uboot源代码 我们使用的是老师提供的android_uboot_smdkv210.tar.bz2,文件存储在课件2 ...

  2. 《11.uboot的移植-从三星官方uboot开始移植》

    转自 https://edu.csdn.net/lecturer/505 朱老师物联网大讲堂 <11.uboot的移植-从三星官方uboot开始移植> 第一部分.章节目录 2.11.1.移 ...

  3. 《11.uboot的移植1-从三星官方uboot开始移植》

    转自 https://edu.csdn.net/lecturer/505 朱老师物联网大讲堂 <11.uboot的移植1-从三星官方uboot开始移植> 第一部分.章节目录 2.11.1. ...

  4. U-Boot移植教程之一:U-Boot分析与启动过程

    内容来自 韦东山<嵌入式Linux应用开发完全手册> 一.Bootloader的引出 当系统上电时,并不是直接进入Linux系统的,而是需要先执行一段程序来把单片机的硬件外围初始化好,比如 ...

  5. 【u-boot】uboot代码简要分析 (u-boot 移植)

    uboot代码简要分析 (u-boot 移植) 2012-12-19 22:46:04 [转] 先来看看源码目录结构,再按照代码的执行顺序简单地分析源码 1.U-boot源码整体框架 源码解压以后,我 ...

  6. 嵌入式linux开发uboot移植(三)——uboot启动过程源码分析

    一.uboot启动流程简介 与大多数BootLoader一样,uboot的启动过程分为BL1和BL2两个阶段.BL1阶段通常是开发板的配置等设备初始化代码,需要依赖依赖于SoC体系结构,通常用汇编语言 ...

  7. ARM uboot 的移植3 -从 uboot 官方标准uboot开始移植

    一.选择合适的官方原版 uboot 1.官方原版 uboot 的版本 (1) 版本号.刚开始是 1.3.4 样式,后来变成 2009.08 样式. (2) 新版和旧版的差别.uboot 的架构很早就定 ...

  8. linux uboot 源码分析,UBoot源码分析1.pdf

    UBoot源码分析1 • UBoot源码解析(一) 主要内容 • 分析UBoot是如何引导Linux内核 • UBoot源码的一阶段解析 BootLoader概念 • Boot Loader 就是在操 ...

  9. (三) u-boot 启动分析_第一阶段

    参考内容点此跳转 本文重点在于分析 uboot 启动流程以及 uboot 自身的细节,比如栈空间的划分.如何设置 tag .如何添加一个自定义命令等.但是不涉及基本的硬件驱动的分析,比如内存初始化.时 ...

最新文章

  1. python代码大全o-Python简单I/O操作示例
  2. 自动完形填空系统构建
  3. python与sap_Python结合SAP GUI Script操作sap的简易教程
  4. mysql还原txt表的字段结构,mysql 修改表结构(转)
  5. Android 面试常问七道题
  6. SDK中利用COM打印helloworld时报错DONE pin is not high on target FPGA的一种可能的解决办法
  7. 九章算法班L6 Graph Search
  8. 影视剪辑,剪了这么久视频,还不知道pr剪辑的这些快捷键
  9. visio画图复制粘贴到word_Visio 2010怎么复制图片 Visio粘贴图形到其它office程序
  10. [XCTF-Reverse] 13-18
  11. Android有效解决加载大图片内存溢出问题及优化虚拟机内存
  12. 3DMax2021建模入门篇
  13. Android 如何OTG 鼠标,otg键盘和鼠标映射软件v5.2.0 Android版
  14. Pytorch 3D卷积
  15. 第十二讲 dom对象(DOM对象、document对象的常用方法、节点、查找结点、 查看/修改/删除属性节点、创建和增加节点)
  16. python百度地图poi_百度地图数据采集手把手教,从此POI数据不再是愁
  17. eterm共享/放大/API接口
  18. NI HIL测试平台环境部署(血与泪的经验)
  19. 解决:写的CSDN博客百度搜索不到 (网站/博客/链接 提交百度检索方法)
  20. RabbitMQ,RocketMQ,Kafka 事务性,消息丢失,消息顺序性和消息重复发送的处理策略

热门文章

  1. LeetCode Remove Element
  2. git创建、切换、合并、删除分支
  3. python 基础语法练习回顾
  4. 【Kafka】Kafka为什么要加入分区的概念
  5. UE4 custom depth 自定义深度
  6. 推荐15款响应式的 jQuery Lightbox 插件
  7. 需要熟悉的几个调试命令:objdump/pmap/ldd/stace
  8. Linux命令删除某目录下的所有.svn文件
  9. Java 输入 输出
  10. python无法导入pyaudio_python – pyaudio无法导入_portaudio