内核编译(make)
内核编译(make)之后会生成两个文件,一个Image,一个zImage,其中Image为内核映像文件,而zImage为内核的一种映像压缩文件,Image大约为4M,而zImage不到2M。
那么uImage又是什么的?它是uboot专用的映像文件,它是在zImage之前加上一个长度为64字节的“头”,说明这个内核的版本、加载位置、生成时间、大小等信息;其0x40之后与zImage没区别。
64字节的头结构如下:
typedef struct image_header {
uint32_t ih_magic;
uint32_t ih_hcrc;
uint32_t ih_time;
uint32_t ih_size;
uint32_t ih_load;
uint32_t ih_ep;
uint32_t ih_dcrc;
uint8_t ih_os;
uint8_t ih_arch;
uint8_t ih_type;
uint8_t ih_comp;
uint8_t ih_name[IH_NMLEN];
} image_header_t;
所以,uImage和zImage都是压缩后的内核映像。而uImage是用mkimage工具根据zImage制作而来的。mkimage工具介绍如下:
u-boot里面的mkimage工具来生成uImage (u-boot源码包/tools/mkimage.c )
这里解释一下参数的意义:
-A ==> set architecture to 'arch'
-O ==> set operating system to 'os'
-T ==> set image type to 'type' “kernel或是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 20008000 ---- image的载入地址(hex),通常为0xX00008000
-e 200080XX---- 内核的入口地址(hex),XX为0x40或者0x00
-n linux-XXX --- image的名字,任意
-d nameXXX ---- 无头信息的image文件名,你的源内核文件
uImageXXX ---- 加了头信息之后的image文件名,任意取
原来在这个-C这个参数这里不太理解,因为我觉得既然mkimage是用zImage去制作uImage,而本身zImage就是经过压缩了的,为什么这个地方还要有一个压缩了,后来想了下,觉得可能是这个工具也可以根据最原始的Image去制作uImage,所以就有了这个参数,不深究。即使将zImage经过压缩后生成uImage的话,我觉得压缩比也很小。
关于-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之间的地址不要导致复制时的覆盖。
因为zImage是经过压缩而得到的,所以其自身就有解压缩代码。
内核编译(make)相关推荐
- android8.1内核编译,Android8.1.0安卓源码编译
换中科大源18.04 由于新安装的Ubuntu默认配置为Ubuntu官方源,基本软件包下载速度较慢,下面修改软件源: 备份下sources.list sudo cp /etc/apt/sources. ...
- linux0.11内核编译,编译Linux-0.11内核
make[1]:正在离开目录 `/home/guang/temp/h/linux-0.11/lib' kernel/kernel.o: In function `number': /home/guan ...
- 编译linux内核的错误,linux内核编译错误
原标题:linux内核编译错误 内核版本:2.6.14 交叉编译器: -linux-gcc 4.3.3 错误: arch/arm/mm/alignment.c: In function 'proc_a ...
- Linux 2.6内核编译与配置安装升级
Linux系统更新了很多版本更新,我本人认为Linux 2.6内核在Linux系统系列里很好使的文件系统,在此向大家推荐.如今技术不断更新,各种使用文件都已经淘汰.我认为还是有很不错的如Linux 2 ...
- 错误linux autocof.h,【技巧】一种提高 [ 定位Linux内核编译错误 ] 效率的方法
前言:在编译一些非标准linux内核时,常会出现一些错误导致编译中止.这其中的大部分都能通过根据编译器报出的错误定位来查阅源码.找到相关的依赖配置,然后修正配置状态来解决.但也有时候从依赖逻辑中无法发 ...
- Linux内核编译和测试
课程论文要求写的,顺便贴上来一部分. Linux内核编译和测试<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:of ...
- 【Linux】Linux添加系统调用以及内核编译过程
在想要替换原有系统内核或者需要在原来的系统中添加一些系统调用的时候就会涉及到Linux内核的编译.但是内核编译虽然步骤简单,但是需要注意的东西还是太多了.首先一点就是由于Linux的开源性导致的版本问 ...
- grub shell 错误_GRUB启动故障排除和内核编译
如何进入光盘应急系统(以下修复操作仅适用于GRUB legacy, 不适用于GRUB2): 步骤一:给主机挂上安装光盘, 或者有相应启动镜像的硬盘分区(可移动的分区) 步骤二:开机时选择CDROM先启 ...
- kernel笔记——内核编译与进程管理
内核与操作系统 由于一些商业操作系统设计上的缺陷以及日益庞杂,"操作系统"的概念对很多人而言变得含糊不清.在进一步讨论Linux内核的话题前,我们先区分"内核" ...
- linux 内核编译详解
一.准备工作 准备工作如何做,这里就不详说了. a) 首先,你要有一台PC,装好了Linux. b) 安装好GCC(这个指的是host gcc,用于编译生成运行于pc机程序的).make.ncurse ...
最新文章
- JZOJ 5407. 【NOIP2017提高A组集训10.21】Deep
- Flutter设置允许HTTP访问
- python3语音控制电脑_python语音控制电脑_uusee全屏
- java下拉模糊查询_select2 智能补全模糊查询select2的下拉选择框使用
- oracle查询约束的关联表,几种容易查询Oracle中表的约束信息
- Python开发【第十九篇】:Python操作MySQL
- python类中方法相互调用_python中同一个类,带参的方法直接如何相互调用
- Modifying a Dynamic Library Without Changing the Source Code
- oracle多表查询员工和上级,oracle多表查询之经典面试题
- win8、server 2012 清除winsxs文件夹
- PaddleOCR报错Process finished with exit code
- 高德地图实现昼夜、卫星图切换
- 11月初.wang域名总量TOP15:13家中国域名商上榜
- 蚂蚁金服开源背后的“有意思”工程师 | 1024快乐
- PIXI_锚点图片位控
- java采用匈牙利命名法_【Java】工具类,如何将匈牙利命名法转换成驼峰命名法-Go语言中文社区...
- 面向计算机架构的机器学习
- 盈世邮箱服务器pop3,iPhone (苹果手机)盈世邮箱POP3设置
- opengl高级光照之法线贴图
- 文件粘滞位(粘着位)的作用