【问题标题】:Does a C/C++ program run the CPU or on the Kernel?C/C++ 程序是在 CPU 上运行还是在内核上运行?
【发布时间】:2014-06-13 20:34:56
【问题描述】:

我已经编程了好几年了,但有一件事我从未完全理解:

有两种类型的编程语言。编译的和解释的,而编译的首先需要编译成解释语言,然后才能执行。

例如,C/C++需要先编译成机器语言,才能执行。

我的问题来了:谁真正运行编译的 C/C++ Windows/Linux 程序?是由 CPU 直接解释,还是由 OS Kernel 执行并将命令传递给 CPU?

如果 CPU 直接执行它,Windows 内核如何拒绝某些调用?否则,是否意味着内核也理解机器语言,或者非内核C/C++程序不能编译成机器语言?

【问题讨论】:

  • @FelicePollano 是的,我知道。但我从架构的角度提出问题,哪些东西可以相互叠加;)
  • 编译后的程序包含cpu直接运行的机器语言。在运行程序之前,内核将 cpu 置于运行某些类型的指令(例如将物理内存映射到虚拟内存的东西)的状态。然后它跳转到程序并让它运行。
  • 好问题,但我只想说一本全面的介绍性教科书将包含答案,解释得很好。经典的是Tanenbaum。此外,将编译语言称为“编译为解释语言”是不正统的(尽管机器指令最终由硬件解释)。
  • 这是一个灰色地带。 MSVC 拥有或拥有生成解释性代码的选项。我不知道 ISO 标准中有任何内容禁止或规定这两种策略。然而,几乎所有的 C++ 实现都会生成在硬件上执行的代码。

标签: c++ c kernel machine-language


【解决方案1】:

程序在 CPU 上运行。 CPU 有不同级别的特权,所谓的“特权指令”只能由内核执行——这就是操作系统强制执行安全性的方式。

【讨论】:

  • X86 有 4 个级别,称为环。内核和部分设备驱动程序运行在最高级别,称为 ring 0。应用程序通常运行在最低级别,称为 ring 3。
  • PDP-11 在 1970 年代有 7 个。
猜你喜欢
  • 1970-01-01
  • 2017-09-29
  • 2017-08-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多