c++ - 编译后的程序如何与操作系统交互?

标签 c++ operating-system

当一个程序被编译时,它被转换成机器可以“理解”的机器代码。该机器代码如何与操作系统交互以执行诸如从键盘获取输入之类的操作? 对我来说,机器代码似乎应该在比操作系统更低的级别运行,因此,我无法理解操作系统如何充当已编译应用程序和硬件之间的中介。

PS : 我刚开始 C++ 编程,我想了解 cin 和 cout 是如何工作的

最佳答案

这是一个很好的问题(比你知道的要好),还有很多东西要学。很多。

我会尽量保持简短。操作系统充当软件和硬件之间的抽象层:

   Software
       .
      /|\    
       |   communicates with
      \|/
       '
Operating System
       .
      /|\    
       |   communicates with
      \|/
       '
   Hardware

操作系统通过称为驱动程序(广泛使用的术语)的程序与硬件通信,操作系统通过称为系统调用的程序与软件通信(不那么广泛使用的术语)。

本质上,当您进行系统调用时,您将离开您的程序并输入操作系统的代码。系统调用是允许程序员与资源进行通信的唯一方式。


现在我会停在那里,但你也说过:

To me, it seems that the machine code should run at a lower level than the operating system and therefore, I can't understand how the OS can act as an intermediary between the compiled application and the hardware.

这很棘手,但是一旦您了解了一些基础知识,就很简单了。

首先,所有代码都只是在 CPU 上运行的机器代码。没有代码比其他代码更高或更低(某些只能在特权内核模式下运行的命令除外)。那么问题来了,即使操作系统将 CPU 的控制权交给了用户,它又怎么可能处于控制之中呢?

当代码在 CPU 上运行时,有一个称为中断的概念。这是一个发送到 CPU 的信号,它会导致当前运行的代码停止并被另一段代码(称为中断处理程序)切换出来。

中断示例包括键盘、鼠标,最重要的是时钟。

定期引发时钟中断会导致操作系统的时钟中断处理程序运行。在这个时钟中断处理程序中是操作系统的代码,它检查当前正在运行的代码确定接下来需要运行的代码。这可以是更多的操作系统代码或更多的用户代码。

因为时钟总是在滴答作响,并且因为操作系统总是有这个周期性的机会在 CPU 上运行,所以它能够协调计算机内的一切,即使它使用与任何普通程序相同的 CPU 命令集运行。

关于c++ - 编译后的程序如何与操作系统交互?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12811359/

相关文章:

c++ - 为什么不应该直接访问 __m128i 字段?

operating-system - 为什么 x86-64 长模式不需要分段?

python - 我应该将我的主操作系统切换到更适合编码的操作系统吗?

C++ AES 加密被截断为 16 个字符

c++ - 有选择地将函数定义添加到 python 命名空间

c++ - 在 C++ 中继承层次结构时提取实现者

c++ - 传递给另一个对象后如何访问自定义类型?

linux - 看书学习Linux内核

c - 如何使用 asm 和 c 创建多级引导加载程序?

c++ - : public after struct mean? 是什么