操作系统中的用户和内核模式有什么区别?

时间:2009-08-21 11:22:05

标签: operating-system

用户模式和内核模式之间有什么区别,为什么以及如何激活它们中的任何一个,以及它们的用例是什么?

7 个答案:

答案 0 :(得分:130)

  
      
  1. 内核模式

         

    在内核模式下,执行代码已完成且不受限制   访问底层硬件。它   可以执行任何CPU指令和   引用任何内存地址。核心   模式一般是为了保留的   最低级,最值得信赖的功能   的操作系统。崩溃了   内核模式是灾难性的;他们   将停止整台电脑。

  2.   
  3. 用户模式

         

    在用户模式下,执行代码无法直接访问   硬件或参考存储器。码   在用户模式下运行必须委托给   系统API访问硬件或   记忆。由于提供的保护   通过这种隔离,崩溃   用户模式始终可以恢复。最   在您的计算机上运行的代码   将以用户模式执行。

  4.   

了解更多

Understanding User and Kernel Mode

答案 1 :(得分:44)

这是计算机可以运行的两种不同模式。在此之前,当计算机就像一个大房间,如果有什么东西崩溃 - 它会停止整个计算机。所以计算机架构师决定改变它。现代微处理器在硬件中实现至少2种不同的状态。

用户模式:

  • 所有用户程序执行的模式。它无法访问RAM 和硬件。这是因为如果所有程序都运行了 内核模式,他们将能够覆盖彼此的内存。如果 它需要访问任何这些功能 - 它会调用 底层API。除了系统之外,每个进程都由Windows启动 进程以用户模式运行。

内核模式:

    所有内核程序执行的
  • 模式(不同的驱动程序)。它有 访问每个资源和底层硬件。任何CPU指令 可以执行,并且可以访问每个内存地址。这种模式 保留给在最低级别操作的司机

切换的方式。

从用户模式切换到内核模式不是由CPU自动完成的。 CPU被中断(定时器,键盘,I / O)中断。当发生中断时,CPU停止执行当前运行的程序,切换到内核模式,执行中断处理程序。此处理程序保存CPU的状态,执行其操作,恢复状态并返回用户模式。

http://en.wikibooks.org/wiki/Windows_Programming/User_Mode_vs_Kernel_Mode

http://tldp.org/HOWTO/KernelAnalysis-HOWTO-3.html

http://en.wikipedia.org/wiki/Direct_memory_access

http://en.wikipedia.org/wiki/Interrupt_request

答案 2 :(得分:8)

运行Windows的计算机中的处理器有两种不同的模式:用户模式和内核模式。处理器根据处理器上运行的代码类型在两种模式之间切换。应用程序以用户模式运行,核心操作系统组件以内核模式运行。虽然许多驱动程序在内核模式下运行,但某些驱动程序可能以用户模式运行。

启动用户模式应用程序时,Windows会为应用程序创建一个进程。该过程为应用程序提供私有虚拟地址空间和私有句柄表。由于应用程序的虚拟地址空间是私有的,因此一个应用程序无法更改属于另一个应用程序的数据。每个应用程序都是独立运行的,如果应用程序崩溃,则崩溃仅限于该应用程序。其他应用程序和操作系统不受崩溃的影响。

除了私有之外,用户模式应用程序的虚拟地址空间也是有限的。以用户模式运行的处理器无法访问为操作系统保留的虚拟地址。限制用户模式应用程序的虚拟地址空间可防止应用程序更改并可能损坏关键操作系统数据。

在内核模式下运行的所有代码共享一个虚拟地址空间。这意味着内核模式驱动程序不会与其他驱动程序和操作系统本身隔离。如果内核模式驱动程序意外写入错误的虚拟地址,则属于操作系统或其他驱动程序的数据可能会受到危害。如果内核模式驱动程序崩溃,整个操作系统崩溃。

如果您是Windows用户,请通过此链接获得更多信息。

Communication between user mode and kernel mode

