2012-10-10 48 views
20

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

PS:我刚开始的C++编程,我想了解操作系统的cout如何CIN和工作

+1

编译后的应用程序只是简单地调用DLL中的函数(操作系统,如Windows中的kernel32.dll),其中包含其他机器代码的函数。其他机器代码专门用于与硬件一起工作,因此您不必这样做。 –

+1

稍微切合实际并不是你的问题的答案,但也许如果你对语言和操作系统之间的界限感兴趣,这会给你一些敬畏/恐惧/厌恶在你的过程中许多许多步骤中的一些想知道...: -/http://stackoverflow.com/a/2444508/211160 – HostileFork

回答

23

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

我会尽量保持简短。操作系统作为抽象的软件和硬件之间的电平:

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

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

从本质上讲,当你做一个系统调用,你离开你的程序,并进入操作系统的代码。系统调用是程序员被允许与资源进行通信的唯一方式。


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

对我来说,似乎是机器代码应该比 一个较低的水平上运行的操作系统,因此,我可以”不懂如何操作系统可以 充当编译的应用程序和硬件 之间的中介。

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

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

当代码在CPU上运行时,有一个概念叫做中断。这是发送到导致当前正在运行的代码,以停止并获得与另一段代码切换出CPU的信号,称为中断处理程序。中断

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

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

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

+1

伟大的工作以非常简单的方式解释它。 –

+2

CPU也可以以多种模式(内核和用户)运行,操作系统代码在特权较高的内核模式下运行。 – OrangeDog

+0

谢谢..这是一个非常好的答案。 要说清楚,说一个系统调用就像一个中断,它会停止应用程序代码的执行,并且交换机与OS代码断开(即开始执行)是否正确? – mahela007

5

提供system calls程序可以调用去低级别服务的访问。

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

系统调用是用来做的事情一样访问文件,在网络上进行通信,请求堆内存等

相关问题