内核编译(make)之后会生成两个文件,一个Image,一个zImage,其中Image为内核映像文件,而zImage为内核的一种映像压缩文件,Image大约为4M,而zImage不到2M 。
那么uImage又是什么的?它是uboot专用的映像文件,它是在zImage之前加上一个长度为64字节的“头”,说明这个内核的版本、加载位置、生成时间、大小等信息;其0x40之后与zImage没区别 。
文章插图
如何生成uImage文件?
首先在uboot的/tools目录下寻找mkimage文件,把其copy到系统/usr/local/bin目录下,这样就完成制作工具 。然后在内核目录下运行make uImage,如果成功,便可以在arch/arm/boot/目录下发现uImage文件,其大小比zImage多64个字节 。
有了uImage头部的描述, u-boot就知道对应Image的信息, 如果没有头部则需要自己手动去设置那些参数 。
【嵌入式开发内核编译zImage和uImage的区别】U-boot的U是“通用”的意思 。
zImage是ARM linux常用的一种压缩映像文件,uImage是U-boot专用的映像文件,它是在zImage之前加上一个长度为0x40的“头”,说明这个映像文件的类型、加载位置、生成时间、大小等信息 。换句话说,如果直接从uImage的0x40位置开始执行,zImage和uImage没有任何区别 。另外,Linux2.4内核不支持uImage,Linux2.6内核加入了很多对嵌入式系统的支持,但是uImage的生成也需要设置,这个以后我会介绍 。
文章插图
几种linux内核文件的区别:
1、vmlinux ,编译出来的最原始的内核文件,未压缩 。
2、zImage ,是vmlinux经过gzip压缩后的文件 。
3、bzImage, bz表示“big zImage”,不是用bzip2压缩的 。两者的不同之处在于,zImage解压缩内核到低端内存(第一个640K),bzImage解压缩内核到高端内存(1M以上) 。如果内核比较小,那么采用zImage或bzImage都行,如果比较大应该用bzImage 。
4、uImage , U-boot专用的映像文件,它是在zImage之前加上一个长度为0x40的tag 。
5、vmlinuz, 是bzImage/zImage文件的拷贝或指向bzImage/zImage的链接 。
6、initrd , 是“initial ramdisk”的简写 。一般被用来临时的引导硬件到实际内核vmlinuz能够接管并继续引导的状态
文章插图
一般情况下都在生成vmlinux后,再对内核进行压缩成为zImage,压缩的目录是kernel/arch/arm/boot 。
下载到 flash 中的是压缩后的zImage文件,zImage是由压缩后的vmlinux和解压缩程序组成,
查看 2440 的 datasheet , 发现内存映射的基址是 0x3000 0000 , 那么0x30008000 又是如何来的呢?
在内核文档kernel/Document/arm/Booting 文件中有:
Calling the kernel imageExistingboot loaders: MANDATORY New boot loaders: MANDATORY There are two options for calling the kernel zImage. If the zImage is stored inflash, and is linked correctly to be run from flash, then it is legal for the boot loader to call the zImage in flashdirectly. The zImage may also be placed in system RAM (at any location) and called there.Note that the kernel uses 16K of RAM below the image to store page tables. The recommended placement is 32KiBinto RAM.
看来在image下面用了32K(0x8000)的空间存放内核页表,0x30008000 就是 2440 的内核在 RAM 中的启动地址,这个地址就是这么来的 。
比如用U-Boot启动Linux内核
1、下载uImage.bin到SDRAM的0x30008000处
tftp 0x30008000 uImage
2、启动内核bootm 0x30008000
推荐阅读
- 基于 Serverless Framework 的人工智能小程序开发
- 小程序开发时的误区该如何避免?
- 滨江集团:春语蓝庭项目由公司与龙湖等房产公司共同合作开发
- C++面向对象开发的四大特性:封装、抽象、继承、多态
- 嵌入式Linux编程 #define 宏的高级用法
- 开发商城小程序大概需要多长时间?
- 开发运维小工具:import也可以是个shell命令
- CPU处理器|首款量产RISC-V处理器玄铁C906云上免费开放!开发者可体验“算力自由”
- 富锌富硒有机茶的开发,万源首届茶文化节打造富硒茶叶品牌
- 如何在树莓派4开发板上使用Windows 10 IoT Core?