u-boot代码分析--第一节(代码片段)

weirdo-xo weirdo-xo     2022-12-10     798

关键词:

u-boot代码分析--第一节

编者:weirdo

时间:2020-5-12

QQ:2651293248

标题:u-boot代码分析第一节


1. u-boot.lds文件 ??

	这里指的是顶层目录下面的u-boot.lds,这里需要注意的是这个文件是根据arch/arm/cpu/armvx/对应的u-boot.lds模板生成的,在不严格的情况下可以使用arch/arm/cpu/armvx/下的u-boot.lds作为u-boot链接的参考文件,但是如果需要准确的u-boot.lds文件的话还是需要参考顶层目录下的u-boot.lds文件。

2. u-boot.map文件 ??

	这个文件是一个地址映射的文件,在这个文件中详细的定义了在u-boot编译后各个段映射的地址以及代码链接的起始地址。在这个文件的前半部分是定义每一个build-in.o中的段的一个虚拟地址,在经过链接器链接代码后,生成了后半部分的那个真实的链接地址信息,特别需要注意的是这里的u-boot.map是在编译后才动态产生的。每一次重新编译后都会重新的生成这个文件。

3. _start标号 ??

	以前分析的u-boot代码中,中断向量表定义在arch/arm/cpu/armvx/start.S文件中,所以一直也就直接使用这个文件进行分析,但是在新的版本的u-boot中把这个中断向量表定义在了:arch/arm/lib/vectors.S中,这里也是和u-boot.lds的第一段链接的代码相互契合,所以下一次分析u-boot代码时还是从对应版本的u-boot.lds中开始分析,通过第一段链接代码确定代码运行起始点。
	
	可以使用如下的命令来查找某个不清楚的标号
  		grep -nR "label"
  		
  注意如果比较确定代码的大概位置的话应该在大概代码所在目录下进行搜索,减小搜索的时间消耗,如果是在不确定代码的位置,那就只有在u-boot的全局搜索。

u-boot-2012-10z中读_start.S的定义: arch/arm/cpu/arm920t/start.S

.globl _start
_start:	b	start_code
	ldr	pc, _undefined_instruction
	ldr	pc, _software_interrupt
	ldr	pc, _prefetch_abort
	ldr	pc, _data_abort
	ldr	pc, _not_used
	ldr	pc, _irq
	ldr	pc, _fiq

第一段链接代码:

 .text :
 
  __image_copy_start = .;
  arch/arm/cpu/armv7/start.o (.text)
  *(.text)
 

? 可以看到这里的u-boot.lds中第一段链接代码就是在指定文件中,链接脚本和对应的代码相互契合。

u-boot-2017-x版本的_start标号:arch/arm/lib/vectors.S

	.section ".vectors", "ax"
_start:

#ifdef CONFIG_SYS_DV_NOR_BOOT_CFG
	.word	CONFIG_SYS_DV_NOR_BOOT_CFG
#endif

	b	reset
	ldr	pc, _undefined_instruction
	ldr	pc, _software_interrupt
	ldr	pc, _prefetch_abort
	ldr	pc, _data_abort
	ldr	pc, _not_used
	ldr	pc, _irq
	ldr	pc, _fiq

第一段链接代码:

.text :
 
  *(.__image_copy_start)
  *(.vectors)
  arch/arm/cpu/armv7/start.o (.text*)
  *(.text*)
 

? 可以看到这里没有指定第一段代码在那个目录下的那个文件,但是这里却在第一段代码中制定了代码需要编译到那个段中,可以看到vectors.S中的代码真是链接到了链接脚本中指定的(.vectors)段中。

4. 第一段代码的小分析 ??

? 在第一段代码中,定义的是一个中断向量表,在CPU上电复位的时候,开始执行这里的第一行代码,也就是跳转到reset 标号的位置,剩下的代码会在对应的中断发生时跳转到这里,再次执行跳转(可以看到更改了PC)到对应的具体中断处理函数。还有需要注意的是,这里的中断向量表会在CPU启动后加载到内存的高地址存放,防止某些代码错误的更改这里的跳转表---中断向量表。

? 有了这里的知识后,就知道了需要跳转到start.S文件中进行下一步的代码分析。

5. 总结 ??

1. u-boot.lds:详细的定义了代码链接的过程,其中有一些导出变量---链接地址

2. u-boot.map:代码链接是的地址映射文件,在这个文件中可以查找所有链接代码的地址信息

3. grep 命令:由于u-boot代码非常庞大(其实还行),当有一些未知标号的时使用该命令查找
	grep -nR ‘label‘
	
4. _start:这是代码入口点---第一行执行的代码,由于u-boot版本的不同,入口点所在的文件有所区别,这里可以使用u-boot.lds进行分析第一段链接代码。

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

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

第一节:python环境和数据分析(代码片段)

文章目录一:Python简介和运行环境(1)Python介绍(2)运行环境(3)Pycharm使用二:数据分析常用库介绍(1)NumpyA:基本介绍B:索引和切片操作(2)PandasA:基 查看详情

第一节3:dbscan性能分析优缺点和参数选择方法(代码片段)

文章目录七:性能分析八:优缺点(1)优点(2)缺点九:参数选择(1)修改参数的基本原则(2)根据`K-dist`图调参十:DBSCAN算法和K-Means算法比较七:性能分析DBSCAN算法对... 查看详情

