uImage 的 入口符号地址

2024-05-27 16:58
文章标签 地址 符号 入口 uimage

本文主要是介绍uImage 的 入口符号地址,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言
u-boot 引导内核的时候会 tftp 0x30008000 uImage 然后 bootm 0x30008000可见,从字面意思上是要将控制权交给内核了,可是内核的入口符号是什么呢uImage的入口函数是 arch/arm/boot/compressed/head.S 中的 start 标号下面可以从 uImage 的生成过程 找到这个入口符号

uImage 的生成过程

uImage 是由 一个脚本做出来的,scripts/mkuboot.sh 脚本

整体的命令是

scripts/mkuboot.sh -A arm -O linux -C none -T kernel -a 0x80008000 -e 0x80008000 -n 'Linux-3.10.0' -d arch/arm/boot/zImage arch/arm/boot/uImage命令解析:-A arm 架构是arm-O linux 系统是linux-C none 没压缩-T kernel 类型是kernel-a 0x80008000 加载地址是0x80008000-e 0x80008000 入口地址是0x80008000-n 'Linux-3.10.0' 名字是Linux-3.10.0-d arch/arm/boot/zImage 输入数据文件是arch/arm/boot/zImagearch/arm/boot/uImage 输出文件是arch/arm/boot/uImage

scripts/mkuboot.sh 对mkimage 文件进行判断是否存在,然后就调用了 mkimage $@,然后就制作出来了 arch/arm/boot/uImage , 把 选项中的参数 写到了uImage的前64字节,例如加载地址和入口地址


zImage 的生成过程

uImage 是依靠mkimage命令 和 zImage 做出来的.命令可以在uboot源码tools目录编译得到,也可以直接安装得到.

下面看一下arch/arm/boot/zImage是怎么做出来的

他是由arch/arm/boot/compressed/vmlinux 二进制化得到的
arch/arm/boot/.zImage.cmd中写到

arm-hisiv300-linux-objcopy -O binary -R .comment -S  arch/arm/boot/compressed/vmlinux arch/arm/boot/zImage命令解析:-O binary 	输出目标为二进制文件-R .comment 不拷贝.comment段-S 					不拷贝重定位信息和符号信息到输出文件(目的文件)中去arch/arm/boot/compressed/vmlinux 输入文件arch/arm/boot/zImage 输出文件

vmlinux 的生成过程

然后我们看一下arch/arm/boot/compressed/vmlinux 是怎么做出来的
arch/arm/boot/compressed/.vmlinux.cmd中写到

arm-hisiv300-linux-ld 	-EL  \--defsym _kernel_bss_size=138792 \--defsym zreladdr=0x80008000 \-p \--no-undefined \-X \-T arch/arm/boot/compressed/vmlinux.lds \arch/arm/boot/compressed/head.o arch/arm/boot/compressed/piggy.gzip.o \arch/arm/boot/compressed/misc.o arch/arm/boot/compressed/decompress.o \arch/arm/boot/compressed/string.o arch/arm/boot/compressed/hyp-stub.o \arch/arm/boot/compressed/lib1funcs.o arch/arm/boot/compressed/ashldi3.o\-o arch/arm/boot/compressed/vmlinux命令解析:-EL 连接little-endian对象. 这会影响缺省输出格式--defsym _kernel_bss_size=138792 在输出文件中定义一个全局变量 _kernel_bss_size 值为 138792--defsym zreladdr=0x80008000 在输出文件中定义一个全局变量 zreladdr 值为 0x80008000-p 动态库的问题--no-undefined //Do not allow unresolved references in object files-X Delete all temporary local symbols-T arch/arm/boot/compressed/vmlinux.lds 用arch/arm/boot/compressed/vmlinux.lds来替换默认链接脚本arch/arm/boot/compressed/head.o 输入文件-o arch/arm/boot/compressed/vmlinux 输出文件-rwxrwxr-x 1 linux linux 3.2M  425 20:33 vmlinux*
-rw-rw-r-- 1 linux linux 3.1M  425 20:33 piggy.gzip.o

vmlinux.lds 是怎么链接 vmlinux 中的 符号的

vmlinux.lds是怎么做出来的? 没有命令的备份,打印信息里也没有,只能找Makefile了

arch/arm/boot/compressed/Makefile中写到

SEDFLAGS    = s/TEXT_START/$(ZTEXTADDR)/;s/BSS_START/$(ZBSSADDR)/$(obj)/vmlinux.lds: $(obj)/vmlinux.lds.in arch/arm/boot/Makefile $(KCONFIG_CONFIG)@sed "$(SEDFLAGS)" < $< > $@解析上面的命令,就是替换 vmlinux.lds.in 中的两个字符串,然后放入vmlinux.lds中.vmlinux.lds解析:ENTRY(_start) 表示,将符号_start设置成入口地址,入口地址(entry point)是指进程执行的第一条用户空间的指令在进程地址空间的地址
SECTIONS
{. = 0;  								把定位器符号置为0_text = .;							将_text符号放在 0位置.text : {_start = .;						将_start符号放在0位置*(.start)							将所有的输入文件的.start段放入输出文件的.text段*(.text)							将所有的输入文件的.text段放入输出文件的.text段*(.text.*)*(.fixup)*(.gnu.warning)*(.glue_7t)*(.glue_7)}
}表示会依次找 输入文件 .o 中的.start段 放到输出文件的 .start 段中.
_text 是入口 在 0号位置,0号位置放置的是第一个 .o 文件的 .start段,第一个 .o 文件是 head.o,即对应 arch/arm/boot/compressed/head.S 中的 start 标号

