【问题标题】:What code is user mode code and what code is kernel mode code?什么代码是用户模式代码,什么代码是内核模式代码?
【发布时间】:2018-10-14 05:10:46
【问题描述】:

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

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

那么我猜如果我运行程序,操作系统会为内核代码完成的代码分配一个内存地址。

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

那么……那哪位是用户模式代码?

【问题讨论】:

    标签: c operating-system programming-languages


    【解决方案1】:

    在一般情况下,您编写的任何代码都是“用户模式代码”。只有当您执行系统调用并且控制从您的用户代码跳转到操作系统时才会执行内核模式代码。

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

    【讨论】:

    • 所以你的意思是,编写任何类型的应用程序大多是用户模式?或者你能给我一个用户模式的明确定义
    • 你写的都是用户模式。当你进行系统调用时——比如getpid()read()——你编写的代码是用户模式代码,直到系统调用执行切换到内核模式的那一刻。然后内核中的(预先编写的)代码会接管一段时间,并最终返回到用户模式,并采取适当的措施;
    • 所以内核代码将分配内存给我的应用程序和调度等,以及何时调度到资源而不是所有用户模式代码不引用一些系统调用,例如 IO 中断,例如 scanf()
    • 是的,当您的代码请求内存时,它会进行系统调用以请求额外的内存。当然,并不是每次调用malloc() 都会导致系统调用。 C 库通常会通过在第一次调用时分配比绝对必要更多的内存并在后续调用中使用额外的内存来尽量减少必要的调用次数。不过,C 库也是用户模式代码。是的,内核处理先发制人的进程调度、中断、磁盘管理等。但是当您的代码不进行系统调用时,那就是用户模式代码。所有scanf() 都是用户模式代码。
    • 但是 scanf() 确实调用了系统调用的子程序,对吗?因为它的作用是调用IO请求
    【解决方案2】:

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

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 2015-08-29
      • 2011-04-22
      • 2014-05-07
      • 2011-01-04
      • 2011-01-16
      • 2011-04-23
      相关资源
      最近更新 更多