【问题标题】:How does a compiled program interact with the OS?编译后的程序如何与操作系统交互?
【发布时间】:2012-09-30 10:52:19
【问题描述】:

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

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

【问题讨论】:

  • 编译后的应用程序只是对包含其他机器代码函数的DLL(操作系统,如Windows中的kernel32.dll)进行函数调用。其他机器代码是专门为与硬件一起工作而编写的,因此您不必这样做。
  • 有点切题,并不能真正回答您的问题,但也许如果您对语言和操作系统之间的界限感兴趣,这会让您对某些问题感到敬畏/恐惧/厌恶您想知道的过程中有许多步骤... :-/ stackoverflow.com/a/2444508/211160

标签: c++ operating-system


【解决方案1】:

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

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

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

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

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


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

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

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

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

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

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

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

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

【讨论】:

  • CPU 也可以在多种模式下运行(内核和用户),操作系统代码在更高特权的内核模式下运行。
  • 谢谢..这是一个很好的答案。为了清楚起见,说系统调用就像一个中断,它停止执行应用程序代码并切换到(即开始执行)操作系统代码是否正确?
  • @mahela007 不一定总是有中断。正如 OrangeDog 所提到的,中断是告诉内核进入内核模式的一种方法。但是,这些与硬件中断略有不同。它被称为内核陷阱,它是一种软件中断。见这里:en.wikipedia.org/wiki/System_call#Typical_implementationsen.wikipedia.org/wiki/Trap_%28computing%29
  • 很好的解释。但是你能澄清一件事吗?如果用户代码和操作系统代码都轮流运行,那么谁在阻止用户代码直接访问硬件?
  • @RahulBansal,OrangeDog 在他的评论中解释了这一点。一个 CPU 可以在多种模式下运行,具有不同的权限。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-31
    • 2014-07-09
    • 2014-12-05
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    相关资源
    最近更新 更多