现在可以明了了,uImage的入口函数是 arch/arm/boot/compressed/head.S 中的 start 标号

这篇关于uImage 的 入口符号地址的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1008065

相关文章

常用的jdk下载地址

jdk下载地址 安装方式可以看之前的博客: mac安装jdk oracle 版本:https://www.oracle.com/java/technologies/downloads/ Eclipse Temurin版本:https://adoptium.net/zh-CN/temurin/releases/ 阿里版本: github:https://github.com/

webapp地址

F:\LSP\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps

Jenkins 插件 地址证书报错问题解决思路

问题提示摘要: SunCertPathBuilderException: unable to find valid certification path to requested target...... 网上很多的解决方式是更新站点的地址,我这里修改了一个日本的地址(清华镜像也好),其实发现是解决不了上述的报错问题的,其实,最终拉去插件的时候,会提示证书的问题,几经周折找到了其中一遍博文

【干货分享】基于SSM的体育场管理系统的开题报告(附源码下载地址)

中秋送好礼 中秋佳节将至,祝福大家中秋快乐,阖家幸福。本期免费分享毕业设计作品:《基于SSM的体育场管理系统》。 基于SSM的体育场管理系统的开题报告 一、课题背景与意义 随着全民健身理念的深入人心,体育场已成为广大师生和社区居民进行体育锻炼的重要场所。然而,传统的体育场管理方式存在诸多问题,如资源分配不均、预约流程繁琐、数据统计不准确等,严重影响了体育场的使用效率和用户体验。

Exchange 服务器地址列表的配置方法与注意事项

Exchange Server 是微软推出的一款企业级邮件服务器软件,广泛应用于企业内部邮件系统的搭建与管理。配置 Exchange 服务器地址列表是其中一个关键环节。本文将详细介绍 Exchange 服务器地址列表的配置方法与注意事项,帮助系统管理员顺利完成这一任务。 内容目录 1. 引言 2. 准备工作 3. 配置地址列表 3.1 创建地址列表 3.2 使用 Exchange

匹配电子邮件地址的正则表达式

这个正则表达式 QRegularExpression regex(R"((\w+)(\.|_)?(\w+)@(\w+)(\.(\w+))+))"); 用于匹配电子邮件地址的格式。下面是对这个正则表达式的逐步解析和解释: 1. QRegularExpression 构造函数 QRegularExpression regex(R"((\w+)(\.|_)?(\w*)@(\w+)(\.(\w+))+

超级 密码加密 解密 源码,支持表情,符号,数字,字母,加密

超级 密码加密 解密 源码,支持表情,符号,数字,字母,加密 可以将表情,动物,水果,表情,手势,猫语,兽语,狗语,爱语,符号,数字,字母,加密和解密 可以将文字、字母、数字、代码、标点符号等内容转换成新的文字形式,通过简单的文字以不同的排列顺序来表达不同的内容 源码截图: https://www.httple.net/152649.html

[Linux]:环境变量与进程地址空间

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ 🎈🎈养成好习惯,先赞后看哦~🎈🎈 所属专栏:Linux学习 贝蒂的主页:Betty’s blog 1. 环境变量 1.1 概念 **环境变量(environment variables)**一般是指在操作系统中用来指定操作系统运行环境的一些参数,具有全局属性,可以被子继承继承下去。 如:我们在编写C/C++代码的时,在链接的时候,我们并不知

C# 如何同时Ping多个IP地址

在C#中,如果需要同时ping多个IP地址,可以采用多线程或异步编程的方式来实现,以便可以同时进行多个ping操作。以下是两种常用的方法: 方法一:使用多线程(Task 或 Thread) 使用Task是更现代和推荐的方式,因为它内置了更好的线程管理和异常处理机制。以下是一个使用Task的示例,展示如何同时ping多个IP地址: using System; using System.Co

Modbus从基地址 1 和基地址 0 开始的区别

Modbus 是一种应用于工业自动化领域的通信协议,在设备之间进行数据交换。它支持多种数据类型(如线圈、离散输入、输入寄存器、保持寄存器),每种数据类型都有特定的地址范围。在使用 Modbus 通信时,设备的地址可以从 1 或 0 开始计数,这取决于具体实现。这种不同的基地址(1 或 0)选择,可能导致实际读取或写入的地址存在偏差,因此理解其差异是十分重要的。 1. Modbus 地址的基本概念