arm 源码编译kernel 对比image zimage uimage vmlinux

一 源码编译kernel

        下载交叉编译工具链

          下载cc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz ,这是官网的。使用下面命令下载。

  585  wget https://releases.linaro.org/components/toolchain/binaries/4.9-2017.01/arm-linux-gnueabihf/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz
  587  tar Jxf gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf.tar.xz 
  590  echo $PATH
  591  export PATH=$(pwd)/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin:$PATH
  596  arm-linux-gnueabihf-gcc --version

     出现下面命令说明成功了

root@33ca02c8b788:/home/root/linux-5.10.52# arm-linux-gnueabihf-gcc --version
arm-linux-gnueabihf-gcc (Linaro GCC 4.9-2017.01) 4.9.4
Copyright (C) 2015 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

root@33ca02c8b788:/home/root/linux-5.10.52# 

一次输入上面的命令,arm-linux-gnueabihf-gcc --version执行成功,说明toolchain安装成功。

        u-boot源码编译

           这个u-boot我这里就不介绍了。

     

        内核源码编译 

下载linux内核,内核版本5.15.6. 执行下面命令

wget -c https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.15.6.tar.xz
tar Jxf linux-5.15.6.tar.xz
cd linux-5.10.52

   编译内核,使用交叉编译链arm-linux-gnueabihf进行编译。使用三星2410的板子。

cp arch/arm/configs/s3c2410_defconfig .config
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig -j4
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- -j 8 

    编译完成后,会生成后面几个目录。

 这个直接编译出来的elf文件,没有经过压缩,它的大小是100多M。

 生成zImage,这个镜像是经过压缩的,但是不能烧录到板子上。

 compressed目录下压缩vmlinux。

  编译uimage

mkimage -A arm -O linux -T kernel -C none -a 0x8080088 -e 0x8080088  -n "Linux kernel" -d arch/arm/boot/zImage uImage

mkimage是u-boot编译出来的命令,就是说,你要执行这个命令前,需要安装u-boot或者源码编译u-boot,我建议源码编译,使用toolchain编译出来。

二 对比各个镜像差异

名称含义
vmlinux

linux内核编译出来的原始的内核文件,elf格式,未做压缩处理。该映像可用于定位内核问题,但不能直接引导Linux系统启动。

image

Linux内核编译时,使用objcopy处理vmlinux后生成的二进制内核映像。该映像未压缩,可直接引导Linux系统启动。

压缩vmlinux 这个是在arch/arm/boot/compressed目录下,使用gzip压缩,具体可以看一下内核源码,有两个文件实现这个功能
zimage

使用gzip压缩Image后,使用objcopy命令生成的Linux内核映像。该映像一般作为uboot的引导映像文件

initrd没有搞清楚,怎么编译出来的
uimage在zImage前面增加一个64字节的头,描述映像文件类型,加载位置,大小等信息。该映像是老版本uboot专用的引导映像。

linux不同类型镜像生成过程:

上面的详细流程可以参考这两个连接,结合linux2.6.32内核。

分析vmlinux,uImage,zImage,Image的生成以及之间的关系_objcopy vmlinux zimage_小笙到此一游的博客-CSDN博客

Linux内核源码分析--zImage出生实录(Linux-3.0 ARMv7) - 程序员大本营

注: zImage 和uImage 用于32位内核。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值