编译的程序如何与操作系统交互?

时间:2012-10-10 03:00:47

标签: c++ operating-system

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

PS:我刚刚开始进行C ++编程,我正在努力了解cin和cout是如何工作的

2 个答案:

答案 0 :(得分:25)

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

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

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

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

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


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

  

对我而言,似乎机器代码的运行级别应低于   操作系统,因此,我无法理解操作系统如何   充当编译的应用程序和   硬件

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

首先,所有代码都只是在CPU上运行的机器代码。没有代码高于或低于其他代码(除了一些只能在特权内核模式下运行的命令)。所以问题是,即使它放弃了对用户的CPU控制,操作系统怎么可能控制?

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

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

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

因为时钟始终滴答,并且因为操作系统总是获得在CPU上运行的定期机会,所以它能够协调计算机内的所有内容,即使它使用与任何普通程序相同的CPU命令集运行。

答案 1 :(得分:5)

操作系统提供system calls程序可以调用以访问较低级别的服务。

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

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