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


77

我的问题是:

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

要明确我的观点:

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


5
奇怪的是,示例中的物理硬件接口和球相互作用都是基于电磁力的。
帕维尔·拉兹维洛夫斯基

1
正如帕维尔(Pavel)所言,请考虑所有物质主要是空白空间!
艾伦(Alan)2010年

不要相信他们-全部都是基于烟雾。
2013年

3
我已经遍历了所有答案,但没有一个就足够了。例如,操作系统如何精确地产生5伏电荷?这就是问题所在。我想我们都知道这是1s和0s以及电路和电。
frostymarvelous

1
这是一个非常有趣的问题,即使向下滚动所有答案,我仍然找不到满意的答案。大多数答案都集中在计算机的工作方式上,但问题是物理世界中没有的简单代码(例如MOV AX,0x01)实际上是如何物理接触CPU的,因此ti可以将一些信号(电子)发送到内存以更改内存特定地址的状态。基本上的问题是:非物理世界代码如何接触物理世界电子?
阿列克谢

Answers:


51

尽管答案相当复杂,并且需要了解电气系统和电路(KVL,KCL),二进制数和布尔逻辑的基础知识,但我们可以从较高的角度描述该过程:代码(用纯文本词表示)已编译,组装并最终转换成零和一的组合,分别代表低电压和高电压。

在材料和电路上施加电压时,这些电压会改变其物理性质,例如关闭为灯泡提供电流的电路(导致其点亮)或向直流电机提供电流的电路,这可能会打开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)组成,则计算机由许多专用固件组成。对于使用该硬件完成的任何有用操作,都需要另一层抽象,例如以通用方式处理键盘,或者允许鼠标,触摸板和轨迹球在不同的交互作用下都表现相同。这是操作系统的用武之地。OS提供了一个API,用于管理相关设备组,并为硬件供应商提供了挂钩,以提供OS命令与微控制器可以理解的命令之间的转换。在Windows环境中,这是一个driver.

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

将所有内容与shutdown命令放在一起:命令解释器使用OS级API来管理系统电源。该API会向操作系统的其余部分发送通知,以处理诸如优雅地刷新内存缓冲区,保存应用程序状态,终止通信通道以及关闭各种硬件系统(或更可能进入低功耗模式)的操作。它还使用电源驱动器(ACPI?)与计算机的电源管理子系统连接。指示该子系统关闭,这继而向计算机的电源发送信号以断开电路,不再为大多数组件供电。


13

如果您认为软件与硬件相比是另一种生物,那么没有任何解释会让您满意。将软件视为一系列电荷。您编写的所有代码都将作为电荷序列存储在RAM或磁盘上。因此,您不是在编写文本,而是在编写电荷序列。您的视频卡正在用英语在监视器上绘制内容,以帮助您了解所输入的内容。在某种程度上,也许确实是,您在计算机上所做的一切都是物理的。


6

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


5

好吧,关机实际上不是物理上的,直到物理上拔下电源,计算机中的所有电路才完全断开。

该软件使用BIOS中的APM(高级电源管理)接口来控制计算机中的电源电路。

关闭计算机后,仍可以在不物理拉动开关的情况下将其打开,例如通过计算机中网卡的LAN唤醒信号。


1
权力问题只是一个例子。我认为OP希望知道如何使用诸如“文本”之类的抽象内容来控制诸如电源之类的物理内容或弹出CD托盘……
艾伦(Alan)2010年

2
是的,那正是我想要知道的。艾伦提到了什么
AbyJames

3

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

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

这样,CPU可以使用相同的机制控制任何硬件。每个设备唯一改变的是cpu必须拨打的号码和cpu发送到设备的数据-详细信息将存储在cpu运行的软件中。

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

在编写软件时,您不必自己了解所有这些详细信息。它们通常被预先打包为可使用的代码,因此您的软件只需要说“ shutdown”(关闭),并且为此执行了现成的代码(通常在BIOS中)以执行关闭,如上所述。


1

PC程序与外界之间存在多个接口。

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

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

对于端口IO(操作码IN和OUT),该软件是启动器。对于IRQ,硬件首先发出声音以触发软件响应。

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


1

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

当您按下按钮时,实际上是在向电源设备发送5伏信号。实际上,这5伏电源永远不会关闭(即使您认为计算机已关闭)。按下按钮打开计算机时,您需要5伏的电压-此时又有5伏的电压发送到电源设备,以告诉它重新打开。

因此,实际上,您的物理按钮按下会转换为电子信号,以使电源执行某些操作。

当您想到这些术语时,您突然意识到计算机不需要将其电子信号转换为物理按钮即可关闭电源-这是他们为使人类受益而添加的(例如,如果您认为是一个微型电机,它按下了一个秘密的内部“关闭”按钮-不存在)。

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


1

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

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

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

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

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

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

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

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

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


1

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

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

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

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


0

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

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


0

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

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

单击此处了解有关固件如何与电子设备通信以执行其操作的更多信息?


0

我现在已经思考过一个安静的问题,并且意识到实际上从软件(幻想)世界到硬件(现实)世界之间存在联系。

想一想像电路和开关这样简单的东西,然后想一想更抽象的东西,例如加法器或ALU。随着时间的流逝,抽象将建立在自身之上,并在下一个rom中变得复杂。然后是微码,操作码,机器语言,最后是汇编语言和C语言。之后是BIOS,OS,驱动程序和GUI,按住即可看到您心爱的“关闭”按钮。


0

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


0

“纯文本代码如何使计算机执行其工作?”

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.