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

C++ 编译后的程序如何与操作系统交互?,c++,operating-system,C++,Operating System,当一个程序被编译时,它被转换成机器可以“理解”的机器代码。这个机器代码是如何与操作系统交互的,以便执行诸如从键盘获取输入之类的操作? 在我看来,机器代码应该在比操作系统更低的级别上运行,因此,我无法理解操作系统如何充当已编译应用程序和硬件之间的中介 PS:我刚刚开始C++编程,我试图了解cin和cout是如何工作的,操作系统提供程序可以调用以访问较低级别的服务 请注意,系统调用与可能用于执行外部程序的system()函数不同 系统调用用于访问文件、通过网络通信、请求堆内存等操作。这是一个非常好的

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


PS:我刚刚开始C++编程,我试图了解cin和cout是如何工作的,操作系统提供程序可以调用以访问较低级别的服务

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


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

这是一个非常好的问题(比您知道的要好),需要学习的内容很多。很多

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

   Software
       .
      /|\    
       |   communicates with
      \|/
       '
Operating System
       .
      /|\    
       |   communicates with
      \|/
       '
   Hardware
操作系统通过称为驱动程序的程序与硬件通信(广泛使用的术语),操作系统通过称为系统调用的程序与软件通信(不太广泛使用的术语)

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


我就到此为止,但你也说过:

在我看来,机器代码的运行级别应该低于 操作系统,因此,我无法理解操作系统如何 充当已编译应用程序和 硬件

这是一个棘手的问题,但一旦你了解了一些基本知识,就很简单了

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

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

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

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


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

编译后的应用程序只需对DLL进行函数调用(操作系统,如Windows中的kernel32.dll)其中包含其他机器代码的功能。其他机器代码是专门为与硬件一起工作而编写的,因此您不必这样做。这与您的问题有点相切,也不是真正的答案,但如果您对语言和操作系统之间的界限感兴趣,这可能会让您对许多m语言中的一些感到敬畏/恐惧/厌恶进程中的任何步骤…:-/CPU也可以在多种模式下运行(内核和用户),操作系统代码在更高权限的内核模式下运行。谢谢..这是一个非常好的答案。要明确的是,说系统调用就像一个中断,停止应用程序代码的执行,并切换为退出(即开始执行)操作系统代码?@mahela007不一定总是有中断。正如OrangeDog提到的,中断是告诉内核进入内核模式的一种方法。然而,这些与硬件中断略有不同。它被称为内核陷阱,这是一种软件中断。请看这里:和很好的解释。但是,你能澄清一下吗一件事。如果用户代码和操作系统代码都在轮换,那么谁在阻止用户代码直接访问硬件?@RahulBansal,OrangeDog在他的评论中解释道。CPU可以在多种模式下运行,具有不同的权限。