加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

zImage制作uImage

发布时间:2020-12-15 18:35:05 所属栏目:百科 来源:网络整理
导读:bootm 命令是用来引导经过 u-boot 的工具 mkimage 打包后的 kernel?image 的,什么叫做经过 u-boot 的工具 mkimage 打包后的 kernel?image ,这个就要看 mkimage 的代码,看看它做了些什么,虽然我很希望大家不要偷懒,认真地去看看,但是我知道还是有很多人

bootm命令是用来引导经过u-boot的工具mkimage打包后的kernel?image的,什么叫做经过u-boot的工具mkimage打包后的kernel?image,这个就要看mkimage的代码,看看它做了些什么,虽然我很希望大家不要偷懒,认真地去看看,但是我知道还是有很多人懒得去做这件,那么我就j将分析mkimage代码后得到的总结告诉大家,mkimage做了些什么,怎么用这个工具。
mkimage的用法
uboot源代码的tools/目录下有mkimage工具,这个工具可以用来制作不压缩或者压缩的多种可启动映象文件。
mkimage在制作映象文件的时候,是在原来的可执行映象文件的前面加上一个0x40字节的头,记录参数所指定的信息,这样uboot才能识别这个映象是针对哪个CPU体系结构的,哪个OS的,哪种类型,加载内存中的哪个位置,?入口点在内存的那个位置以及映象名是什么
root@Glym:/tftpboot#?./mkimage
Usage:?./mkimage?-l?image
-l?==>?list?image?header?information
./mkimage?-A?arch?-O?os?-T?type?-C?comp?-a?addr?-e?ep?-n?name?-d?data_file[:data_file...]?image
-A?==>?set?architecture?to?'arch'
-O?==>?set?operating?system?to?'os'
-T?==>?set?image?type?to?'type'
-C?==>?set?compression?type?'comp'
-a?==>?set?load?address?to?'addr'?(hex)
-e?==>?set?entry?point?to?'ep'?(hex)
-n?==>?set?image?name?to?'name'
-d?==>?use?image?data?from?'datafile'
-x?==>?set?XIP?(execute?in?place)
参数说明:
-A?指定CPU的体系结构:
取值?表示的体系结构
alpha?Alpha
arm?ARM
x86?Intel?x86
ia64?IA64
mips?MIPS
mips64?MIPS?64?Bit
ppc?PowerPC
s390?IBM?S390
sh?SuperH
sparc?SPARC
sparc64?SPARC?64?Bit
m68k?MC68000
-O?指定操作系统类型,可以取以下值:
openbsdnetbsdfreebsd4_4bsdlinuxsvr4esixsolarisirixscodellncrlynxosvxworkspsosqnxu-bootrtemsartos
-T?指定映象类型,可以取以下值:
standalonekernelramdiskmultifirmwarescriptfilesystem
-C?指定映象压缩方式,可以取以下值:
none?不压缩
gzip?gzip的压缩方式
bzip2?bzip2的压缩方式
-a?指定映象在内存中的加载地址,映象下载到内存中时,要按照用mkimage制作映象时,这个参数所指定的地址值来下载
-e?指定映象运行的入口点地址,这个地址就是-a参数指定的值加上0x40(因为前面有个mkimage添加的0x40个字节的头)
-n?指定映象名
-d?指定制作映象的源文件

1)如果我们没用mkimage对内核进行处理的话,那直接把内核下载到0x30008000再运行就行,内核会自解压运行(不过内核运行需要一个tag来传递参数,而这个tag建议是由bootloader提供的,在u-boot下默认是由bootm命令建立的)。

2)如果使用mkimage生成内核镜像文件的话,会在内核的前头加上了64byte的信息,供建立tag之用。bootm命令会首先判断bootm?xxxx?这个指定的地址xxxx是否与-a指定的加载地址相同。
(1)如果不同的话会从这个地址开始提取出这个64byte的头部,对其进行分析,然后把去掉头部的内核复制到-a指定的load地址中去运行之
(2)如果相同的话那就让其原封不同的放在那,但-e指定的入口地址会推后64byte,以跳过这64byte的头部。

000000_u-boot-1.2.0/tools/?./mkimage?-A?arm?-O?linux?-T?kernel?-C?none?-a?30008000?-e?30008000?-n?linux-2.6.14.1_cs8900?-d?/arm9/u-boot-1.2.0/tools/zImage?/arm9/u-boot-1.2.0/tools/uImage

or??:./mkimage?-A?arm?-O?linux?-T?kernel?-C?none?-a?30008000?-e?30008040?-n?linux-2.6.13?-d?zImage?uImage

生成uImage的方法:?利用mkimage?命令?把zImage?包装?,?

mkimage?-A?arm?-O?linux?-T?kernel?-C?none?-a?30008000?-e?30008000?-n?linux-2.6.18.8?-d?zImage?uImage2.6.18.8?

下面的总结都是?稍微调整一下上面的?-a?-e?-x?参数什么的,?你会发现?这些参数不同,?就会导致你?tftp?dowload的地址会有不同,?有的时候kernelrun不起来。?

addr是地址?,?如果两个地方都是addr?,说明是同一个地址,?否则?我会比如addr+0x40??

具体为什么?,?可以看我上面帖子的分析:?

1>?mkimage?-a?addr?-e?addr?
那么tftp?下载kernel?就一定不能下载?addr处?,?否则,kernel不来。?因为u-boot并不搬运kernel?代码,?也就是没有把header去掉。?所以?只有入口是?addr+0x40才是kernel的入口。?

当然也不能下到?<?addr?+?2M?的地方,?否则搬运的时候会有一些覆盖,?导致搬运后的kernel不完整,?bootm的时候,会RESET?的。?


2>?mkimage?-a?addr?-e?addr+0x40?或者?mkimage?-a?addr?-x?两个是一回事?。?-x的意思?是就在kernel所在地执行。?不必搬运(代码里面的条件是?tftp?kernel的时候?就下到?addr处)?

这种情况:?tftp?就一定把kernel?下载到addr处?,这样u-boot?bootm的时候?就不搬运了。?
起始这种情况更多的用在flash里面?。?


比如?卖产品的时候?,kernel肯定是烧写在flash里面,?记住这个flash地址,?然后?mkimage?-a?这个flash地址?-x?,?这样bootm?也就不用搬运了,?直接在flash里面运行kernel?。?其实我不晓得这样可不可以,?按理说编译?kernel的时候,link的时候?用的?vmlinux.lds?里面的数值?都是?0x30008000?,?mkimage?随便指定一个flash?地址,?应该不行才对,?除非你把?kernel里面的vmlinux.lds?也改掉和mkimage一致。?

总之?,?一句话,?u-boot?是为kernel服务,?kernel里面定义好的参数,?u-boot?不能乱改?,?一定要一致?,否则kernel肯定翘辫子才对。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读