Linux 内核体系结构详解

一、Linux 内核体系结构

一个完整可用的操作系统主要由 4 部分组成:硬件、操作系统内核、操作系统服务和用户应用程序,用户应用程序是指那些字处理程序、 Internet 浏览器程序或用户自行编制的各种应用程序;操作系统服务程序是指那些向用户提供的服务被看作是操作系统部分功能的程序。 在 Linux 操作系统上,这些程序包括 X 窗口系统、 shell 命令解释系统以及那些内核编程接口等系统程序;操作系统内核程序即是本书所感兴趣的部分,它主要用于对硬件资源的抽象和访问调度。

1.1 Linux 内核模式

操作系统内核的结构模式主要可分为整体式的单内核模式和层次式的微内核模式。在单内核模式的系统中,操作系统所提供服务的流程为:应用主程序使用指定的参数值执行系统调用指令(int x80),使 CPU 从用户态( User Mode)切换到核心态( Kernel Model),然后操作系统根据具体的参数值调用特定的系统调用服务程序,而这些服务程序则根据需要再底层的一些支持函数以完成特定的功能。在完成了应用程序所要求的服务后,操作系统又从核心态切换回用户态,返回到应用程序中继续执行后面的指令。

1.2 Linux 内核系统体系结构

Linux 内核主要由 5 个模块构成,它们分别是:进程调度模块、内存管理模块、文件系统模块、进程间通信模块和网络接口模块。

进程调度模块用来负责控制进程对 CPU 资源的使用。 所采取的调度策略是各进程能够公平合理地访问 CPU,同时保证内核能及时地执行硬件操作。内存管理模块用于确保所有进程能够安全地共享机器主内存区,同时,内存管理模块还支持虚拟内存管理方式,使得 Linux 支持进程使用比实际内存空间更多的内存容量。并可以利用文件系统把暂时不用的内存数据块会被交换到外部存储设备上去,当需要时再交换回来。文件系统模块用于支持对外部设备的驱动和存储。虚拟文件系统模块通过向所有的外部存储设备提供一个通用的文件接口,隐藏了各种硬件设备的不同细节。从而提供并支持与其它操作系统兼容的多种文件系统格式。进程间通信模块子系统用于支持多种进程间的信息交换方式。网络接口模块提供对多种网络通信标准的访问并支持许多网络硬件。

二、Linux 内核体系详解

1. arch/

  • 作用:此目录包含与硬件架构相关的代码,每个子目录对应一个特定的硬件架构(如 x86、ARM、MIPS 等)。这些文件通常涉及平台相关的初始化、驱动程序、体系结构特定的代码等。
  • 常见文件/目录:
    • arch/x86/:与 x86 架构相关的代码。
    • arch/arm/:与 ARM 架构相关的代码。

2. block/

  • 作用:该目录包含与块设备(如硬盘、SSD 等)相关的代码,包括设备驱动、调度算法、IO 调度器等。
  • 常见文件/目录:
    • block/io.c:提供对块设备的抽象和 IO 操作。
    • block/blk-core.c:处理块设备的核心逻辑。

3. drivers/

  • 作用:包含各种硬件设备驱动程序的源代码。这里包括所有硬件设备的驱动程序,如网络适配器、显卡、USB 设备、存储设备等。
  • 常见文件/目录:
    • drivers/net/:与网络设备相关的驱动。
    • drivers/usb/:与 USB 设备相关的驱动。
    • drivers/gpu/:与图形卡和显示设备相关的驱动。

4. fs/

  • 作用:该目录包含与文件系统相关的代码,管理磁盘上文件的读写、创建、删除等操作。也包括虚拟文件系统(VFS)的实现,VFS 提供了一个抽象层,使得不同类型的文件系统(如 ext4、xfs、nfs)能够在统一的接口下工作。
  • 常见文件/目录:
    • fs/ext4/:ext4 文件系统的实现。
    • fs/nfs/:网络文件系统(NFS)的实现。
    • fs/vfs.c:虚拟文件系统的核心代码。

5. include/

  • 作用:包含头文件,定义了内核的接口、结构体、宏等。头文件通常被其他源文件引用,提供内核功能的声明和定义。
  • 常见文件/目录:
    • include/linux/:Linux 内核的公共头文件。
    • include/asm/:与架构相关的头文件。

6. init/

  • 作用:该目录包含内核的初始化代码。启动过程中的许多初始化工作,如系统调用表、进程调度器等,都在这些文件中进行配置。
  • 常见文件/目录:
    • init/main.c:内核的启动入口,负责初始化各个内核子系统。
    • init/do_mounts.c:挂载根文件系统。

7. kernel/

  • 作用:此目录包含内核的核心部分,涉及进程管理、调度、系统调用、内核线程等。
  • 常见文件/目录:
    • kernel/sched.c:进程调度相关的代码。
    • kernel/fork.c:创建和管理进程相关的代码。
    • kernel/sys.c:处理系统调用的实现。

8. lib/

  • 作用:包含内核的常用库函数,提供一些常见的功能,比如内存管理、字符串操作、算法等。这些函数在内核的各个模块中都会被使用。
  • 常见文件/目录:
    • lib/string.c:字符串操作相关的函数。
    • lib/kmod.c:用于加载和卸载内核模块的代码。

