软件/代码如何实际与硬件通信?

时间:2010-06-15 06:45:13

标签: operating-system

我的问题是:

当我按下Windows / Linux中的“关机”按钮时,计算机将关闭。命令“关闭”是如何实际使计算机物理关闭的?

要明确我的观点:

当我们踢球时,球与我们的腿之间存在物理接触,以便球移动。那么软件和硬件之间的物理连接如何实现? 代码的纯文本如何使计算机完成它的工作?

14 个答案:

答案 0 :(得分:40)

虽然答案相当复杂,但需要了解电气系统的基本知识。电路(KVL,KCL),二进制数字和布尔逻辑,我们可以在高级别描述的过程:代码(由纯文本字表示)被编译时,组装,并最终转化为Zero的和1的组合,其代表低和高压分别。

当电压施加到材料上时电路,这些电压可以改变它们的物理特性,例如关闭向灯泡提供电流的电路(使其发光)或向直流电机提供电流,这可能会打开CD / DVD /蓝光/(?)驱动。

现在想象一个假想的1位CPU,它能够关闭电路并向蜂鸣器发送电流,发出声音。这个1位CPU有一个输入,可以有两个值:0和1。

这个简单的CPU有一个非常简单的汇编语言:ONOFF,我们有一种奇特的编程语言,它提供了一些更好的抽象:cpu.turnOncpu.turnOff

我写了我的程序cpu.turnOn;编译它,组装它,它已经准备好运行了。当我在CPU上运行程序时,蜂鸣器会打开。

在现实世界中,计算机由更复杂的系统组成。我们拥有64位CPU,具有复杂的指令集和无数的设备,而不是单个1位CPU。

为了使复杂系统能够进行交互,这些系统由抽象层组成。

最低层是电压,电路和硅,或者您可能认为的实际“物理硬件”。除此之外,硬件通常是“微控制器”或专门的处理单元,其设计用于与硬件的细节交互。想象一下光盘驱动器,它的微控制器能够弹出驱动器托架,启动电机,对齐激光器,并从光盘中流出数据。

微控制器运行的软件称为固件。它是一个控制硬件功能的专用操作系统,也可能包含API。在假想的1位CPU示例中,程序将是固件,cpu.turnOn, cpu.turnOff将是API。

鉴于计算机由许多硬件组件(图形,存储,通信,i / o)组成,计算机由许多专用固件组成。对于完成该硬件的任何有用的东西,需要另一层抽象,例如以通用方式处理键盘,或者允许鼠标,触摸板和轨迹球尽管有不同的交互,但都表现相同。这就是操作系统的用武之地。操作系统提供了一个API来管理相关设备组,并为硬件供应商提供了挂钩,以提供操作系统命令和微控制器理解的命令之间的转换。在Windows中,这是driver.

操作系统和驱动程序之上的下一层抽象是应用程序,用户用来做实际工作(或玩Fortnite)。这些程序是用无数的languanges,SDK和工具包编写的,这也是StackOverflow存在的原因。这些语言编译成可执行代码,操作系统加载和管理,并由计算机执行。

将所有内容与shutdown命令结合使用:命令intepreter使用管理系统功能的操作系统级API。该API向操作系统的其余部分发送通知,以处理诸如正常刷新内存缓冲区,保存应用程序状态,终止通信通道以及关闭各种硬件系统(或更可能进入低功耗模式)之类的操作。它还使用电源驱动程序(ACPI?)与计算机电源管理子系统连接。该子系统被指示关闭,该信号又向计算机电源发送信号以断开电路并且不再向大多数组件供电。

答案 1 :(得分:9)

如果您认为软件与硬件相比是一种不同的生物,那么解释不会让您满意。认为软件就像一系列电荷。您编写的所有代码都将作为电荷序列存储在RAM或磁盘上。所以你不是写文字而是电荷的顺序。您的视频卡正在用英语在显示器上绘制内容,以帮助您了解您正在键入的内容。在某种程度上,也许是真的,无论你在电脑上做什么都是物理的。

答案 2 :(得分:5)

