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 指定操作系统类型,可以取以下值:
openbsd、netbsd、freebsd、4_4bsd、linux、svr4、esix、solaris、irix、sco、dell、ncr、lynxos、vxworks、psos、qnx、u-boot、rtems、artos
-T 指定映象类型,可以取以下值:
standalone、kernel、ramdisk、multi、firmware、script、filesystem
-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的地址会有不同, 有的时候kernel会run不起来。 

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肯定翘辫子才对。 

zImage制作uImage相关推荐

  1. 比较zImage和uImage的区别

    一.vmlinuz vmlinuz是可引导的.压缩的内核."vm"代表"Virtual Memory".Linux 支持虚拟内存,不像老的操作系统比如DOS有6 ...

  2. Linux内核映像vmlinux、Image、zImage、uImage区别

    本文介绍几种常用的Linux内核映像的区别. 一.vmlinux vmlinux:Linux内核编译出来的原始的内核文件,elf格式,未做压缩处理. 该映像可用于定位内核问题,但不能直接引导Linux ...

  3. vmlinux、 Image, zImage、 uImage 的区别

    来自正点原子<[正点原子]I.MX6U嵌入式Linux驱动开发指南V1.5.2.pdf> vmlinux 是 ELF 格式的文件,但是在实际中我们不会使用 vmlinux,而是使用 zIm ...

  4. zImage与uImage的区别

    在编译Linux内核时,通常都是生成zImage, 它是一般情况下默认的压缩内核映像文件. 而实际上,zImage是通过压缩内核文件vmlinux后,再加上一段解压启动代码得到. 而uImage是u- ...

  5. mkimage工具将zImage转换为uImage

    正常引导的内核文件 [root@wtstb ~]# mount /dev/sda1 /mnt/ [root@wtstb ~]# file /mnt/hi_kernel.bin /mnt/hi_kern ...

  6. 嵌入式 Linux 内核驱动开发【The first day: 36093万字】

    嵌入式 Linux 内核驱动开发[1] 嵌入式 Linux 内核驱动开发前言 第1章 Linux 内核裁剪和定制 [1]Linux 内核开发简介 [2] Linux 源码阅读工具 [1.2.1]Sou ...

  7. make zImage和make uImage的区别和mkimage工具的使用

    刚刚接触到linux内核编译过程的时候,相信不少人跟我一样,都是按照手册或者网上的教程一步一步的执行,对于其中的很多原理和过程都是一知半解,这其中有一个很常见的问题,就是make image命令. 因 ...

  8. make Image uImage与zImage的区别

    内核编译(make)之后会生成两个文件,一个Image,一个zImage,其中Image为内核映像文件,而zImage为内核的一种映像压缩文件,Image大约为4M,而zImage不到2M. 那么uI ...

  9. Image zImage uImage

    内核编译(make)之后会生成两个文件,一个Image,一个zImage,其中Image为内核映像文件,而zImage为内核的一种映像压缩文件,Image大约为4M,而zImage不到2M. 那么uI ...

最新文章

  1. 有效地使用计算机操作系统的教学设计与反思,《操作系统的基础知识(1)》教学设计及反思...
  2. centos 5.4 x64 安装nagios 3.2.3
  3. svn无法读取日志问题解决
  4. 201521123078《Java程序设计》第2周学习总结
  5. 苹果的 Metal 工程
  6. Linux内核同步机制之completion
  7. Java中9种IO的读取方式
  8. java加载publickey,比较java中的PublicKey对象
  9. excel2010服务器打开闪退
  10. 苹果服务器消息转发,好消息!微信语音也可以转发啦!不好的消息!目前苹果还不行!...
  11. mysql数据库repair_MySQL数据库中的REPAIRTABLE语法介绍
  12. Go 环境变量、go env
  13. Android 自定义View(一)实现时钟表盘效果
  14. hihoCoder 1425 : What a Beautiful Lake(美丽滴湖)
  15. 16.转圈圈报数游戏
  16. UE4 学习记录八 给场景中添加背景音乐和动画音效,运动加速效果
  17. 使用Win32 SDK开发屏幕保护程序
  18. 自己开发icloud客户端软件
  19. unix domain socket 浅析
  20. 在中国,做不成电商SaaS?

热门文章

  1. 比尔·盖茨流行病警告未被采纳?为新冠流行埋下伏笔
  2. php如何抓取html代码,使用php如何获取网页源码?
  3. 毕设三:老年人摔倒检测及报警装置
  4. element时间选择器限制到时分秒_ElementUI日期选择器时间选择范围限制
  5. 正则表达式 替换:将叠词替换成单个字母
  6. 《憨豆特工2》[BD-R/880M][中英双字][1024分辨率]
  7. Socket 基础 非阻塞式TCP socket,实现文件传输jpg,mov等格式
  8. Python openjudge练习:015:计算邮资
  9. 妙!二十九招驱蚊止痒不再愁
  10. 实现扩展 external 能力的 Vite 插件