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

Posted

技术标签:

【中文标题】软件/代码如何与硬件实际通信?【英文标题】:How does Software/Code actually communicate with Hardware? 【发布时间】:2011-03-03 20:25:53 【问题描述】:

我的问题是:

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

为了说明我的观点:

当我们踢球的时候,球和我们的腿有物理接触,让球运动起来。那么软件和硬件之间的物理连接是如何实现的呢? 纯文本代码如何让计算机完成它的工作?

【问题讨论】:

奇怪的是,您的示例中的物理硬件接口和球交互都是基于电磁力的。 正如 Pavel 提到的,考虑到所有的物质大部分都是由空白空间组成的! 不要相信他们——这一切都是基于烟雾。 我已经阅读了所有答案,但没有一个足够好。例如,操作系统究竟是如何产生 5 伏电荷的?这就是问题所在。我想我们都知道它是 1 和 0 以及电路和电力。 这是一个很有趣的问题,即使向下滚动所有答案我仍然找不到满意的答案。大多数答案都集中在计算机的工作原理上,但问题是不在物理世界中的简单代码(例如 MOV AX,0x01)实际上是如何物理接触 CPU 的,因此可以将一些信号(电子)发送到内存以更改内存特定地址的状态。基本上问题是:非物理世界代码如何接触物理世界电子? 【参考方案1】:

“纯文本代码如何让计算机完成它的工作?”

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

【讨论】:

【参考方案2】:

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

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

现在想象一个假设的 1 位 CPU,它能够闭合电路并将电流传送到蜂鸣器并发出声音。这个 1 位 CPU 有一个 Input,它可以有两个值:0 和 1。

这个简单的 CPU 有一个非常简单的汇编语言:ONOFF,我们还有一种提供更好抽象的精美编程语言:cpu.turnOn,cpu.turnOff

我编写了我的程序cpu.turnOn; 编译它,组装它,然后它就可以运行了。当我在 CPU 上运行程序时,蜂鸣器会亮起。

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

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

最低层是电压、电路和硅,或者您可能认为的实际“物理硬件”。除了硬件之外,通常还有一个“微控制器”或专门设计用于与硬件细节交互的专用处理单元。想象一个光盘驱动器,它的微控制器能够弹出驱动器托架、启动电机、校准激光以及从光盘流式传输数据。

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

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

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

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

【讨论】:

这一定是我读过的关于 SO 的最佳答案。感谢您抽出宝贵时间【参考方案3】:

这里的一个关键重要特征是放大,计算机中使用的电信号很小,并且总是在时钟触发时流动,并且在逻辑门的引导和放大下,它们可以在某个时刻发送到物理连接到计算机的设备,它们可以触发实际的身体活动。 晶体管是用于实现逻辑门和信号放大的巧妙组件。它们位于软件-硬件接口的中心。

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

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

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

【讨论】:

【参考方案4】:

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

首先,我将软件定义为硬件的自动指令集。在此上下文中的指令仅表示两种状态 GoOn/GoOff 或 1/0 或 High/Low 或 True/False 或 Charge/NoCharge 或 PowerUp/PowerDown。

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

为什么以及如何?解释如下,

想象一下!你拿着两根电线连接到灯泡上,然后将它们连接到电池 +ve 和 -ve。你知道现在会发生什么。 Tantadaan!,光亮起来。

这里, 硬件:电线、灯泡和支架。 软件/说明/操作:您将这两根电线都连接到电池上。 充电:电池电量。 结果:灯亮了。

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

现在,正如我所说,指令(您的软件/文本代码转换为 1/0 指令)驱动硬件中的连锁反应,从而导致您的计算机按照指令(驱动程序/操作系统/软件)中定义的方式运行。

如果您想进一步深入了解,请在下方留言。

【讨论】:

【参考方案5】:

如果您认为软件与硬件相比是不同的生物,那么没有任何解释会让您满意。将软件想象成一系列电荷。您编写的所有代码都将作为电荷序列存储在 RAM 或磁盘上。所以你写的不是文字,而是电荷序列。您的视频卡正在用英语在显示器上绘制内容,以帮助您了解您正在输入的内容。从某种意义上说,也许真的,你在电脑上做的任何事情都是物理的。

【讨论】:

【参考方案6】:

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

【讨论】:

【参考方案7】:

软件以硬盘驱动器或软盘上的磁域形式存储在硬件中,或者以计算机芯片中的低电压和高电压形式存储在硬件中。当你在键盘上打字时,每个字符都会被转换成一系列的 0 和 1,然后将它们作为低压和高压存储在称为 RAM 的计算机芯片中。 RAM 中的低电压和高电压随后被转换为硬盘驱动器或软盘上的磁畴,供磁盘磁头稍后读回为电压,或作为低电压和高电压存储在非易失性计算机芯片中,供以后读回.低电压和高电压代表键盘字符产生的电气 0 和 1。

【讨论】:

【参考方案8】:

我现在某个时候思考过同样的问题,并开始意识到实际上存在从软件(幻想)世界到硬件(真实)世界的联系。

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

【讨论】:

【参考方案9】:

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

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

Click here 了解更多关于固件如何与电子设备通信的信息?

【讨论】:

【参考方案10】:

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

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

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

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

当您编写软件时,您不必自己了解所有这些细节。它们通常被预先打包为可以使用的代码,因此您的软件只需说出“关机”,然后执行为此准备的代码(通常在 BIOS 中)即可执行关机,如上所述。

【讨论】:

【参考方案11】:

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

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

【讨论】:

【参考方案12】:

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

按下按钮时,实际上是在向电源单元发送 5 伏信号。这 5 伏的电源实际上永远不会关闭(即使您认为您的计算机已关闭)。当您按下按钮打开计算机时,您需要这 5 伏电压 - 此时会向电源单元发送另外 5 伏电压以告知其重新打开。

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

当您从这些术语中思考问题时,您会突然意识到计算机不需要将其电子信号转换为物理按钮按下即可关闭电源 - 这是他们为造福人类而添加的东西(即,如果你以为有一个微型马达可以推动一个秘密的内部“关闭”按钮——它不存在)。

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

【讨论】:

【参考方案13】:

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

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

当计算机关闭时,它仍然可以在不实际拉动开关的情况下打开,例如通过来自计算机网卡的Wake on LAN 信号。

【讨论】:

电源问题只是一个例子。我认为 OP 想知道如何使用像“文本”这样抽象的东西来控制像电源这样的物理东西,或者弹出 CD 托盘...... 是的,这正是我想知道的。艾伦提到了什么【参考方案14】:

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

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

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

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

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

【讨论】:

以上是关于软件/代码如何与硬件实际通信?的主要内容,如果未能解决你的问题,请参考以下文章

干货 | 如何快速理解通信的硬件层协议与软件层协议?

使用硬件通信进行高级编程

51学习笔记之以硬件spi与max6675通信实现K型热电偶测温

如何使用硬件进行 TDD

水声通信软件无线电OMAP平台的硬件设计与实现

delphi与java 怎样通信