Linux内核编译
编译内核之前需要先在ubuntu上安装lzop库,另外,图形化配置工具还需要ncurses库支持,安装命令为:
sudo apt-get install lzop
sudo apt-get install build-essential
sudo apt-get install libncurses5-dev
在Ubuntu中新建一个文件夹,然后将linux内核压缩包拷贝到文件夹中并解压,解压命令为:
tar -vxf linux-imx-rel_imx_4.1.15_2.1.0_ga.tar.bz2
解压完成后
进入该文件夹,新建一个build.sh脚本文件来编译,脚本中的内容如下:
#!/bin/sh
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- distclean
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- imx_v7_mfg_defconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig
make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- all -j8
给予该脚本可执行权限,然后运行,编译的时候会弹出Linux图形配置界面, 这里不需要做任何的配置, 直接按两下ESC键退出图形界面
之后会自动开始编译Linux内核。
编译完成以后就会在arch/arm/boot
这个目录下生成一个zImage
文件,该文件就是要用的Linux镜像文件。另外也会在arch/arm/boot/dts
下生成很多.dtb 文件,这些.dtb 就是设备树文件。
vmlinux 、Image ,zImage 、uImage 的区别
vmlinux
是ELF格式的文件,是编译出来的最原始的内核文件,编译出来 差不多有16MB,是未压缩的。在实际中我们不会使用vmlinux,而是使用zImage或uImage这样的 Linux 内核镜像文件。
Image
是Linux内核镜像文件,但是Image仅包含可执行的二进制数据。Image就是使用objcopy取消掉vmlinux中的一些其他信息,比如符号表什么的。但是 Image 是没有压缩过的,Image保存在arch/arm/boot目录下,其大小大概在12MB 。
zImage
是经过gzip压缩后的Image,经过压缩以后其大小大概在6MB左右。
uImage
是老版本uboot专用的镜像文件,uImag是在zImage前面加了一个长度为 64字节的“头” ,这个头信息描述了该镜像文件的类型、加载位置、生成时间、大小等信息。但是新的uboot已经支持了 zImage 启动! 所以已经很少用到uImage了。
内核启动流程
要分析
Linux
启动流程,同样需要先编译一下
Linux
源码,因为有很多文件是需要编译才会生成的。
首先分析
Linux
内核的连接脚本文件
arch/arm/kernel/vmlinux.lds
,通过链接脚本可以找到 Linux
内核的第一行程序是从哪里执行的。