答案 3 :(得分:5)

我打算在黑暗中捅一下,猜猜你在谈论Windows。简而言之,内核模式可以完全访问硬件,但用户模式则没有。例如,许多(如果不是大多数)设备驱动程序是以内核模式编写的,因为它们需要控制其硬件的更精细细节。

另见this wikibook

答案 4 :(得分:3)

其他答案已经解释了用户和内核模式之间的区别。如果你真的想详细说明,你应该得到一份副本 Windows Internals,由Mark Russinovich和David Solomon编写的优秀书籍,描述了各种Windows操作系统的体系结构和内部细节。

答案 5 :(得分:3)

CPU响铃是最明显的区别

在x86保护模式下,CPU始终处于4个环之一。 Linux内核仅使用0和3:

  • 0 for kernel
  • 3 for users

这是kernel vs userland最硬,最快的定义。

为什么Linux不使用第1和第2环:CPU Privilege Rings: Why rings 1 and 2 aren't used?

目前的戒指是如何确定的?

当前的戒指是通过以下组合选择的:

  • 全局描述符表:GDT条目的内存表,每个条目都有一个字段Privl,用于对环进行编码。

    LGDT指令将地址设置为当前描述符表。

    另请参阅:http://wiki.osdev.org/Global_Descriptor_Table

  • 段注册CS,DS等,它指向GDT中条目的索引。

    例如,CS = 0表示GDT的第一个条目当前对执行代码有效。

每枚戒指可以做什么?

CPU芯片是物理构建的,因此:

  • ring 0可以做任何事情

  • ring 3无法运行多条指令并写入多个寄存器,最值得注意的是:

    • 无法改变自己的戒指!否则,它可以将自己设置为响铃0并且响铃将是无用的。

      换句话说,无法修改当前确定当前响铃的当前segment descriptor

    • 无法修改页面表:How does x86 paging work?

      换句话说,无法修改CR3寄存器,并且分页本身会阻止修改页表。

      这可以防止一个进程看到其他进程的内存,以确保安全/易于编程。

    • 无法注册中断处理程序。这些是通过写入内存位置来配置的,这也可以通过分页来防止。

      处理程序在环0中运行,会破坏安全模型。

      换句话说,不能使用LGDT和LIDT指令。

    • 无法执行inout等IO指令,因此可以进行任意硬件访问。

      否则,例如,如果任何程序可以直接从磁盘读取,则文件权限将毫无用处。

      更确切地说,感谢Michael Petch:操作系统实际上可以在环3上允许IO指令,这实际上是由Task state segment控制的。

      如果戒指3首先没有这样做,那么戒指3是否允许这样做是不可能的。

      Linux总是不允许它。另见:Why doesn't Linux use the hardware context switch via the TSS?

程序和操作系统如何在响铃之间转换?

  • 当CPU打开时,它开始在环0中运行初始程序(很好,但它是一个很好的近似值)。您可以将此初始程序视为内核(但它通常是一个引导加载程序,然后仍然在内环0中调用内核)。

  • 当userland进程希望内核为其执行某些操作(如写入文件)时,它会使用生成中断的指令(如int 0x80)来通知内核。

    当发生这种情况时,CPU会调用并中断内核在引导时注册的回调处理程序。

    此处理程序在ring 0中运行,它决定内核是否允许此操作,执行操作,并在ring 3中重新启动userland程序。

  • 当使用exec系统调用(或内核will start /init)时,新用户空间进程的内核prepares the registers and memory,然后它跳转到入口点,将CPU切换到响铃3

  • 如果程序试图做一些顽皮的事情,比如写入禁止的寄存器或内存地址(因为分页),CPU也会调用第0环中的一些内核回调处理程序。

    但是由于用户区很淘气,这次内核可能会杀死进程,或者发出信号警告。

  • 内核启动时,会设置一个固定频率的硬件时钟,定时产生中断。

    此硬件时钟生成运行0的中断,并允许它安排唤醒哪些用户进程。

    这样,即使进程没有进行任何系统调用,也可能发生调度。

