博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
uImage 的 入口符号地址
阅读量:4285 次
发布时间:2019-05-27

本文共 3470 字,大约阅读时间需要 11 分钟。

前言
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/zImage	arch/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  4月 25 20:33 vmlinux*-rw-rw-r-- 1 linux linux 3.1M  4月 25 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 标号

转载地址:http://rvigi.baihongyu.com/

你可能感兴趣的文章
关于margin-right的应用问题
查看>>
《Javascript权威指南》学习笔记之十三:处理日期和时间
查看>>
《Javascript权威指南》学习笔记之十四:JavaScript内建类
查看>>
关于JavaScript中toSource问题的小结
查看>>
JavaScript中的JSON操作
查看>>
CSS 最核心的几个概念
查看>>
JavaScript实现简单日历
查看>>
大学那些事(6)
查看>>
大学那些事(7)
查看>>
JavaScript中实现统计Textarea的字数
查看>>
mysql导入外部sql脚本的方法
查看>>
mysql编码、数据表编码查看和修改总结
查看>>
这样的心态,值得拥有
查看>>
《Javascript权威指南》学习笔记之十五:BOM之源---window对象
查看>>
《Javascript权威指南》学习笔记之十六:BOM之源---BOM基本应用
查看>>
JavaScript实现竖直文本滚动
查看>>
《Javascript权威指南》学习笔记之十七:BOM新成就(1)--客户端存储数据(Storage实现)
查看>>
《Javascript权威指南》学习笔记之十八:BOM新成就(1)--客户端存储数据(Web SQL DataBase实现)
查看>>
学习 Github Page 教你分分钟搭建自己的博客
查看>>
关于生成Github的SSH密钥
查看>>