u-boot-2014-07代码流程分析

jiau jiau     2023-03-20     541

关键词:

技术图片

前言

以前接触到的u-boot启动方式只有Flash和Nand Flash这两种方式,最近接触是SD卡启动方式,SoC是S5P4418,启动方式也第一次接触到,根据S5P4418用户手册可以找到系统使用SD卡启动时,片内iROM内固化的代码会自动映射到0x00地址,也被称为第一阶段引导程序,该程序会检测启动引脚配置,然后从SD卡读取block1~block32内的程序到内置SRAM中执行,读取出来并执行的这段程序被称为第二阶段引导程序,由于其最大为16KB,无法存放完整的u-boot。以上两个引导程序均由芯片厂商提供,没有源码,不开源。第二阶段引导程序从SD卡中加载u-boot到DRAM中执行,至此u-boot才开始登场。

SDHCBOOT --> 2nboot --> u-boot

代码分析

程序入口

由于S5P4418采用的指令集为ARMv7,通常应该去该文件arch/arm/cpu/armv7下寻找该SoC,然而并没有,通过查看board.cfg可以看到它的CPU类型被定义为了slsiap,通过查看arch/arm/cpu/slsiap也确实存在s5p4418文件夹。

# Status, Arch, CPU:SPLCPU, SoC, Vendor
  Active  arm  slsiap  s5p4418  s5p4418

接下来就是找到第一个执行的程序在哪里文件里,即找到程序入口,查看slsiap下的链接文件

.text :

    *(.__image_copy_start)
    SDIR/start.o (.text*)
    *(.text*)

而SDIR是什么并不知道,打开同文件夹下的config.mk

SDIR=arch/arm/cpu$(if $(CPU),/$(CPU),)$(if $(SOC),/$(SOC),)

替换变量之后

SDIR=arch/arm/cpu/slsiap/s5p4418

即第一个文件是arch/arm/cpu/slsiap/s5p4418/start.S

start.S

不同 CPU 的改文件大致功能都大同小异,设置中断向量表,将 CPU 设置为 SVC 模式,然后设置 CP15,设置 Cache,初始化内存,然后对代码进行重定位,之后开始清理 bss 段,为准备 C 语言运行环境,然后设置栈指针,执行 board_init_f 函数填充 global_data 结构体数据,最后执行 board_init_r,离开start.S不再返回。

board_init_r

该函数中调用的两个有意思的函数:serial_initialize、mmc_initialize。

void serial_initialize(void)

    mpc8xx_serial_initialize();
    ...省略若干类似函数...
    s5p_serial_initialize();
    ...省略若干类似函数...
    arc_serial_initialize();

可以看到,该函数中不加判断的把各种种类的串口初始化都给写上,也没有使用宏去自动选择使用哪个,给人的第一感觉就是这不是浪费存储空间么,继续查看该函数所在文件其他代码可以发现

/**
 * serial_initfunc() - Forward declare of driver registration routine
 * @name:    Name of the real driver registration routine.
 *
 * This macro expands onto forward declaration of a driver registration
 * routine, which is then used below in serial_initialize() function.
 * The declaration is made weak and aliases to serial_null() so in case
 * the driver is not compiled in, the function is still declared and can
 * be used, but aliases to serial_null() and thus is optimized away.
 */

#define serial_initfunc(name)                    
    void name(void)                     
        __attribute__((weak, alias("serial_null")));


serial_initfunc(mpc8xx_serial_initialize);
...省略若干类似函数...
serial_initfunc(s5p_serial_initialize);
...省略若干类似函数...
serial_initfunc(arc_serial_initialize);

英文注释说的很清楚了,这是在利用编译器特性进行自动优化的,使用 __weak 属性先声明驱动程序,因为编译程序之前会先配置程序,在编译的时候在配置阶段产生的宏在预编译阶段会决定哪些驱动程序被编译进来,比如 S5P4418 被选择时,相关的串口驱动 s5p_serial_initialize 就会编译进来,由于其声明为 __weak 属性,编译时会自动覆盖掉前项声明的函数,这样函数 serial_initialize 就不会出现把不必要的程序编译进来的情况了。

mmc_initialize 函数的分析见下回分解吧~

车机蓝牙通话流程分析的流程分析(代码片段)

...adSetClient端通话的传递_天花板之恋的博客-CSDN博客Android源代码中,如果通话状态有改变,会沿着这样的顺序传递:蓝牙chip>>HCI接口>>BlueDroid协议栈>>Bluetooth>>广播传递>>Telec 查看详情

车机蓝牙通话流程分析的流程分析(代码片段)

...adSetClient端通话的传递_天花板之恋的博客-CSDN博客Android源代码中,如果通话状态有改变,会沿着这样的顺序传递:蓝牙chip>>HCI接口>>BlueDroid协议栈>>Bluetooth>>广播传递>>Telecom,2. bluetooth上层 查看详情

flutterandroid端flutterenginejava相关流程源码分析(代码片段)

Flutter系列文章连载~《FlutterAndroid工程结构及应用层编译源码深入分析》《Flutter命令本质之Fluttertools机制源码深入分析》《Flutter的runApp与三棵树诞生流程源码分析》《FlutterAndroid端Activity/Fragment流程源码分析》《FlutterAndroid... 查看详情