有多个戒指有什么意义?

分离内核和用户空间有两个主要优点:

  • 制作节目更容易,因为你更确定一个人不会干扰另一个节目。例如,一个用户进程不必担心因为分页而覆盖另一个程序的内存,也不必担心将硬件置于无效状态以进行另一个进程。
  • 更安全。例如。文件权限和内存分离可能会阻止黑客应用程序读取您的银行数据。当然,这假设您信任内核。

如何玩它?

我创建了一个裸机设置,应该是直接操纵戒指的好方法:https://github.com/cirosantilli/x86-bare-metal-examples

不幸的是,我没有耐心做出用户名的例子,但我确实做了分页设置,所以userland应该是可行的。我很乐意看到拉动请求。

或者,Linux内核模块在ring 0中运行,因此您可以使用它们来尝试特权操作,例如:读取控制寄存器:How to access the control registers cr0,cr2,cr3 from a program? Getting segmentation fault

这是一个convenient QEMU + Buildroot setup来试用它而不会杀死你的主机。

内核模块的缺点是其他kthread正在运行并且可能会干扰您的实验。但理论上你可以用内核模块接管所有中断处理程序并拥有系统,这实际上是一个有趣的项目。

否定次数

虽然在英特尔手册中实际上没有引用负环,但实际上CPU模式还具有比环0本身更多的功能,因此非常适合负极环#34;名。

一个例子是虚拟化中使用的虚拟机管理程序模式。

有关详细信息,请参阅:https://security.stackexchange.com/questions/129098/what-is-protection-ring-1

<强> ARM

在ARM中,环被称为异常级别,但主要思想保持不变。

ARMv8中存在4个异常级别,通常用作:

  • EL0:userland

  • EL1:内核

  • EL2:hypervisors,例如Xen

    虚拟机管理程序是指操作系统,操作系统属于用户空间。

    例如,Xen允许您同时在同一系统上运行多个操作系统(如Linux或Windows),并且它将操作系统彼此隔离,以确保安全性和调试的简便性,就像Linux用于用户程序一样。

    虚拟机管理程序是当今云基础架构的关键部分:它们允许多台服务器在单个硬件上运行,使硬件使用率始终接近100%并节省大量资金。

    例如,AWS使用Xen直到2017年its move to KVM made the news

  • EL3:又一个级别。 TODO示例。

ARMv8 Architecture Reference Model DDI 0487C.a - 第D1章 - AArch64系统级程序员模型 - 图D1-1说明了这一点:

enter image description here

请注意,ARM可能由于后见之明的优势而具有比x86更好的命名约定,而不需要负级别:0表示较低级别,3表示最高级别。较高级别往往比较低级别创建更多。

可以使用MRS指令查询当前的EL:what is the current execution mode/exception level, etc?

ARM不要求存在所有异常级别,以允许不需要该功能的实现来节省芯片区域。 ARMv8&#34;异常级别&#34;表示:

  

实现可能不包括所有异常级别。所有实现必须包括EL0和EL1。   EL2和EL3是可选的。

例如,QEMU默认为EL1,但可以使用命令行选项启用EL2和EL3:qemu-system-aarch64 entering el1 when emulating a53 power up

答案 6 :(得分:1)

<强>什么

基本上,内核和用户模式之间的差异不依赖于操作系统,只能通过硬件设计限制某些指令仅在内核模式下运行来实现。所有其他目的,如内存保护只能通过该限制来完成。

如何

这意味着处理器处于内核模式或用户模式。使用某些机制,架构可以保证无论何时切换到内核模式,都会获取操作系统代码。

<强>为什么

拥有这些硬件基础设施可以在常见操作系统中实现:

  • 保护用户程序不访问整个内存,例如,不要让程序覆盖操作系统,
  • 阻止用户程序执行敏感指令,例如那些更改CPU内存指针边界的指令,例如,不要让程序破坏其内存边界。