• linux基础 - 内核的基础概念


    目录

    零. 前言

    一. 源码简介

    二. 存储管理

    物理内存管理:

    虚拟内存管理:

    内存分配与回收:

    三. CPU 和进程管理

    进程管理:

    CPU 管理:

    四. 文件系统

    文件系统的概念

    常见的 Linux 文件系统类型

    文件系统的工作原理

    文件操作示例

    五. 设备管理和驱动

    设备管理

    设备驱动

    六. 网络通信

    网络协议栈

    套接字(Socket)接口

    数据包处理

    网络设备驱动

    网络安全机制

    网络性能优化

    七. 系统的初始化(引导)

    BIOS/UEFI 阶段

    加载引导程序

    内核加载阶段

    内核初始化阶段

    /sbin/init 进程

    八. 系统调用

    定义和作用

    重要性

    常见的系统调用类型

    系统调用的执行过程

    九. 总结


    零. 前言

    Linux 内核是一种开源电脑操作系统内核,是 Linux 操作系统的主要组件,也是计算机硬件与其进程之间的核心接口,负责二者之间的通信。它是一个用 C 语言写成、符合 POSIX 标准的类 Unix 操作系统。

    Linux 内核最早是由林纳斯·托瓦兹(Linus Torvalds)于 1991 年在芬兰赫尔辛基大学读书时研发,后来由几千名开发人员在互联网上协作来编写和维护。它最初是为基于 x86 的 32 位 PC(386 或更高版本)开发的,现在用于各种类型的设备,例如服务器、智能手机和嵌入式系统。

    Linux 内核的主要模块(或组件)包括存储管理、CPU 和进程管理、文件系统、设备管理和驱动、网络通信,以及系统的初始化(引导)、系统调用等。

    一. 源码简介

    Linux 内核代码是开源操作系统 Linux 的核心部分,由众多开发者共同维护和完善。以下是关于 Linux 内核代码的一些重要信息:

    • 代码结构:Linux 内核源代码位于/usr/src/linux/目录下,包含多个子目录,如include/init/arch/drivers/fs/net/mm/ipc/kernel/等。每个子目录都有其特定的功能和相关代码。
    • 重要文件和功能
      • asm.s:包含大部分硬件异常所引起的中断的汇编语言处理过程。
      • traps.c:实现了asm.s中断处理过程中调用的 C 函数,用于显示出错位置和出错号等调试信息。
      • system_call.s:实现系统调用中断int 0x80的入口处理过程以及信号检测处理,同时给出了两个系统功能的底层接口。
      • sched.c:内核中有关任务调度函数的程序,包括调度的基本函数和一些简单的系统调用函数。
      • signal.c:涉及内核中所有有关信号处理的函数。
      • exit.c:描述进程终止和退出的处理事宜,包含进程释放、会话终止和程序退出处理函数以及杀死进程、终止进程、挂起进程等系统调用函数。
      • fork.cfork()系统调用用于创建子进程。
    • 版本发布:Linux 内核有主线、稳定版和长期支持版等不同版本。你可以从 Linux 内核官网(The Linux Kernel Archives)获取最新的内核代码。

    二. 存储管理

    Linux 内核的存储管理负责管理系统的内存资源,其主要功能包括内存分配、回收、映射和保护等。以下是对 Linux 内核存储管理的详细介绍:

    物理内存管理

    • 页面管理:Linux 内核将物理内存划分为固定大小的页面,通常为 4KB。页面是内存管理的基本单位,内核通过页面表将虚拟地址映射到物理地址。
    • 伙伴系统:用于分配和回收物理页面。伙伴系统将连续的空闲页面组织成大小不同的块,以满足不同大小的内存请求。
    • 内存区管理:Linux 内核将物理内存划分为不同的区域,如 DMA 区域、普通区域和高端内存区域等。不同的区域有不同的用途和访问限制。

    虚拟内存管理

    • 虚拟地址空间:每个进程都拥有独立的虚拟地址空间,虚拟地址空间被划分为用户空间和内核空间。用户空间用于进程的代码、数据和堆等,内核空间用于内核代码和数据。
    • 页表:页表用于将虚拟地址转换为物理地址。当进程访问虚拟地址时,内核通过页表查找对应的物理页面,并进行访问权限检查。
    • 内存映射:Linux 内核支持将文件或设备映射到进程的虚拟地址空间,实现文件的共享和进程间通信。
    • 交换空间:当物理内存不足时,Linux 内核可以将部分不常用的页面交换到磁盘上的交换空间,以释放物理内存。

    内存分配与回收

    • **malloc()和 free()**:用户程序通过 malloc()函数申请内存,通过 free()函数释放内存。内核负责管理内存的分配和回收,并确保内存的合理使用。
    • 内核内存分配:内核自身也需要分配内存,如内核模块、缓冲区等。内核使用 kmalloc()、vmalloc()等函数进行内存分配。
    • 内存回收:内核会定期扫描内存,回收不再使用的内存页面,以提高内存的利用率。
    1. 内存保护

      • 访问权限检查:内核通过页表中的访问权限位来检查进程对内存的访问是否合法,防止进程越界访问或非法修改其他进程的内存。
      • 内核空间保护:用户进程不能直接访问内核空间,只有内核代码可以访问内核空间,以保证内核的安全性和稳定性。
    2. 存储管理策略

      • 缓存管理:Linux 内核使用缓存来提高内存的访问速度,如页缓存、inode 缓存等。
      • 交换策略:内核根据系统的内存使用情况和交换空间的大小,决定何时将页面交换到磁盘上。
      • 内存压缩:一些 Linux 内核支持内存压缩技术,如 ZRAM,可以在内存紧张时对页面进行压缩,以增加可用内存。

    Linux 内核的存储管理是一个复杂而重要的系统组件,它确保了系统的内存资源得到合理的分配和利用,同时保证了内存的安全性和稳定性。不同的 Linux 发行版可能会对存储管理进行一些优化和调整,以适应不同的应用场景和硬件环境

    三. CPU 和进程管理

    Linux 内核的 CPU 和进程管理是操作系统的核心部分,负责有效地分配 CPU 资源和管理进程的执行。以下是对其的详细介绍:

    进程管理

    1. 进程描述

      • 为每个进程创建一个进程控制块(PCB),包含进程的标识符、状态、优先级、资源分配、上下文等信息。
      • 进程状态包括就绪、运行、阻塞等,内核根据这些状态来决定进程的调度。
    2. 进程创建和终止

      • 通过系统调用(如 fork())创建新进程,复制父进程的资源和环境。
      • 当进程完成任务或出现异常时,通过系统调用(如 exit())终止进程,并释放相关资源。
    3. 进程调度

      • 决定哪个进程在何时获得 CPU 时间。调度策略通常基于进程的优先级、时间片等因素。
      • 常见的调度算法包括先来先服务(FCFS)、短作业优先(SJF)、时间片轮转(RR)等。Linux 内核通常采用多种调度策略的组合,以适应不同的场景。

    CPU 管理

    1. 中断处理

      • 响应硬件设备产生的中断请求,暂停当前进程的执行,转而去处理中断服务程序。
      • 中断处理完成后,恢复之前被中断的进程或调度新的进程执行。
    2. 上下文切换

      • 当切换进程时,保存当前进程的 CPU 上下文(寄存器值、程序计数器等),并加载新进程的上下文。
      • 这确保了进程能够在被暂停后准确地恢复执行。
    3. 多核支持

      • 充分利用多核 CPU 的优势,实现并行处理和负载均衡。
      • 内核可以将进程分配到不同的 CPU 核心上,提高系统的整体性能。
    4. 进程优先级调整

      • 根据进程的行为和系统的需求,动态调整进程的优先级。
      • 例如,I/O 密集型进程在等待 I/O 操作完成时,其优先级可能会被提高,以避免 CPU 资源的浪费。

    例如,在一个多任务的系统中,当用户同时运行多个程序时,如浏览器、文本编辑器和音乐播放器,内核的 CPU 和进程管理会根据各个进程的优先级和需求,合理地分配 CPU 时间片。如果浏览器正在加载网页,需要更多的 CPU 资源,内核可能会暂时减少分配给文本编辑器和音乐播放器的时间片,以加快网页加载速度。当网页加载完成后,再重新调整各个进程的资源分配。

    Linux 内核的 CPU 和进程管理是确保系统高效运行、资源合理分配以及各个进程协同工作的关键机制。

    四. 文件系统

    Linux 内核中的文件系统是用于组织、存储和管理文件及目录的重要组成部分。以下是对其的详细介绍:

    文件系统的概念

    文件系统是一种数据结构和相关算法的集合,用于在存储设备上组织和管理文件和目录。它提供了一种统一的方式来访问、读取、写入和操作文件。

    主要功能

    1. 文件和目录管理

      • 创建、删除、重命名文件和目录。
      • 维护文件和目录的层次结构。
    2. 存储空间分配

      • 为新创建的文件分配存储空间。
      • 回收删除文件所释放的空间。
    3. 文件访问控制

      • 设置文件和目录的权限,如读、写、执行权限,以控制用户对文件的访问。
    4. 文件属性管理

      • 记录文件的各种属性,如创建时间、修改时间、文件大小等。
    5. 数据存储和检索

      • 将文件的数据以适当的方式存储在存储设备上,并能够快速检索和读取。

    常见的 Linux 文件系统类型

    1. Ext4:是 Ext3 的扩展,具有更好的性能、可靠性和更大的文件系统容量支持。
    2. XFS:适用于大容量存储和高性能需求的场景。
    3. Btrfs:具有先进的特性,如快照、数据校验和等。

    文件系统的工作原理

    1. 文件系统在存储设备上划分出不同的区域,如超级块、inode 区、数据区等。
    2. 超级块包含文件系统的关键信息,如文件系统的大小、空闲空间等。
    3. Inode(索引节点)用于存储文件的元数据,如权限、所有者、大小、指向数据块的指针等。
    4. 数据区用于实际存储文件的内容。

    文件操作示例

    当用户打开一个文件进行读取时,文件系统会:

    1. 根据文件名查找对应的 inode。
    2. 从 inode 中获取文件的属性和数据块的位置信息。
    3. 从指定的数据块中读取文件的内容,并返回给用户程序。

    文件系统是 Linux 内核中实现数据持久化和有效管理的关键部分,它为用户和应用程序提供了方便、高效和可靠的文件操作接口。

    五. 设备管理和驱动

    Linux 内核中的设备管理和驱动是负责处理与硬件设备交互的关键部分。以下是对其的详细介绍:

    设备管理

    1. 设备分类

      • 字符设备:以字符流的方式进行数据传输,例如键盘、鼠标、串口等。
      • 块设备:以数据块的方式进行数据传输,例如硬盘、软盘、U 盘等。
      • 网络设备:用于网络通信,例如以太网卡。
    2. 设备注册与发现

      • 硬件设备在系统启动或插入时,其驱动程序会向内核注册设备信息。
      • 内核通过各种机制(如总线扫描)发现新设备。
    3. 设备资源管理

      • 分配和管理设备所需的 I/O 端口、内存地址、中断等资源。
    4. 设备文件

      • 在文件系统中为每个设备创建一个特殊的设备文件,用户程序通过对设备文件的操作来与设备交互。

    设备驱动

    1. 驱动程序的作用

      • 作为内核与硬件设备之间的桥梁,将硬件的操作细节封装起来,为内核提供统一的接口。
    2. 驱动程序的结构

      • 初始化部分:完成设备的初始化、资源申请等工作。
      • 操作接口实现:实现对设备的读、写、控制等操作。
      • 中断处理:处理设备产生的中断。
    3. 驱动加载与卸载

      • 可以在内核启动时静态加载,也可以在运行时动态加载和卸载。
    4. 数据传输方式

      • 轮询:驱动程序不断检查设备状态,以获取数据或确定是否可以发送数据。
      • 中断:设备通过发送中断信号通知内核有数据或操作完成。
    5. 示例

      • 例如硬盘驱动程序,负责管理硬盘的读写操作,处理磁盘的分区、扇区、磁道等物理特性,将复杂的硬件操作转化为内核能够理解的统一接口。

    总之,设备管理和驱动使得 Linux 能够支持各种各样的硬件设备,为用户提供丰富的功能和良好的性能。不同类型的设备需要相应的驱动程序来实现与内核的有效通信和协同工作。

    六. 网络通信

    Linux 内核中的网络通信是实现系统与外部网络进行数据交换和通信的关键部分。以下是对其的详细介绍:

    网络协议栈

    1. TCP/IP 协议簇

      • 包括 TCP(传输控制协议)提供可靠的面向连接的通信,确保数据的准确和有序传输。
      • UDP(用户数据报协议)提供无连接、不可靠但快速的数据传输。
      • IP(网际协议)负责数据包的路由和寻址。
    2. 网络层

      • 处理 IP 数据包的路由和转发,根据目标 IP 地址确定数据包的传输路径。
    3. 传输层

      • TCP 负责建立连接、数据分段、流量控制、拥塞控制和错误恢复。
      • UDP 则用于简单的、对实时性要求高的应用,如音频和视频流。
    4. 应用层协议支持

      • 支持 HTTP、FTP、SSH 等各种常见的应用层协议。

    套接字(Socket)接口

    1. 提供统一的编程接口

      • 应用程序通过创建套接字来与网络进行通信。
      • 套接字类型包括流式套接字(SOCK_STREAM,对应 TCP)和数据报套接字(SOCK_DGRAM,对应 UDP)。
    2. 地址和端口

      • 定义网络通信的端点,包括 IP 地址和端口号。

    数据包处理

    1. 接收数据包

      • 网络接口接收来自网络的数据包,并将其传递给内核网络层。
    2. 数据包解析

      • 内核解析数据包的头部信息,确定协议类型、源地址、目标地址等。
    3. 路由决策

      • 根据目标地址和路由表,决定数据包的下一跳。
    4. 发送数据包

      • 应用程序通过套接字发送数据,内核将数据封装成数据包,并通过网络接口发送出去。

    网络设备驱动

    1. 与硬件网络设备交互

      • 负责控制网络接口卡(NIC)的工作,如发送和接收数据帧。
    2. 中断处理

      • 处理网络设备产生的中断,通知内核有新的数据到达或发送完成。

    网络安全机制

    1. 防火墙

      • 基于规则对数据包进行过滤,阻止非法访问。
    2. IP tables

      • 提供灵活的数据包过滤和网络地址转换(NAT)功能。

    网络性能优化

    1. 缓冲区管理

      • 优化数据包的接收和发送缓冲区,减少数据丢失和提高传输效率。
    2. 拥塞控制

      • 调整数据发送速率,避免网络拥塞。

    例如,当您在浏览器中访问一个网站时,浏览器通过套接字向 Linux 内核发送请求。内核根据网络协议栈处理数据包,通过路由找到目标服务器,并将响应数据包返回给浏览器,整个过程都依赖于 Linux 内核的网络通信功能。

    Linux 内核的网络通信部分提供了强大而灵活的功能,使得系统能够高效、可靠地在网络环境中进行数据传输和通信。

    七. 系统的初始化(引导)

    Linux 系统的初始化(引导)是一个复杂但有序的过程,负责启动系统并为其运行做好准备。以下是对其的详细介绍:

    BIOS/UEFI 阶段

    1. 开机自检(Power-On Self-Test,POST)

      • 计算机硬件进行基本的检查,包括内存、硬盘、CPU 等。
      • 检测硬件是否正常工作。
    2. 选择启动设备

      • 根据 BIOS/UEFI 的设置,选择从硬盘、光盘、USB 等设备启动。

    加载引导程序

    1. 主引导记录(MBR)或 GUID 分区表(GPT)

      • MBR 位于硬盘的第一个扇区,GPT 有特定的分区结构。
      • 包含引导代码和分区表信息。
    2. 引导加载程序(Boot Loader)

      • 常见的如 GRUB(Grand Unified Bootloader)。
      • 负责加载内核映像。

    内核加载阶段

    1. 定位和读取内核映像

      • 引导加载程序从指定位置(如硬盘分区)读取压缩的内核映像到内存。
    2. 解压缩内核

      • 对内核映像进行解压缩,准备执行。

    内核初始化阶段

    1. 硬件检测和初始化

      • 检测系统中的硬件设备,并初始化必要的硬件驱动。
    2. 内存管理初始化

      • 建立内存映射,设置内存区域的访问权限。
    3. 进程管理初始化

      • 创建初始进程和进程调度相关的数据结构。
    4. 中断处理初始化

      • 设置中断向量表,使系统能够响应硬件中断。
    5. 文件系统初始化

      • 挂载根文件系统。
    6. 启动第一个用户空间进程

      • 通常是 /sbin/init 进程。

    /sbin/init 进程

    1. 运行系统初始化脚本

      • 根据系统的运行级别,执行相应的初始化脚本。
      • 例如,在系统启动时执行服务的启动、设置网络参数等操作。
    2. 切换运行级别

      • 用户可以通过命令切换系统的运行级别,以改变系统的服务和运行状态。

    系统的初始化(引导)过程确保了 Linux 系统能够从硬件启动到进入可操作的状态,为用户提供稳定和可用的环境。在这个过程中,各个组件协同工作,完成硬件检测、资源配置和服务启动等关键任务。

    八. 系统调用

    系统调用是操作系统提供给应用程序与内核进行交互的接口,下面是详细介绍:

    定义和作用

    系统调用是应用程序请求内核服务的一种机制。它允许应用程序访问操作系统内核所管理的资源,执行特权操作,以及获得内核提供的功能。

    重要性

    1. 安全性保障

      • 防止应用程序直接访问和修改关键的系统资源,保护系统的稳定性和安全性。
    2. 资源管理

      • 内核统一管理系统资源,通过系统调用合理分配和控制资源的使用。

    常见的系统调用类型

    1. 进程管理

      • fork():创建一个新进程。
      • exec():在当前进程中执行新的程序。
      • wait():等待子进程结束。
    2. 文件操作

      • open():打开文件。
      • read():从文件读取数据。
      • write():向文件写入数据。
      • close():关闭文件。
    3. 内存管理

      • malloc():动态分配内存。
      • free():释放动态分配的内存。
    4. 设备操作

      • ioctl():对设备进行特定的控制操作。
    5. 网络操作

      • socket():创建套接字。

    系统调用的执行过程

    1. 应用程序通过特定的指令或函数调用触发系统调用。

    2. 处理器切换到特权模式(内核模式)。

    3. 内核根据系统调用号确定要执行的具体服务例程。

    4. 执行相应的内核代码,完成请求的操作。

    5. 返回结果给应用程序,处理器切换回用户模式。

    例如,当一个应用程序需要读取一个文件的内容时,它会调用 read() 系统调用。内核会验证应用程序的权限,然后从磁盘中读取数据并返回给应用程序。

    总之,系统调用是连接应用程序和操作系统内核的桥梁,使得应用程序能够在受控和安全的方式下利用操作系统的功能。

    九. 总结

    Linux 内核是 Linux 操作系统的核心中枢,具有以下重要方面:

    1. 资源统筹:管理着计算机的关键资源,涵盖 CPU 调度、内存分配、存储管理、设备控制和网络通信。
    2. 进程运作:负责进程的全生命周期,从创建、调度到终止,保障进程高效且有序执行。
    3. 内存掌控:运用虚拟内存技术,合理分配物理内存,确保各进程内存空间独立且安全。
    4. 文件管理:组织和操控文件及目录,分配存储空间,设定访问权限和记录文件属性。
    5. 设备交互:通过驱动程序使内核与各类硬件设备有效通信,实现设备的正常运作。
    6. 网络连接:构建网络协议栈,处理数据包传输、路由决策和网络安全,支持多样的网络应用。
    7. 启动引导:历经硬件自检、引导程序加载、内核初始化等步骤,为系统运行做好准备。
    8. 系统接口:通过系统调用为应用程序提供访问内核服务的途径,严格控制操作权限。

    开源的 Linux 内核不断演进,适应多变的硬件环境和复杂的应用需求,是 Linux 系统稳定性和扩展性的基石。

  • 相关阅读:
    第四章:数据操作Ⅰ 第二节:读写CSV文件
    并发编程day09
    软考网络工程师 第五章 第六节 WLAN安全
    算法 合并有序序列
    CMake
    功能测试复习
    Linux_基本常用命令
    C++——智能指针
    E - Power and Modulo
    【ACWing】3627. 最大差值
  • 原文地址:https://blog.csdn.net/Cx20190420/article/details/139806361