flutterandroid端flutterview相关流程源码分析(代码片段)

Flutter系列文章连载~《FlutterAndroid工程结构及应用层编译源码深入分析》《Flutter命令本质之Fluttertools机制源码深入分析》《Flutter的runApp与三棵树诞生流程源码分析》《FlutterAndroid端Activity/Fragment流程源码分析》《FlutterAndroid... 查看详情

flutterandroid端flutterenginejava相关流程源码分析(代码片段)

Flutter系列文章连载~《FlutterAndroid工程结构及应用层编译源码深入分析》《Flutter命令本质之Fluttertools机制源码深入分析》《Flutter的runApp与三棵树诞生流程源码分析》《FlutterAndroid端Activity/Fragment流程源码分析》《FlutterAndroid... 查看详情

reactnative源码分析——nativeview创建流程(代码片段)

1、ReactNative源码分析(一)——启动流程2、ReactNative源码分析(二)——通信机制3、ReactNative源码分析(三)——NativeView创建流程4、ReactNative源码分析(四)——任务调度5、ReactNative源码分析(... 查看详情

reactnative源码分析——nativeview创建流程(代码片段)

1、ReactNative源码分析(一)——启动流程2、ReactNative源码分析(二)——通信机制3、ReactNative源码分析(三)——NativeView创建流程4、ReactNative源码分析(四)——任务调度5、ReactNative源码分析(... 查看详情

bsp开发之kernellinux启动流程以及编译流程分析(代码片段)

文章目录linux顶层Makefile分析make过程分析子文件夹编译Makefile.build编译出子文件build-in.o过程分析vmlinux、Image,zImage、uImage的区别内核启动流程分析linux顶层Makefile分析MAKEFLAGS+=-rR#静默输出makeV=1静默输出ifeq("$(originV)&... 查看详情

flutterandroid端activity/fragment流程源码分析(代码片段)

Flutter系列文章连载~《FlutterAndroid工程结构及应用层编译源码深入分析》《Flutter命令本质之Fluttertools机制源码深入分析》《Flutter的runApp与三棵树诞生流程源码分析》《FlutterAndroid端Activity/Fragment流程源码分析》《FlutterAndroid... 查看详情

flutterandroid端flutterinjector及依赖流程源码分析(代码片段)

Flutter系列文章连载~《FlutterAndroid工程结构及应用层编译源码深入分析》《Flutter命令本质之Fluttertools机制源码深入分析》《Flutter的runApp与三棵树诞生流程源码分析》《FlutterAndroid端Activity/Fragment流程源码分析》《FlutterAndroid... 查看详情

flutterandroid端flutterinjector及依赖流程源码分析(代码片段)

Flutter系列文章连载~《FlutterAndroid工程结构及应用层编译源码深入分析》《Flutter命令本质之Fluttertools机制源码深入分析》《Flutter的runApp与三棵树诞生流程源码分析》《FlutterAndroid端Activity/Fragment流程源码分析》《FlutterAndroid... 查看详情

日志分析大致流程(代码片段)

简单概述:生产过程中会生成大量的系统日志,应用程序日志,安全日志等等,通过对日志的分析可以了解服务器的负载,健康状况,可以分析客户的分布情况,客户的行为,甚至基于这些分析可以做出预测。一般采集流程:日... 查看详情

uvccamera视频数据流程代码分析(代码片段)

iso_stream_layoutStartIsoStreamActivityUvc/StartIsoStreamActivityUsbIsoImageView/mUVCCameraView数据processReceivedVideoFrameYuvprocessReceivedVideoFrameYuvFromJniretrievedStreamActivityFrameFromLibUsbli 查看详情

数据分析流程(代码片段)

目录数据分析流程数据介绍项目流程数据分析流程数据介绍数据:数据科学(英语:DataScience),又称资料科学,是一门利用数据学习知识的学科,其目标是通过从数据中提取出有价值的部分来生产数据产品。它结合了诸多领域... 查看详情

cephpg创建流程源码分析(代码片段)

...建流程。以下源码分析以函数调用栈展开分析:ps:以下代码以L版本为准;一、mon节点处理1.函数调用栈11.voidOSDMonitor::update_from_paxos()->PGMonitor::check_osd_map()->voidPGMapUpdater::r 查看详情

flutterandroid端activity/fragment流程源码分析(代码片段)

Flutter系列文章连载~《FlutterAndroid工程结构及应用层编译源码深入分析》《Flutter命令本质之Fluttertools机制源码深入分析》《Flutter的runApp与三棵树诞生流程源码分析》《FlutterAndroid端Activity/Fragment流程源码分析》背景前面文章... 查看详情

62.imageloader源代码-流程分析(代码片段)

一.ImageLoader简介Androidlibrary#1onGitHub.UILaimstoprovideapowerful,flexibleandhighlycustomizableinstrumentforimageloading,cachinganddisplaying.Itprovidesalotofconfigurationoptionsandgoodcontroloverthei 查看详情

flutterandroid端flutterview相关流程源码分析(代码片段)

Flutter系列文章连载~《FlutterAndroid工程结构及应用层编译源码深入分析》《Flutter命令本质之Fluttertools机制源码深入分析》《Flutter的runApp与三棵树诞生流程源码分析》《FlutterAndroid端Activity/Fragment流程源码分析》《FlutterAndroid... 查看详情