博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ARM Linux Kernel 编译结果 Image zImage uImage映像的区别
阅读量:4041 次
发布时间:2019-05-24

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

一、区别       

        ARM Linux Kernel源码使用 "make CC=***  uImage" 命令编译完成后会生成三种映像:

                1. Image  : 内核的映像文件;

                2. zImage: 内核的映像压缩文件;

                3. uImage: uboot使用的内核映像文件,在zImage之前加上一个长度为64字节的“头”,说明这个内核的版本、加载位置、生成时间、大小等信息;

二、 uImage头

        uImage头结构体如下:

typedef struct image_header {    uint32_tih_magic;    uint32_tih_hcrc;    uint32_tih_time;    uint32_tih_size;    uint32_tih_load;    uint32_tih_ep;    uint32_tih_dcrc;    uint8_tih_os;    uint8_tih_arch;       //架构    uint8_tih_type;       //类型    uint8_tih_comp;       //压缩类型    uint8_tih_name[IH_NMLEN];} image_header_t;

三、 uImage生成方法

         1. 自动生成

                 ① 拷贝uboot的/tools目录下mkimage文件到/usr/local/bin目录下;

                 ②  内核根目录下运行make CC=****** uImage。

        2. 手动生成

                 ① 内核根目录下运行make CC=******,生成zImage;

                 ② 使用mkimage制定参数生成。

四、mkimage参数

        -A ==> set architecture to 'arch'

        -O ==> set operating system to 'os'

        -T ==> set image type to 'type' “kernel or ramdisk”

        -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,即不进行文件的拷贝,在当前位置执行)

        对于ARM 架构Linux内核的参数应设置如下:

        -A  arm -------- 架构是arm

        -O  linux -------- 操作系统是linux

        -T   kernel -------- 类型是kernel

        -C  none/bzip/gzip -------- 压缩类型

        -a  80002000 ---- image的载入地址(hex)

        -e  80008040---- 内核的入口地址(hex)

        -n  linux-XXX --- image的名字,任意

        -d  nameXXX ---- 无头信息的image文件名,你的源内核文件

        uImageXXX ---- 加了头信息之后的image文件名,任意取

        关于-a和-e这两个参数,具体如下:

       -a和-e后面跟的分别是image的载入地址和内核的入口地址,两者可以一样,也可以不一样,依情况而定。

               ①  当-a后面指定的地址和bootm xxxx后面的地址一样时,-e后面的地址必须要比-a后面的地址多0x40,也就是映像头的大小64个字节。因为当他们地址一样时,uboot是不会搬运映像的。

               ②   当-a后面指定的地址和bootm xxxx后面的地址不一样时,uboot会将bootm xxxx地址处的映像搬运到-a指定的地址处,此时,-e和-a必须要一样,因为映像头并没有搬运过去,载入地址就是内核的入口地址。需要注意的是,因为uboot要重新搬运内核映像,所以要注意bootm xxxx的地址和-a之间的地址不要导致复制时的覆盖。

  

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

你可能感兴趣的文章
C++程序员的几种境界
查看>>
VC++ MFC SQL ADO数据库访问技术使用的基本步骤及方法
查看>>
VUE-Vue.js之$refs,父组件访问、修改子组件中 的数据
查看>>
Vue-子组件改变父级组件的信息
查看>>
Python自动化之pytest常用插件
查看>>
Python自动化之pytest框架使用详解
查看>>
【正则表达式】以个人的理解帮助大家认识正则表达式
查看>>
性能调优之iostat命令详解
查看>>
性能调优之iftop命令详解
查看>>
非关系型数据库(nosql)介绍
查看>>
移动端自动化测试-Windows-Android-Appium环境搭建
查看>>
Xpath使用方法
查看>>
移动端自动化测试-Mac-IOS-Appium环境搭建
查看>>
Selenium之前世今生
查看>>
Selenium-WebDriverApi接口详解
查看>>
Selenium-ActionChains Api接口详解
查看>>
Selenium-Switch与SelectApi接口详解
查看>>
Selenium-Css Selector使用方法
查看>>
Linux常用统计命令之wc
查看>>
测试必会之 Linux 三剑客之 sed
查看>>