u-boot分析与使用(代码片段)

文章目录一、u-boot介绍二、u-boot源码结构三、u-boot打补丁、编译、烧写四、uboot功能、结构,结合Makefile进行分析五、u-boot分析之源码阶段六、u-boot分析之命令实现七、uboot启动内核一、u-boot介绍u-boot即通用的BootLoader,是... 查看详情

特征向量与矩阵分析——第一节:向量向量空间和线性相关性(代码片段)

文章目录一:标量和向量(1)基本概念(2)坐标系中的向量表示二:向量运算(1)加减与数乘(2)向量内积A:为什么需要向量内积B:向量内积C:柯西-施瓦茨不等式(3ÿ... 查看详情

pandas第一节概览(代码片段)

Pandas是什么?Pandas是Python的核心数据分析支持库,提供快速、灵活、明确的数据结构,旨在简单直观地处理关系型、标记型数据。Pandas适用于处理以下类型的数据:   1、与SQL或Excel表类似的,含异构列的表... 查看详情

关系查询处理和关系优化-第一节:查询处理(代码片段)

文章目录一:查询处理步骤(1)查询分析(2)查询检查(3)查询优化(4)查询执行二:实现查询操作的算法示例(1)选择操作的实现①:全表扫描②:索引(或散列... 查看详情

递归与分治策略-第一节:递归和典型递归问题(代码片段)

文章目录一:LeetCode中有关递归和分治的题目二:递归与分治概述三:递归基本概念四:典型递归问题分析(1)阶乘(2)Fibonacci数列(3)排列问题(4)整数划分(5)汉诺塔... 查看详情

u-boot之启动第一阶段(代码片段)

基于samsung的Exynos4412从链接脚本u-boot.lds中我们知道u-boot是从start.s这个汇编文件开始的,所以u-boot启动的第一阶段肯定也是从这里开始的,这个文件在cpu/arm_cortexa9/文件夹下,下面我们依照这个文件一步一步分析u-boot启动的第一阶... 查看详情

第一节,基本用法(代码片段)

推荐播客:我的Tensorflow学习之路http://wiki.jikexueyuan.com/project/tensorflow-zh/get_started/basic_usage.html项目代码:https://github.com/yongyehuang/Tensorflow-Tutorial一TensorFlow安装 TensorFlow是谷歌基于DistBelief进行 查看详情

u-boot命令实现(代码片段)

目录u-boot(四)命令实现分析run_command小结自定义一个命令代码makefiletitle:u-boot(四)命令实现tags:linuxdate:2018-09-2523:13:05---u-boot(四)命令实现命令是如何实现的?输入命令执行函数,根据命令去寻找函数所以会有一个命令的结构体[name,fun]... 查看详情

设置装订线(代码片段)

fromdocximportDocumentfromdocx.sharedimportCm文件=Document(r‘E:word练习页眉页脚.docx‘)第一节=文件.sections[0]print(第一节.gutter.cm)第一节.gutter=Cm(2)print(第一节.gutter.cm)文件.save(r‘E:word练习设置装订线.docx‘)  查看详情

第一节——数据库(代码片段)

数据库的使用一、数据库的创建完整命令:CREATEDATABASE名称[[WITH][OWNER[=]用户名]//规定数据库属于哪个账户,默认属于创建账户 [TEMPLATE[=]模版] [ENCODING[=]字符集编码]//默认使用utf-8 [LC_COLLATE[=]排序规则] [L... 查看详情

嵌入式开发(s5pv210)——u-boot的顶层mkconfig文件分析(代码片段)

mkconfig文件的调用#第一步:SRCTREE是源码的路径,也就是顶层的目录MKCONFIG :=$(SRCTREE)/mkconfigexportMKCONFIG#第二步:配置#$(@:_config=):作用是将x210_sd_config的_config去掉,得到x210_sdx210_sd_c 查看详情

第一节anaconda+jupyter+numpy简单使用(代码片段)

...       m切换为markdowm模式(显示html样式)  运行代码:shift+enter  自动补全代码:tab  查看帮助文档:shift+tab  进入编辑:鼠标双击 三numpy(重点)  NumPy(NumericalPython)是Python语言的一个扩展程序库,支持大量的维度... 查看详情

第一周第一节(代码片段)

2018年3月19日一周第一次课:1.1学习之初1.2约定1.3认识Linux1.4安装虚拟机1.5安装centos7学习之初、约定在转行学习Linux运维之前就是“开挖掘机的”,零基础学员,对Linux了解的不是很多,有人会问那为什么要来学Linux,隔行如隔山... 查看详情

第一节检测依赖(代码片段)

...序中,如果另一个函数被调用或另一个类时,则含有它的代码不被隔离。这可能导致测试方法或功能之外的测试失败。因此,它不能被视为单元测试。使用诸如文件系统,数据库和网络之类的资源也是如此。结果可能会受到这些... 查看详情

u-boot分析与使用(代码片段)

文章目录一、u-boot介绍二、u-boot源码结构三、u-boot打补丁、编译、烧写四、uboot功能、结构,结合Makefile进行分析五、u-boot分析之源码阶段六、u-boot分析之命令实现七、uboot启动内核一、u-boot介绍u-boot即通用的BootLoader,是... 查看详情