好吧,关机实际上并不是物理的,计算机中的所有电路都不会完全关闭,直到您拔掉电源。

该软件使用BIOS中的APM (Advanced Power Management)接口来控制计算机中的电源电路。

当计算机关闭时,它仍然可以在没有物理拉动开关的情况下打开,例如来自计算机网卡的Wake on LAN信号。

答案 3 :(得分:5)

软件作为硬盘驱动器或软盘上的磁畴存储在硬件中,或者作为计算机芯片中的低电压和高电压存储在硬件中。当您在键盘上键入时,每个字符都会转换为0和1的电气系列,然后将其作为低电压和高电压存储在称为RAM的计算机芯片中。然后将RAM中的低电压和高电压转换为硬盘驱动器或软盘上的磁畴,以便稍后通过磁头读回电压,或者作为低电压和高电压存储在非易失性计算机芯片中以便以后读回。低电压和高电压表示由键盘字符生成的电气0和1。

答案 4 :(得分:3)

腿踢球就是一个很好的例子。它在机器上非常相似。 CPU连接到系统的所有其他部分,但与神经系统(物理接线)不同,所有神经一次连接,CPU不会与系统的其余部分保持永久连接。它按需连接到所需的部分 - 类似于拨打电话 - 所有电话都有连接,但任何时候只有少数连接。

cpu通过运行指令 - 软件程序来工作。有指令代码指示cpu拨打系统的某些部分。每个部分都有一个数字,并且cpu有一个拨打号码的指令。一旦cpu拨打该号码,它就会向该部分发送一条消息 - 消息就是数据 - 从一位到任意大小的块。然后,该位置的硬件对编码的消息起作用。

在这样做时,cpu可以使用相同的机制控制任何硬件。每个设备唯一变化的是cpu必须拨打的号码以及cpu发送给设备的数据 - cpu正在运行的软件中的详细信息。

因此,要关闭机器,cpu会拨打电源管理设备的号码,然后发送指令以进入适当的电源状态。硬件响应,PSU停止向主板发送主电源。

当你写软件时,你不必自己知道所有这些细节。它们通常被预先打包为随时可用的代码,因此您的软件只需说“关闭”,并执行现成的代码(通常在BIOS中)以执行关闭,如上所述。

答案 5 :(得分:1)

PC程序和外面的现实世界之间有几个接口。

有些连接到CPU。这些示例是端口和硬件中断(IRQ)。这些允许基于硬件触发器(离散线从低到高)发送少量数据(通过主机程序请求)和调用功能(中断处理程序)。

用于传输大量绕过CPU的数据的接口更快。这称为DMA(直接内存访问)。它们用于将数据传输到磁盘,网络,显示适配器等。

对于端口IO(操作码IN和OUT),软件是发起者。对于IRQ,硬件首先会说出触发软件响应。

只允许设备驱动程序执行所有这些操作。如果您尝试从应用程序执行此操作,操作系统将立即粉碎它。应用程序通过设备驱动程序提供的API连接到这个世界。许多API都是标准化的,因此您可以替换实际设备而无需进行不同的交互(在您的示例中为打印机,磁盘,键盘,鼠标,CRROM,ATX电源开关)。

答案 6 :(得分:1)

让我们比较物理和软件解决方案。

按下按钮时,实际上是向电源设备发送5伏信号。这5伏电源实际上从未关闭(即使您认为计算机已关闭)。当你按下按钮打开电脑时,你需要这5伏电压 - 此时另外5伏电压被送到电源装置,告诉它重新开启。

因此实际上,您的物理按键被转换为电子信号,以便电源做一些事情。

当你用这些术语来思考时,你会突然意识到计算机不需要将其电子信号转换成物理按钮来关闭电源 - 这是他们为了人类而增加的东西(即,你以为有一个微小的马达推动了一个秘密的内部“关闭”按钮 - 它不存在。)

所以软件需要做的就是指示一个电子信号,触发电源进入5伏待机模式。

答案 7 :(得分:1)

自2011年以来,当我选择成为一名软件工程师时,我遇到了同样的问题困扰着我。 随着生活的发展和愿望的实现,我开始研究不同的计算机技术和领域,并开始回答自己的问题。

