关于 mkimage

简介: 在嵌入式系统中,Linux内核和根文件系统一般都与bootloader一起烧写在flash芯片中,系统启动后,bootloader将Linux内核压缩到RAM中,并把压缩的根文件系统复制到RAM中,然后启动内核,由内核解压缩根文件系统,并调用文件系统中的应用程序和脚本文件启动系统。

在嵌入式系统中,Linux内核和根文件系统一般都与bootloader一起烧写在flash芯片中,系统启动后,bootloader将Linux内核压缩到RAM中,并把压缩的根文件系统复制到RAM中,然后启动内核,由内核解压缩根文件系统,并调用文件系统中的应用程序和脚本文件启动系统。

在烧写Linux内核和根文件系统之前应该对它们进行适当处理,在它们的头部加入一些提供给bootloader的信息字符,以便bootloader能够辨认它们并获取它们的信息,从而正确地将它们解压缩、复制到RAM中的正确位置,并正确启动内核。这个为Linux内核和根文件系统添加头部的工作一般由编译bootloader时生成的一个小应用程序来完成,比如u-boot编译后会在其tools子目录下生成一个叫mkimage的应用程序,而cfe在编译后也会在其cfe/hosttools子目录下生成一个叫mkflashimage的应用程序,它们就是完成上述功能的工具程序,此处我们只介绍u-boot的mkimage。

mkimage命令格式如下:

# mkimage [-x] -A arch -O os -T type -C comp -a addr -e ep -n name -d data_file[:data_file...] image

其中各字段含义如下:

 

    

    

-x

指定内核就在Flash中运行,即XIPexecute in place

-T

指定输入文件的类型,如“kernel”、“filesystem”、“firmware”、“ramdisk

-A

指定处理器体系架构

-O

指定操作系统类型名字,如“linux”、“vxworks”、“psos”等

-C

指定压缩模式,可能设置为“none”、“bzip2”、“gzip

-a

指定程序被解压缩或复制到RAM中的地址

-e

指定程序(内核)的入口地址

-n

指定image文件的名字

-d

指定输入的程序文件,可是有多个文件,如内核或/和根文件系统二进制文件

image

输出文件名

mkimage命令举例如下:

#mkimage -n "My Kernel" -A arm -O linux -T kernel -C gzip –a 0x8000 –e 0x8000 -d kernel.gz kernel.img

以上命令将压缩了的内核二进制文件kernel.gz转换成u-boot能够辨认的二进制文件kernel.img,并指定kernel.img的名字为“My Kernel”,处理器体系架构为arm,操作系统类型为linux,程序类型为操作系统内核,程序由gzip压缩,程序的链接起始地址为0x8000,程序的入口地址为0x8000,注意这两个地址一定要是物理地址而不是对应的虚拟地址。

#mkimage -n "My Rootfs" -A arm -O linux -T ramdisk -C gzip -d ramdisk.gz ramdisk.img

以上命令将压缩了的ramdisk根文件系统二进制文件ramdisk.gz转换成u-boot能够辨认的二进制文件ramdisk.img,并指定ramdisk.img的名字为“My Rootfs”,处理器体系架构为arm,操作系统类型为linux,程序类型为ramdisk,程序由gzip压缩,不需要指定ramdisk的链接起始地址和入口地址。

如果我们将kernel.img和ramdisk.img文件分别写到flash芯片的0xFF000000和0xFF200000位置,系统启动后进入u-boot命令行界面,执行以下u-boot命令:

# bootm 0xFF000000 0xFF200000

那么u-boot将把0xFF000000位置的Linux内核解压缩到RAM中的0x8000位置,再将0xFF200000位置的ramdisk文件系统映像文件刨掉u-boot头部后复制到RAM中的某个位置,然后跳转到内核的入口地址0x8000位置启动内核,同时把板子信息、ramdisk在RAM中的起始地址和结束地址、命令行字符串传给内核,这样Linux开始启动运行。

目录
相关文章
|
11月前
|
存储 程序员
C 标准库 - <time.h>详解
`&lt;time.h&gt;` 是 C 标准库中用于处理时间和日期的头文件,提供了多种函数、宏和类型来获取和操作时间信息。重要数据类型包括 `time_t` 和 `struct tm`,前者表示从 1970 年 1 月 1 日以来的秒数,后者包含详细的日期和时间字段。
|
存储 数据挖掘 Linux
Linux C语言之时间函数精讲
Linux C语言之时间函数精讲
404 1
|
前端开发 应用服务中间件 nginx
Docker consul的容器服务更新与发现
Docker consul的容器服务更新与发现
|
小程序 容器
小程序view标签内数字/字母显示不换行
小程序view标签内数字/字母显示不换行
669 0
|
C#
利用最小二乘法拟合任意次函数曲线(C#)
原文:利用最小二乘法拟合任意次函数曲线(C#) ///     ///用最小二乘法拟合二元多次曲线     ///     ///已知点的x坐标集合     ///已知点的y坐标集合     ///已知点的个数     ///方程的最高次数     ...
3227 0
|
存储 Linux 文件存储
[开源] 分享导出博客园文章成本地 Markdown 文件存储的工具
此文主要分享了如何将自己博客园的文章自动导出到 Markdown 文档进行存储,以便在本地进行归档管理,程序中也对文章的分类、tag、代码块以及文章中的图片进行了保存处理,以便上传到自己的图。 整理后的 Markdown 可以在本地整理成册或者发布到自己的个人博客上,比如我使用 Markdown 书写的 个人博客 。
1896 0
|
人工智能 达摩院 前端开发
ICASSP 2022 论文分享:基于 HRR 的非对齐序列多模态情感分析
ICASSP 2022 论文分享:基于 HRR 的非对齐序列多模态情感分析
423 0
|
JavaScript 前端开发 Java
手把手教你写一个composer包
由于程序届的《开源运动》,我们可以在社区找到很多别人提供的工具,也可以向社区贡献我们的代码。 在github还没有兴起的年代,我们是需要到工具的官网下载代码,比如jquery。然后放到我们自己的项目目录里,再在我们的页面中使用。
526 0
手把手教你写一个composer包
|
Kubernetes 应用服务中间件 nginx
Kubernetes-kubectl命令行工具
1、kubectl概述 kubectl是Kubernetes集群的命令行工具,通过kubectl能够对集群本身进行管理,并能够在集群上进行容器化应用的安装部署。运行kubectl命令的语法如下所示: $ kubectl [command] [TYPE] [NAME] [flags] 这里的command,TYPE、NAME和flags为: comand:指定要对资源执行的操作,例如create、get、describe和delete TYPE:指定资源类型,资源类型是大小学敏感的,开发者能够以单数、复数和缩略的形式。
4233 0
|
缓存 负载均衡 网络协议
CDN的基本原理和基础架构
本文为大家介绍CDN的基本工作原理、关键组件、基础架构和部署架构
27168 0