9. mm/

  • 作用:与内存管理相关的代码,包括虚拟内存管理、页面分配、内存映射、交换分区等。
  • 常见文件/目录:
    • mm/memory.c:管理虚拟内存的分配和映射。
    • mm/slab.c:提供内存分配的核心代码,支持缓存分配器。

10. net/

  • 作用:该目录包含与网络协议栈相关的代码。包括 TCP/IP 协议栈、网络接口管理、网络设备驱动等。
  • 常见文件/目录:
    • net/core/:与核心网络功能相关的代码,如网络套接字、网络接口管理等。
    • net/ipv4/:实现 IPv4 协议栈。
    • net/ipv6/:实现 IPv6 协议栈。

11. scripts/

  • 作用:此目录包含了内核构建过程中所需的脚本文件,如配置、编译和构建脚本等。
  • 常见文件/目录:
    • scripts/config:内核配置工具,用于配置内核选项。
    • scripts/kconfig/:内核配置界面生成相关的脚本。

12. security/

  • 作用:与内核安全性相关的代码,包括 SELinux、AppArmor 等安全模块的实现。
  • 常见文件/目录:
    • security/selinux/:与 SELinux 安全模块相关的代码。
    • security/keys/:管理内核密钥和访问控制。

13. sound/

  • 作用:与音频相关的代码,包括声卡驱动、音频子系统的接口等。
  • 常见文件/目录:
    • sound/core/:音频子系统的核心代码。
    • sound/pci/:与声卡驱动相关的代码。

14. tools/

  • 作用:此目录包含了内核开发所需的各种工具,如性能分析工具、调试工具等。
  • 常见文件/目录:
    • tools/perf/:性能分析工具。
    • tools/testing/:用于内核测试的工具。

15. Documentation/

  • 作用:此目录包含内核的文档,提供有关内核开发、配置、使用等方面的详细说明。
  • 常见文件/目录:
    • Documentation/admin-guide/:系统管理员使用的文档。
    • Documentation/driver-api/:设备驱动开发文档。

16. certs/

  • 作用:该目录包含与证书管理相关的代码,主要用于内核的公钥基础设施(PKI)和 X.509 证书的处理。这个模块主要用于支持内核的数字签名验证,确保内核或模块的安全性。
  • 常见文件/目录:
    • certs/:与内核模块签名、验证和证书链相关的代码。
    • certs/system_keyring.c:实现与证书相关的内核密钥管理,提供数字签名验证和密钥加载功能。
    • 功能:例如,在加载外部模块时,内核会验证该模块的签名,以保证模块的来源和完整性,从而防止恶意或不安全的模块被加载。

17. crypto/

  • 作用:该目录包含与加密相关的代码,包括加密算法的实现、密钥管理、加密操作的接口等。Linux 内核提供了一个加密子系统,它允许用户和内核模块使用各种加密算法,如对称加密、非对称加密、散列等。
  • 常见文件/目录:
    • crypto/algapi.c:管理和注册加密算法。
    • crypto/aes.c:实现 AES 加密算法。
    • crypto/hash.c:实现常见的哈希算法(如 SHA-1、SHA-256)。
    • crypto/pkcs7.c:实现 PKCS#7 标准相关的加密和签名操作。
    • 功能:内核加密子系统支持加密算法的动态加载,并为内核的其他部分(如文件系统、网络协议等)提供加密服务。比如,内核可以使用加密子系统来保护存储在磁盘上的数据(例如 LUKS 加密的磁盘)或在网络中传输的数据(例如 VPN、IPSec)。

18. ipc/

  • 作用:该目录包含与进程间通信(IPC,Inter-Process Communication)相关的代码。进程间通信是操作系统的一项基本功能,允许不同进程之间交换数据或信号。Linux 提供多种 IPC 机制,如信号、消息队列、共享内存、信号量、管道等。
  • 常见文件/目录:
    • ipc/msg.c:实现消息队列的功能,允许进程发送和接收消息。
    • ipc/sem.c:实现信号量机制,用于进程同步和互斥。
    • ipc/shm.c:实现共享内存机制,允许进程访问共享的内存区域。
    • 功能:Linux 提供了多种 IPC 机制,其中最常用的有:
      • 消息队列(Message Queues):允许进程以队列的形式发送和接收消息。
      • 共享内存(Shared Memory):允许多个进程访问同一块内存区域,是最快的 IPC 机制之一。
      • 信号量(Semaphores):用于进程间的同步与互斥,防止多个进程同时访问共享资源导致冲突。
      • 管道(Pipes):用于进程间的单向通信,一般用于父子进程之间。

19. kconfig/

  • 作用:该目录包含与内核配置相关的代码,Kconfig 文件是 Linux 内核中配置和编译过程的核心文件。这个目录中的代码用于管理内核的编译配置和选项。
  • 常见文件/目录:
    • Kconfig 文件:定义了内核的配置选项和可选模块。
    • kconfig/:为内核的配置界面(如 make menuconfig)提供支持的代码。
    • 功能:Kconfig 文件通过提供图形界面(如 menuconfig)或文本界面(如 .config 文件)来帮助开发者选择和配置内核的功能选项。这个系统管理内核功能的启用与禁用,以便为不同的硬件平台和需求定制内核。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值