2009-08-21 573 views
82

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

+0

可能重复[内核空间和用户空间有什么区别?](https://stackoverflow.com/questions/5957570/what-is-the-difference-between-the-kernel-space-用户空间) – 2017-06-11 08:00:22

+0

@SalvadorDali嗨,目前的共识是关闭“质量”:http://meta.stackexchange.com/questions/147643/should-i-vote-to-close-a-duplicate-question-ven-though-its更新更新由于“质量”是无法衡量的,我只能通过点赞。 ;-)可能归结为哪个问题在标题上碰到了最好的newb Google关键词。我鼓励你简单地在那里复制你的答案,在底部添加一个免责声明,并且从这个链接中链接,以防万一它关闭。 – 2017-06-19 07:04:56

回答

117
  1. 内核模式

    在内核模式中,执行代码具有完全的和无限制 访问底层硬件。它可以执行任何CPU指令和 引用任何内存地址。内核 模式通常为操作系统的最低级别,最可信任的功能 保留 。在 内核模式下崩溃是灾难性的;他们 将停止整个PC。

  2. 用户模式

    在用户模式中,执行代码没有能力直接访问硬件 或参考存储器。在用户模式下运行的代码 必须委托给 系统API以访问硬件或 内存。由于通过这种隔离提供的保护 ,因此用户模式下的崩溃始终可恢复。在您的计算机 上运行的代码的大部分 都将在用户模式下执行。

更多

Understanding User and Kernel Mode

+0

不知道CPU在运行操作系统代码时,哪种模式是处理器在? – JackieLam 2013-06-19 09:00:23

+2

@JackieLam:它应该处于内核模式。 – kadina 2014-08-21 00:19:12

+0

因此,要运行__user space__进程,它必须映射到__kernel space__? – roottraveller 2017-09-09 12:57:02

5

我要在黑暗中进行刺探,并猜测您正在谈论Windows。简而言之,内核模式可以完全访问硬件,但用户模式不能。例如,许多(如果不是大多数)设备驱动程序是以内核模式编写的,因为它们需要控制其硬件的更精细的细节。请参阅this wikibook

+2

这对于程序员来说很重要,因为内核bug往往比你习惯的更糟糕。内核/用户区分的一个原因是内核可以监视/控制关键系统资源并保护每个用户不受其他用户的影响。它有点过于简化了,但仍然有帮助,提醒自己用户的错误通常很烦人,但内核错误往往会导致整个机器停机。 – 2009-08-21 11:39:14

3

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

40

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

用户模式:

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

内核模式:

  • 模式,所有的内核程序执行(不同的驱动程序)。它有 访问每个资源和底层硬件。可以执行任何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

+0

不知道CPU在运行操作系统代码时,哪种模式是处理器在? – JackieLam 2013-06-19 09:00:40

+1

@JackieLam:内核模式 – 2016-02-01 23:49:35

7

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

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

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

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

如果您是Windows用户,一旦通过此链接,您将获得更多。

Communication between user mode and kernel mode

1

什么

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

如何

这意味着处理器生活无论是在内核模式还是在用户模式。通过使用一些机制,体系结构可以保证只要切换到内核模式,操作系统代码就会被提取并运行。

为什么

有了这些可以在普通的操作系统来实现此硬件基础设施:

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

CPU环是最明显的区别

在x86保护模式下,CPU总是在4环之一。 Linux内核只用0和3:

  • 0内核
  • 3为用户

这是内核模式VS用户模式的最硬的和快速的定义。

为什么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芯片在物理上建立,使:

  • 环0可以做任何事情

  • 环3不能运行几条指令,并写入几个寄存器,最明显的是:

    • 不能改变自己的戒指!否则,它可能会将自己设置为振铃0,并且振铃无用。

      换句话说,不能修改当前的segment descriptor,这就决定了当前环。

    • 不能修改页表:How does x86 paging work?

      换句话说,不能修改CR3寄存器,和寻呼本身防止了页表的修改。

      这可以防止一个进程为了安全性/易于编程的原因而看到其他进程的内存。

    • 无法注册中断处理程序。这些通过写入到内存位置进行配置,这也是通过分页阻止的。

      处理程序在0环运行,并且会破坏安全模式。

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

    • 不能执行IO指令,如inout,因此有任意的硬件访问。

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

      更确切地说归功于Michael Petch:实际上操作系统可以允许环3上的IO指令,但实际上它是由Task state segment控制的。

      如果环3没有它,那么对于环3来说,不允许这样做是不可能的。

      的Linux始终不允许它。另请参见:Why doesn't Linux use the hardware context switch via the TSS?

如何如何的程序和操作系统的过渡环之间?

  • 当CPU被接通时,它开始运行在环0的初始程序(种很好,但它是一个良好的近似)。你可以将这个初始程序为内核(但它通常是一个引导程序是然后调用内核仍然在ring 0)。

  • 当一个用户级进程需要内核为写文件做某事时,它使用一条生成中断的指令,例如int 0x80来发信号通知内核。

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

    这个处理器在环0,这决定是否内核将允许这个动作,做动作,并在环3

  • 重新启动用户级程序时使用exec系统调用(或当运行内核will start /init),新的用户级进程的内核prepares the registers and memory,那么它跳转到进入点并切换CPU到环3

  • 如果程序试图做一些顽皮像写入到一个禁止的寄存器或存储器地址(因为分页),CPU还调用环0中的一些内核回调处理程序。

    但是由于用户区太淘气了,内核可能会在这个时候终止进程,或者给它一个带有信号的警告。

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

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

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

有多个环有什么意义?

有分离内核和用户级的两大优势:

  • 更容易使程序作为你更有某些人会不会相互干扰。例如,一个用户级进程不必担心由于寻呼而覆盖另一个程序的存储器,也不必担心将硬件置于另一个进程的无效状态。
  • 它更安全。例如。文件权限和内存分离可以防止黑客应用程序读取您的银行数据。这当然假设你信任内核。

负环

虽然负环没有在英特尔手动实际引用,但是实际上有些比0环本身进一步的能力等都是非常适合的“负CPU模式环“的名字。

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

更多详情请参见:https://security.stackexchange.com/questions/129098/what-is-protection-ring-1

如何玩弄呢?

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

我没有耐心做一个用户态的例子很不幸,但我没有走得太远,因为分页设置,所以userland应该是可行的。我很乐意看到拉请求。

+1

因为这个问题并不是针对任何操作系统的,所以ring 3中可以使用'in'和'out'。TSS可以指向当前任务中的一个IO许可表,授予读/写访问权限全部或特定的端口。 – 2018-02-21 02:37:50

+0

当然,您将IOPL位设置为值3,然后环3程序具有完整的端口访问权限,并且TSS IO权限不适用。 – 2018-02-21 03:44:53

+0

@MichaelPetch谢谢,我不知道这个。我已经更新了答案。 – 2018-02-21 13:33:09

相关问题