什么代码是用户模式代码,什么代码是内核模式代码?

What code is user mode code and what code is kernel mode code?

我在学习操作系统课程时有一个问题要问自己。

如果我在我的文本编辑器或 IDE 中输入任何 C 代码并使用编译器执行它 它将代码翻译成机器代码。

然后我猜如果我运行程序,OS会分配一个内存地址给由内核代码完成的代码。

如果在我的代码中输入了 IO 中断,内核代码就会执行。

所以...用户模式代码是哪一位?

在通常情况下,您编写的任何代码都是'user mode code'。仅当您执行系统调用并且控件从您的用户代码跳转到操作系统时,才会执行内核模式代码。

显然,如果您正在编写内核代码或可加载内核模块,那么情况就不同了——该代码将是内核模式代码。但是大多数人大部分时间都只是在编写用户模式代码。

内核模式与用户模式实际上反映了处理器的性能运行。

对于现代操作系统,只有在操作系统信任的情况下,代码才会(与处理器一起)在内核模式下运行,而所有其他代码都在用户模式下运行。

在现代操作系统下,功能差异在于内核模式代码在代表所有系统资源的单个(虚拟)地址 space 中运行,因此内核模式中的所有功能可以直接相互影响。例如,内核模式驱动程序的所有操作都可以直接影响操作系统本身和任何其他内核模式驱动程序的功能。 (具体实现细节因操作系统类型而异,例如 windows、linux、BSD 等,但基本原理相同)

这意味着,如果您正在编写将在操作系统内部工作或内核模式驱动程序中执行的代码,那么它可能被称为内核模式代码。否则,它将是用户模式代码。尝试某些只能在内核模式下执行的操作的代码将被处理器本身阻止,除非处理器本身处于内核模式。操作系统本身在处理器进入内核模式时进行调解,这就是为什么代码需要被操作系统识别(或安装,在内核模式驱动程序的情况下)才能完成只能在内核模式下完成的事情。如果没有操作系统已经识别的一些代码的帮助,用户模式代码不能任意将处理器升级到内核模式。

实际上,现代操作系统还提供了一组可以从用户模式调用的函数(例如在 API 中)。许多这些功能本身仅在用户模式下执行。但是,有些会导致处理器切换到内核模式以执行某些特定操作,然后处理器通过时间控制 returns 切换回用户模式给调用者。 OS 本身中的哪些代码在用户模式或内核模式下执行取决于操作系统的设计和管理设置(例如,只有适当的特权用户(也称为管理员)才能安装内核模式驱动程序) ).