LV005-linux内核简介
一、内核简介
1. 什么是 linux 内核
Linux 内核(Linux Kernel)是 Linux 操作系统的核心组件,它是一个开源的、运行在计算机硬件之上的系统软件,负责管理计算机的底层资源(如 CPU、内存、输入输出设备等),并为上层应用程序提供稳定、高效的运行环境。

简单来说,内核就像是计算机硬件与软件之间的 “桥梁”,它不仅控制着硬件设备的访问和调度,还通过系统调用接口为应用程序提供服务,确保多任务、多进程环境下的资源分配与隔离。
2. 微内核还是宏内核
宏内核(Monolithic Kernel)和微内核(Microkernel)是操作系统内核的两种设计架构。宏内核与微内核的主要区别在于,宏内核将大部分系统功能直接实现在内核中,而微内核只实现最基本的功能,其他功能则通过进程间通信来实现。
宏内核其实就是把所有的功能都耦合起来,放在内核中,这样的优势就是性能极高,因为各个功能模块之间是可以直接调用的。缺点就是因为各个模块是相互关联,容易出现一错皆错的问题。
而微内核则恰恰相反,它为了降低耦合,内核中只会允许一些核心功能的存在,而其余所有功能都会被移出内核,变成一种特殊的用户进程——服务进程。其优点就是各个模块之间是独立的,不会相互影响,但其性能相比宏内核会大幅度下降。
混合内核则是结合上面二者的特点,它与微内核相似,只是会将一些功能模块又放回到内核中去,而不常用的功能模块还是放在用户层中。这样在微内核的基础上,又可以提高性能。
Linux 内核是 宏内核(Monolithic Kernel)。虽然 Linux 是宏内核,但它通过 可加载内核模块(LKM) 实现了模块化,可以在运行时动态加载/卸载驱动程序,这让它具备了部分微内核的灵活性。
3. 起源与发展
这个网上就多了,这里就不写了。
二、怎么获取内核?
1. 官网
Linux 由 Linux 基金会管理与发布, Linux 官网为 The Linux Kernel Archives,在这个官网上包含了 linux 内核的所有版本。
写这个笔记的时候最新的稳定版 Linux 已经到了 6.4.7,其实没必要追新,4.x 版本的 Linux 和 5.x 版本没有本质上的区别, 5.x 更多的是加入了一些新的平台、新的外设驱动而已,6.x 版本的就没了解过了。
2. 内核源码
内核源码和前面学习 uboot 的时候一样,有三种。
- 一种是内核官网维护的,那是最原始的 linux 源码,
- 第二种是芯片厂家维护的内核源码,芯片厂家会从官网下载某个版本的 Linux 内核,然后将其移植到自己的 CPU 上,测试成功以后就会将其开放给 NXP 的 CPU 开发者。
- 第三种就是开发板厂家的内核源码,或者是开发者自己维护的内核源码。一般是开发者下载芯片厂家提供的 Linux 内核,然后将其移植到自己的产品上。
三、内核源码目录
我们可以看到内核源码目录中大概会有这些文件:

- arch:主要包含和硬件体系结构相关的代码,如 arm、x86、MIPS,PPC,每种 CPU 平台占一个相应的目录,例如我们使用的 imx 系列 CPU 就在
arch/arm/mach-imx目录下,Linux 内核目前已经支持 30 种左右的 CPU 体系结构。arch 中的目录下存放的是各个平台以及各个平台的芯片对 Linux 内核进程调度、 内存管理、 中断等的支持,以及每个具体的 SoC 和电路板的板级支持代码。 - block:在 Linux 中 block 表示块设备(以块(多个字节组成的整体,类似于扇区)为单位来整体访问),譬如说 SD 卡、Nand、硬盘等都是块设备,block 目录下放的是一些 Linux 存储体系中关于块设备管理的代码。
- crypto:这个文件夹下存放的是常用加密和散列算法(如 md5、AES、 SHA 等) ,还有一些压缩和 CRC 校验算法。
- Documentation:内核各部分的文档描述。
- drivers:设备驱动程序,里面列出了 linux 内核支持的所有硬件设备的驱动源代码,每个不同的驱动占用一个子目录,如 char、 block、 net、 mtd、 i2c 等。
- fs:fs 就是 file system,里面包含 Linux 所支持的各种文件系统,如 EXT、 FAT、 NTFS、 JFFS2 等。
- include:目录包括编译核心所需要的大部分头文件,例如与平台无关的头文件在
include/linux子目录下,与 cpu 架构相关的头文件在 include 目录下对应的子目录中。 - init:内核初始化代码,这个目录下的代码就是 linux 内核启动时初始化内核的代码。
- ipc:ipc 就是
inter process commuication,进程间通信,该文件夹下都是 linux 进程间通信的代码。 - kernel:kernel 就是 Linux 内核,是 Linux 中最核心的部分,包括进程调度、定时器等,而和平台相关的一部分代码放在
arch/*/kernel目录下。 - lib:lib 是库的意思,lib 目录下存放的都是一些公用的有用的库函数,注意这里的库函数和 C 语言的库函数不一样的,因为在内核编程中是不能用 C 语言标准库函数的,所以需要使用 lib 中的库函数,除此之外与处理器结构相关的库函数代码被放在
arch/*/lib/目录下。 - mm: 目录包含了所有独立于 cpu 体系结构的内存管理代码,如页式存储管理内存的分配和释放等,而与具体硬件体系结构相关的内存管理代码位于
arch/*/mm目录下,例如arch/arm/mm/fault.c。 - net: 网络协议栈相关代码,net 目录下实现各种常见的网络协议。
- scripts:这个目录下全部是脚本文件,这些脚本文件不是 linux 内核工作时使用的,而是用了配置编译 linux 内核的。
- security:内核安全模型相关的代码,例如最有名的 SELINUX。
- sound: ALSA、 OSS 音频设备的驱动核心代码和常用设备驱动。
- usr: 实现用于打包和压缩的 cpio 等。
提示:对于其他的未列出来的目录,暂时不用去理会。
参考资料: