目录
概述
1 Linux内核介绍
1.1 Linux 内核版本
1.2 下载Linux 内核
2 编译内核
2.1 解压内核
2.2 编译环境
2.3 编译内核
概述
本文主要以硬件板卡mini2440为例,介绍如何从linux内核官网下载一个原生态的内核源码包,通过简单的配置编译适合在ARM上运行的内核。笔者使用linux 内核版本为linux-4.9.229为模版,介绍内容包括:交叉工具的配置,linux内核目录结构,编译内核使用的命令,以及如何生成zImage文件。
1 Linux内核介绍
1.1 Linux 内核版本
Linux内核有3个数字组成,数字之间用“.”号隔开,前两个数字是内核的版本号,第三个数字是版本大的发行号。下面用一张表说明它们的含义。以内核版本linux-4.9.229 为例介绍各个参数的意义:
Index | 表示的意义 | 注释 |
---|---|---|
byte0: 4 | 主版本号 | |
byte1: 9 | 表示的意义次版本号 | 偶数版本:稳定版本 奇数版本: 测试版本 |
byte2: 229 | 发行号 |
1.2 下载Linux 内核
linux内核的官方镜像地址:
https://mirrors.edge.kernel.org/pub/linux/kernel/
打开链接:
也可以选择国内镜像,其下载速度相对官方镜像地址要快许多,地址链接:
https://mirror.bjtu.edu.cn/kernel/linux/kernel/
本文选择下载的内核版本为:linux-4.9.229
2 编译内核
2.1 解压内核
解压内核源代码包:linux-4.9.229.xz,在源代码压缩包的同级目录下登录shell窗口,使用命令:
tar -xvf linux-4.9.229.tar.xz
解压完成后,进入到内核目录linux-4.9.229,可以看见如下源码目录结构,每个目录中源代码的功能如下:
目录结构 | 说明 |
---|---|
arch | 包含此内核源代码所支持的硬件体系结构相关的底层代码,每种处理器架构平台占据一个目录,例如: arm、arm64、avr32、x86 |
block | 块设备的通用函数库 |
crypto | 系统加密和散列(hash)算法(例如:AES、DES、MD5)等,还包括一些压缩和CRC的校验算法 |
Documentation | Linux内核各部分的通用解释和说明文档 |
drivers | 内核支持的绝大部分设备驱动程序,每一类驱动程序占据一个目录 |
firmware | 第三方设备的驱动库,文件格式为.ihex |
fs | 内核支持的各种相关的文件系统目录 |
include | 内核头文件目录。和系统相关的头文件放在include/linux目录下,与处理器相关的头文件放在include/asm-generic |
init | 内核启动相关的代码目录 |
ipc | 进程通信相关的点目录 |
kernel | 内核的核心目录,包括进程创建和调度,定时器,系统控制,中断,软中断和工作队列等代码,而与处理器相关的核心代码放在arch/*/kernel 目录下 |
lib | 库文件代码目录。与CPU架构相关的库文件放在arch/*/lib |
samples | 一些内核和设备的使用范例 |
scripts | 用于配置和编译内的脚本文件 |
sound | 和音频设备相关的驱动代码 |
tools | 编译内核的工具 |
usr | 内核编译将在该目录下生成一个压缩的cpio格式的initramfs文件:initramfs_data.cpio.gz,它将在系统启动的过程中被挂载到系统中 |
virt | 虚拟机相关的文件 |
2.2 编译环境
打卡linux-4.9.229/Makefile文件,配置如下参数
代码257行: 配置系统为arm架构
代码258行:交叉编译器的绝对路径
ARCH ?= arm
CROSS_COMPILE ?= /home/ctools/gcc-linaro-4.9.4-arm-linux-gnueabihf/bin/arm-linux-gnueabihf-
# Architecture as present in compile.h
UTS_MACHINE := $(ARCH)
SRCARCH := $(ARCH)
# Additional ARCH settings for x86
ifeq ($(ARCH),i386)
SRCARCH := x86
endif
ifeq ($(ARCH),x86_64)
SRCARCH := x86
endif
在linux-4.9.229/arch/arm/configs目录下有许多和板卡相关的配置,笔者选择选择mini2440配置编译参数,配置命令如下:
make clean
make mini2440_defconfig
执行命令后:
2.3 编译内核
配置完成以后就可以编译了,使用如下命令编译 Linux 内核,使用命令:
make -j16
如果要生成zImage文件,使用命令:
make zImage
进入到/linux-4.9.229/arch/arm/boot目录,可以看见zImage文件