首先,我将软件定义为针对硬件的一组自动化指令。在这种情况下,指令意味着只有两种状态GoOn / GoOff或1/0或High / Low或True / False或Charge / NoCharge或PowerUp / PowerDown。

任何现代计算机的工作都可以说是硬件的指令链反应。

为什么和如何?在下面解释,

想象一下,您握住连接到灯泡上的两根电线,并将它们连接到电池+ ve和-ve。你知道现在会发生什么。 Tantadaan !,光亮了。

在这里, 硬件:电线,灯泡和支架。 软件/说明/操作:将这两条线都连接到电池上。 充电:电池电量。 结果:灯发光。

以类似的方式,当您第一次打开计算机时,您可以通过按下按钮或打开电源开关来触发第一条指令/操作(GoOn)。

现在,正如我所说的,指令(您的软件/文本代码转换为1/0指令)驱动着硬件中的连锁反应,导致您的计算机按照指令(Drivers / OS / Software)中的定义运行。

如果您想进一步了解,请留下评论。

答案 8 :(得分:0)

实际上,您的纯文本代码不会直接关闭计算机。它调用底层操作系统的过程。操作系统依次调用主板上的ACPI / APM。这将使计算机关闭。

小1和0如何与硬件电路交互是一个非常复杂的主题,你至少可以阅读一本关于完全理解它的书......

答案 9 :(得分:0)

如果您正在寻找一般设备如何执行其操作,则该设备附带存储在控制板的ROM / CHIP中的固件。控制板用于通过电子信号控制设备。

在固件之上,您将拥有驱动程序/服务提供商。应用程序将使用这些服务提供者/驱动程序来通信或指示设备执行某些操作。

Click here要了解更多关于固件如何 - 通信 - 电子设备 - 执行其操作的信息?

答案 10 :(得分:0)

我现在已经沉思了同样的问题,并且意识到实际上存在从软件(幻想)世界到硬件(真实)世界的联系。

想想一些像电路和开关一样简单的东西,然后想一些像加法器或ALU那样更抽象的东西。随着时间的推移,抽象建立在自身上并在下一个rom中变得复杂。然后是微代码,Opcodes,机器语言,然后最终组装和C.之后出现了BIOS,操作系统,驱动程序和GUI,并且看到了你心爱的“关机”按钮。

答案 11 :(得分:0)

简单:我们编写的代码/软件是由实际CPU上的0(OFF)和1(ON)表示的电信号。从这一点来看电流和电机。

答案 12 :(得分:0)

一个重要的重要功能是放大,计算机中使用的电信号很小,并且总是在时钟触发下流动,并且在逻辑门的引导和放大下,可以在某些时候发送给物理设备。连接到计算机的设备,它们可以触发实际的体育锻炼。 晶体管是用于实现逻辑门和信号放大的巧妙组件。它们位于软硬件界面的中心。

逻辑门(低级电路)和CPU(逻辑门的更高抽象度)是您问题的关键答案。它们基本上是软件和硬件之间的桥梁。

这是我的超级简化解释。 CPU具有时钟周期,通常由诸如石英晶体之类的自然振动元素触发。在每个周期中,它从内存(软件端)获取一条指令,其ALU(算术逻辑单元)运行一些电路并基于软件指令运行,并输出一些可能会写回到另一个内存位置的数据。

现在在硬件方面,每个硬件上都有固件,固件是一堆逻辑指令,通常通过纯电路(逻辑门,同样)进行布线,根据输入,它可以输出电气的特定组合可以被放大的信号,并用于触发实际的物理事件,例如弹出磁盘,打开灯等

答案 13 :(得分:0)

“纯文本的代码如何让计算机做它应该做的事?”

假设我使用任何语言(如 C++ 或 Java)在文本编辑器中编写代码。 这段代码被提供给编译器,然后编译器将其转换为汇编代码。
然后,它被转换为二进制代码,即; 0 和 1 代表数字电压,然后将这些电压输入硬件中的晶体管。