Linux 用户态和内核态!

嗨,你好啊,我是猿java

用户态

当一个程序在操作系统(例如Windows)上启动时,它会在用户模式下启动程序。当一个用户模式程序请求运行时,Windows会为其创建一个进程和虚拟地址空间(该进程的地址空间)。用户模式程序的权限低于用户模式应用程序,不能直接访问系统资源。例如,如果一个用户模式下的应用程序想要访问系统资源,它必须首先通过使用系统调用(syscall)来访问操作系统内核。

用户态是普通应用程序运行的环境。在这个模式下,程序只能访问受限的系统资源,不能直接与硬件交互,也不能执行特权指令。用户态的主要特点包括:

  • 受限访问:用户态程序只能访问用户空间的内存,不能直接访问内核空间的数据结构和代码。
  • 系统调用:当用户态程序需要访问硬件或执行特权操作时,必须通过系统调用(System Call)请求内核的服务。系统调用是一种受控的接口,确保用户态程序不能直接操作内核。
  • 隔离性:用户态程序之间是相互隔离的,一个程序的崩溃不会直接影响到其他程序或整个系统的稳定性。
  • 安全性:通过限制用户态程序的权限,可以防止恶意程序对系统进行破坏。

用户态的这种设计使得操作系统能够在提供丰富功能的同时,保持高度的安全性和稳定性。

内核态

内核是所有其他操作系统组件依赖的核心程序,用于访问硬件组件并调度计算机系统上应何时运行哪些进程,同时还管理应用软件和硬件之间的交互。因此,它是最有特权的程序,与其他程序不同,它可以直接与硬件交互。当在用户模式下运行的程序需要硬件访问(例如摄像头)时,首先必须通过使用系统调用来通过内核。为了执行这些请求,CPU在执行时会从用户模式切换到内核模式。最终完成进程的执行后,CPU会再次切换回用户模式。

内核态是操作系统内核运行的环境。内核态具有最高的权限,可以直接访问所有硬件资源和内存空间。内核态的主要特点包括:

  • 完全访问权限:在内核态下,操作系统可以访问所有的内存地址和硬件设备。这使得内核可以执行各种底层操作,如调度、内存管理和硬件控制。
  • 特权指令:内核态可以执行特权指令,这些指令通常涉及到硬件的直接操作和系统状态的修改。
  • 高风险:由于内核态具有最高权限,任何错误或漏洞都可能导致整个系统的崩溃或被攻击。因此,内核代码必须经过严格的验证和测试。
  • 关键功能:内核态负责实现操作系统的核心功能,如进程管理、内存管理、文件系统、网络协议栈等。

用户态与内核态的切换

用户态与内核态之间的切换是通过系统调用和中断机制实现的。当用户态程序需要执行特权操作时,会发起一个系统调用,请求内核的服务。系统调用的执行过程如下:

  • 系统调用请求:用户态程序通过库函数(如libc)发起系统调用请求。
  • 陷入内核态:系统调用请求通过软中断机制将控制权转交给内核,CPU从用户态切换到内核态。
  • 执行内核代码:内核根据系统调用号找到对应的服务例程,执行相应的操作。
  • 返回用户态:内核完成操作后,将返回值传递给用户态程序,并切换回用户态。

这种切换过程是受控且安全的,确保用户态程序不能直接影响内核的稳定性。

在实际应用中,用户态和内核态的划分对系统的性能和安全性有重大影响。以下是一些常见的应用场景:

  • 系统调用:如文件操作(open,read,write),网络操作(socket,connect)等,都是通过系统调用实现的。这些操作需要访问硬件资源,因此必须在内核态执行。
  • 设备驱动:设备驱动程序通常运行在内核态,因为它们需要直接与硬件设备交互。通过内核态的设备驱动,操作系统可以提供统一的接口供用户态程序使用。
  • 内存管理:内存分配和页面调度等操作需要涉及到物理内存的管理,这些操作在内核态完成。用户态程序通过系统调用请求内存分配,但实际的分配和管理由内核负责。
  • 进程调度:内核态负责进程的创建、销毁和调度。用户态程序通过系统调用请求进程操作,但调度算法和上下文切换在内核态执行。

内核态和用户态对比

内核模式和用户模式之间的区别:

标准 内核模式 用户模式
资源访问 在内核模式下,程序可以直接且无限制地访问系统资源。 在用户模式下,应用程序不能直接访问系统资源。为了访问资源,必须进行系统调用。
中断 在内核模式下,如果发生中断,整个操作系统可能会崩溃。 在用户模式下,如果发生中断,只有单个进程会失败。
模式 内核模式也被称为主模式、特权模式或系统模式。 用户模式也被称为非特权模式、受限模式或从模式。
虚拟地址空间 在内核模式下,所有进程共享一个虚拟地址空间。 在用户模式下,所有进程都有独立的虚拟地址空间。
权限级别 在内核模式下,应用程序具有比用户模式更多的权限。 在用户模式下,应用程序的权限较少。
限制 由于内核模式可以访问用户程序和内核程序,因此没有限制。 用户模式需要访问内核程序,因为它不能直接访问。
模式位值 内核模式的模式位值为0。 用户模式的模式位值为1。
内存引用 它能够引用所有内存区域。 它只能引用为用户模式分配的内存。
系统崩溃 内核模式下的系统崩溃非常严重,会使问题更复杂。 在用户模式下,系统崩溃可以通过简单地恢复会话来解决。
访问 只有基本功能被允许在此模式下操作。 用户程序可以在给定系统中访问并在此模式下执行。
功能 内核模式可以引用系统中的任何内存块,并且可以直接指示CPU执行指令,使其成为非常强大和重要的模式。 用户模式是标准和典型的查看模式,这意味着信息不能自行执行或引用任何内存块;它需要应用程序接口(API)来实现这些功能。

学习交流

如果你觉得文章有帮助,请帮忙转发给更多的好友,或关注公众号:猿java,持续输出硬核文章。

drawing