一、Linux内核概述
内核与操作系统
-
内核
内核是一个操作系统的核心,提供了操作系统最基本的功能,是操作系统工作的基础,决定着整个系统的性能和稳定性
-
操作系统
操作系统是在内核的基础上添加了各种工具集、桌面管理器、库、shell、应用程序等
Linux层次结构
Linux内核特点
代码结构清晰、模块化设计
支持丰富的硬件平台
较高的稳定性
轻量化及较强的裁剪性
开放源代码
更新活跃、用户较多、资料丰富
支持丰富的网络协议
... ...
二、Linux内核源码结构
Linux内核源码获取
-
Linux内核版本命名
主版本号.次版本号.修订版本
-
Linux内核版本选择
支持对应的硬件平台
相对成熟的版本(资料多)
稳定版本(次版本号为偶数的版本一般都是稳定版)
Linux内核源码结构
-
平台相关代码
arch: 与CPU架构相关的源代码
-
平台无关代码
block:磁盘设备的支持 crypto:加密相关
drivers:设备驱动 firmware:固件
fs:文件系统 include:头文件
init:内核初始化 ipc:进程间通信
kernel:内核核心调度机制等 lib:库
mm:内存管理 net:网络协议
scripts:工具、脚本等 security:安全
usr:打包与压缩 virt:虚拟
-
帮助文档、示例程序、工具等
COPYING: 版权
CREDITS: 内核贡献者
README: 说明文档
Documentation: 帮助文档
Makefile: 编译管理
samples: 示例
tools: 工具
... ...
三、Linux内核的配置与编译
Linux内核源码配置
-
指定处理器架构及编译工具
在Linux内核源码顶层目录下的Makefile中指定(ARCH、CROSS_COMPILE)
-
导入当前处理器的默认配置
make <soc_name>_defconfig
注1:soc_name为当前使用的处理器的名字
注2:内核源码的arch/arm/configs下对各个厂商的soc都有一个默认配置文件
执行该命令后就会将对应的配置文件中的信息导入到源码顶层目录下的.config
文件中CONFIG_xxx=y表示内核选中了该功能,内核编译时就会将该功能对应的
代码编译,内核的体积也会增大。#CONFIG_xxx is not set表示内核没有选中
该功能,内核编译时该功能对应的代码不会被编译,内核的体积也会减小。
-
修改配置
默认配置只能保证内核拥有最基本的功能,我们需要根据自己的实际需求对内核做进一步的配置
方法1:
直接修改.config文件(不推荐)
方法2:
make menuconfig
make menuconfig
-
修改配置
[ ] 有两种状态
输入Y,显示"*",内核中该功能被选中,相关代码会被编译进内核
输入N,显示" ",内核中该功能不被选中,相关代码不会被编译进内核
< > 有三种状态
输入Y,显示"*",内核中该功能被选中,相关代码会被编译进内核
输入N,显示" ",内核中该功能不被选中,相关代码不会被编译进内核
输入M,显示"M",内核中该功能被选为模块(被编译为独立的模块)
注:使用make menuconfig配置的本质还是修改.config文件
Linux内核源码编译
-
内核编译(以下命令均在内核源码的顶层目录下执行)
make uImage
编译内核(编译选为"*"的选项到内核)
make modules
编译内核模块(编译选为"M"的选项为独立模块)
make dtbs
编译设备树(将设备树源文件dts编译为二进制文件dtb)
make clean
删除编译过程中产生的中间文件
配置步骤
相关配置的步骤看实验七 Linux 内核移植