凌云的博客

行胜于言

Linux 内核概述(一)

分类:linux| 发布时间:2025-01-21 12:50:00

Unix内核提供了一个执行环境,应用程序可以在其中运行。 因此,内核必须实现一组服务和相应的接口。应用程序通过这些接口进行交互,通常不会直接与硬件资源交互。

进程/内核模型

CPU可以在用户模式(User Mode)或内核模式(Kernel Mode)下运行。 实际上,一些 CPU 可能有超过两种执行状态。 例如,80x86 微处理器有四种不同的执行状态。但所有标准的 Unix 内核只使用内核模式和用户模式。

当程序在用户模式下执行时,它不能直接访问内核数据结构或内核程序。 然而,当应用程序在内核模式下执行时,这些限制就不再适用。 每种CPU型号都提供特殊指令,用于在用户模式和内核模式之间切换。 程序通常在用户模式下执行,只有在请求内核提供的服务时,才会切换到内核模式。 当内核满足了程序的请求后,它会将程序切换回用户模式。

进程是动态实体,通常在系统中有一个有限的生命周期。 创建、消除和同步现有进程的任务由内核中的一组例程处理。

内核本身不是一个进程,而是一个进程管理器。 进程/内核模型假定,所有需要内核服务的进程使用一种叫做系统调用(system calls)的特定编程结构。 每个系统调用都会设置一组参数,用以标识进程请求,然后执行硬件相关的 CPU 指令,将程序从用户模式切换到内核模式。

除了用户进程,Unix系统还包括一些特权进程,称为内核线程,具有以下特点:

  • 它们在内核模式下运行,并处于内核地址空间中。
  • 它们不与用户交互,因此不需要终端设备。
  • 它们通常在系统启动时创建,并在系统关闭之前一直存在。

在单处理器系统上,任何时候只有一个进程在运行,它可以在用户模式或内核模式下运行。 如果它在内核模式下运行,处理器正在执行某个内核例程。 图 1 展示了用户模式和内核模式之间切换的示例。 进程 1 在用户模式下发出系统调用,之后进程切换到内核模式,系统调用被服务。 进程 1 随后在用户模式下继续执行,直到发生定时器中断,调度程序在内核模式下被激活。 进程切换发生,进程 2 开始在用户模式下执行,直到硬件设备触发中断。 由于中断,进程 2 切换到内核模式并处理该中断。

Unix内核的功能不仅仅是处理系统调用;实际上,内核例程可以通过多种方式被激活:

  • 一个进程调用系统调用。
  • 执行进程的 CPU 发出异常信号,这是一种异常情况,例如无效指令。内核代表引发异常的进程处理该异常。
  • 外围设备向 CPU 发出中断信号,以通知它发生了某些事件,如请求注意、状态变化或I/O操作完成。每个中断信号由一个称为中断处理程序的内核程序处理。由于外围设备与 CPU 异步操作,中断在不可预测的时刻发生。
  • 一个内核线程被执行。由于它在内核模式下运行,相关程序必须视为内核的一部分。

进程实现

为了让内核管理进程,每个进程都由一个进程描述符表示,进程描述符包含有关进程当前状态的信息。

当内核停止执行一个进程时,它会将多个处理器寄存器的当前内容保存在进程描述符中。这些寄存器包括:

  • 程序计数器(PC)和栈指针(SP)寄存器
  • 通用寄存器
  • 浮点寄存器
  • 处理器控制寄存器(处理器状态字),包含关于 CPU 状态的信息
  • 内存管理寄存器,用于跟踪进程访问的RAM

当内核决定恢复执行一个进程时,它会使用适当的进程描述符字段来加载 CPU 寄存器。 由于程序计数器的存储值指向最后执行指令之后的指令,进程会从停止的位置继续执行。

当进程没有在 CPU 上执行时,它在等待某个事件。 Unix内核区分了许多等待状态,这些状态通常通过进程描述符的队列来实现;每个(可能为空的)队列对应于一组等待特定事件的进程。