Linux内核结构
1.内核的主要组成部分
-
Linux 内核主要的 5 个部分:进程调度、内存管理、虚拟文件系统、网络接口、进程通信。在系统移植的时候,它们是内核的基本元素,这 5 个部分之间的关系,如图所示:
- 进程调度(管理):进程是在计算机系统中资源分配的最小单元,而进程调度就是负责控制进程对 CPU 的访问。 内核负责创建和销毁进程, 而且由调度程序采取合适的调度策略,实现进程间的合理且实时的处理器资源的共享,从而实现多个进程在一个或多个处理器上的抽象。内核还负责实现不同进程间、进程和其他部件之间的通信。
- 内存管理:内存是计算机系统中最主要的资源,内存管理就是负责多个进程安全地共享主内存区域,为每个进程在有限的物理资源上建立一个虚拟地址空间。内存管理部分代码可分为硬件无关部分和硬件有关部分:硬件无关部分实现进程和内存之间的地址映射等功能;硬件有关部分实现不同体系结构上的内存管理相关功能并为内存管理提供虚拟接口。
- 虚拟文件系统(VFS):在 Linux 系统中的任何一个概念几乎都可以看做一个文件,虚拟文件系统隐藏了不同类型硬件的具体细节,为所有的硬件设备提供了一个标准的接口 ,从而在整个系统的几乎所有机制中使用文件的抽象。VFS支持数十种不同类型的文件系统,如 ext3、ext4等。
- 设备管理:Linux 系统中几乎每个系统操作最终都映射到一个或多个物理设备上。 除了处理器、内存等少数的硬件资源之外,任何一种设备控制操作都由设备特定的驱动代码来进行。内核中必须提供系统中可能要操作的每一种外设的驱动。
- 网络管理:内核支持各种网络标准协议和网络设备。网络管理部分可分为网络协议栈和网络设备驱动程序。网络协议栈负责实现每种可能的网络传输协议(TCP/IP 协议等),网络设备驱动程序负责与各种网络硬件设备或虚拟设备进行通信。
-
五部分间的关系
- 进程调度与内存管理:二者互相依赖,在多道程序环境下,程序要运行必须为之创建进程,而创建进程首先就是要将程序和数据装入内存。另外,内存管理子系统也存在进程的挂起和恢复过程。
- 进程间通信与内存管理:进程间通信子系统要依赖内存管理支持共享内存通信机制,通过对共同的内存区域进行操作来达到通信的目的。
- 虚拟文件系统与网络接口:虚拟文件系统通过依赖网络接口支持网络文件系统(NFS),也通过依赖内存管理支持 RAMDISK 设备。
- 内存管理与虚拟文件系统:内存管理利用虚拟文件系统支持交换,交换进程定期地由调度程序调度,这也是内存管理依赖于进程调度的唯一原因。当一个进程存取的内存映射被换出时,内存管理将会向文件系统发出请求,同时,挂起当前正在运行的进程。
2.内核源码目录结构
-
Linux 内核代码以源码树的形式存放,如果在安装系统的时候已经安装了源码树,其源码树就在
/usr/src/linux
下,源码树结构如图所示:![image-20240317105826865](https://img-blog.csdnimg.cn/img_convert/6e8aeb8a60c3c8e70d8b3925a24c1a1b.png)
-
目录功能介绍
内核源码的顶层有许多子目录,分别组织存放各种内核子系统或者文件。具体的目录说明如下表所示:
目录 作用 arch 包括了体系结构相关的代码,每一个子目录都代表一种支持的体系结构,如 arch/i386、arch/arm、arch/ppc crypto 常用加密和散列算法(如 AES、SHA 等),以及一些压缩和 CRC 校验算法 drivers 放置系统所有的设备驱动程序(包括硬件相关和硬件无关),如 drivers/char、drivers/block等 documentation/ 内核文档 fs 列出了Linux 支持的所有文件系统,目前 Linux 支持 ext3、 vfat、 ntfs、 yaffs2、ramfs、 cramfs 和 romfs 等多种文件系统。在嵌入式系统中常用的闪存设备的文件系统有cramfs、 romfs、 ramfs、 jffs2、 yaffs 等文件系统。 include 包括内核编译时所需要的大部分头文件。与平台无关的头文件在include/linux 子目录下, include/scsi 目录则是有关 scsi 设备的头文件目录,与 arm 相关的头文件在 include/asm-arm 子目录下 init 包含核心的初始化代码(注意,不是系统的引导代码)。它包含两个文件main.c 和 version.c,这是研究核心如何工作的一个非常好的起点。 ipc 包含核心进程间的通信代码。 Linux 下进程间通信机制主要包括管道、 信号、消息队列、共享内存、信号量、套接口。 kernel Linux 内核管理的核心代码,与处理器结构相关代码都放在 arch/*/kernel目录下 lib 含了核心的库代码,如 zlib、crc32。与处理器结构相关的库代码被放在 arch/*/lib/目录下。 mm 包含了所有的内存管理代码。与具体硬件体系结构相关的内存管理代码位于arch/*/mm 目录下。 net 包括Linux核心的网络部分代码, 其每个子目录存放一个具体的网络协议或者网络模型代码。 sound 声音驱动的支持 scripts 包含用于配置核心的脚本文件(内部或者外部使用的脚本) usr 用户的代码 |