26

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

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

4

2 回答 2

30

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

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

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

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

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


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

对我来说,机器代码似乎应该在比操作系统更低的级别运行,因此,我无法理解操作系统如何充当已编译应用程序和硬件之间的中介。

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

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

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

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

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

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

于 2012-10-10T03:10:03.717 回答
5

操作系统提供系统调用,程序可以调用这些系统调用来访问较低级别的服务。

请注意,系统调用与system()您可能用于执行外部程序的函数不同。

系统调用用于执行访问文件、通过网络通信、请求堆内存等操作。

于 2012-10-10T03:08:13.470 回答