一 源码编译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位内核。