软件/代码如何实际与硬件通信?
我的问题是:
当我在Windows / Linux中按下“关机”button时,计算机closures 。 “关机”命令是如何使电脑物理关机的?
为了明确我的观点:
当我们踢球的时候,球和我们的腿之间有物理接触,球就会移动。那么软件和硬件之间的物理连接是如何实现的呢? 纯文本的代码如何使计算机做它做的事情?
在最基本的层面上,纯文本代码最终转换为0和1。 这些0和1代表低电平和高电平。 此时,电压电平控制各种电路。
想想一个电池供电的风扇。 电池提供的电stream为电动机提供动力,电动机内部通过电力产生一个使轴旋转的电磁场,驱动风扇叶片旋转。 这是电压如何变成物理的例子。
你可以build立一个“开关”,给定适当的电压,最终将获得电源停止从墙上拉电stream。
显然它比这更复杂,但这是它的要点。
为了方便起见,计算机由抽象层组成。
最底层是电压,电路,晶体pipe和硅片。 硬件上的下一层是操作系统。 操作系统pipe理硬件,并提供“挂钩”来使用它,而不是一次又一次地重写所有types的硬件访问代码。 这些钩子或“接口”允许你的代码有一个通用的方法来访问不同的硬件。 所以使用OS提供的接口,你可以编写你的应用程序。
在每个层中都有子层,例如硬件可能有固件 – 一种低级指令集,指示硬件应该如何运行,存储在EEPROM中,当驱动器加电时加载。 另一个子层是像python这样的高级语言如何提供一个库来编写networking软件,而不必直接编程到OS提供的原始套接字API。
操作系统处理大多数硬件/软件交互。 硬件供应商编写“插件/模块/驱动程序”,允许操作系统控制其特定的硬件。
所以你会写一个软件应用程序,利用这些操作系统提供的接口到硬件。 例如,如果你想closures电脑,Windows提供了一个closures电脑的界面。 你的软件会调用这个接口,在编译/解释的时候,变成代码,调用OS的接口。 这个接口反过来会执行一组众所周知的指令来指示计算机closures。 这些指令是0和1,低电压和高电压,访问计算机的特定部分,用于处理上电/关机/待机,并给出正确的信号,就可以做到这一点。
那么,关机实际上并不是物理上的,电脑中的所有电路都不能完全closures,除非你断开电源。
该软件使用BIOS中的APM(高级电源pipe理)接口来控制计算机中的电源电路。
当电脑closures时,它仍然可以打开而不需要物理拉动开关,例如通过计算机网卡上的Wake on LAN信号。
如果你认为软件与硬件相比是不同的生物,那么没有任何解释能让你满意。 认为像一系列电费的软件。 你所写的所有代码都可以作为电荷序列存储在RAM或磁盘上。 所以你不是写文本,而是电费的顺序。 您的video卡是用英语在显示器上绘制的,帮助您了解您所input的内容。 在某种程度上,也许是真的,无论你在计算机上做什么,都是物理的。
踢腿的腿就是一个很好的例子。 这在机器上非常相似。 CPU连接到系统的所有其他部分,但不同于神经系统是物理布线,所有的神经立即连接,CPU不保持永久连接到系统的其他部分。 它连接到需要的部分 – 类似于拨打电话 – 所有的电话都有连接,但是只有less数连接在任何时间。
CPU通过运行指令 – 软件程序工作。 有指令代码指示cpu拨打系统的一部分。 每个部分都有一个数字,并且CPU有拨号的指令。 一旦CPU拨打了这个号码,它就会向该部分发送一条消息 – 消息就是数据 – 从一位到任意大小的数据块。 那个位置的硬件就会对编码的信息起作用。
像这样做,CPU可以使用相同的机制来控制任何硬件。 每个设备唯一改变的就是cpu必须拨号的数字以及cpu发送给设备的数据 – 放入cpu运行的软件的细节。
因此,要closures机器,CPU会为电源pipe理设备拨号,并发送指令进入适当的电源状态。 硬件响应,PSU停止向主板发送主电源。
当你写软件时,你不必自己知道所有这些细节。 它们通常是预先打包好的,可以随时使用代码,所以你的软件只需要说“closures”就可以了,而且现成的代码(通常在BIOS中)被执行来执行closures,如上所述。
软件作为硬盘或软盘上的磁区存储在硬件中,或作为计算机芯片中的低电压和高电压存储在硬件中。 当你在键盘上input时,每个字符都被转换成0和1的电子序列,然后在被称为RAM的计算机芯片中存储为低电压和高电压。 RAM中的低电压和高电压然后被转换成硬盘驱动器或软盘上的磁畴,以便随后由光盘头读回到电压中,或者作为低电压和高电压存储在非易失性计算机芯片中用于以后读回。 低电压和高电压表示由键盘字符生成的电子0和1。
PC程序和外面的现实世界有几个接口。
一些连接到CPU。 这些例子是端口和硬件中断(IRQ)。 这些允许基于硬件触发(离散行从低到高)发送less量数据(通过主机程序请求)和调用函数(中断处理程序)。
有更快的接口传输大量的数据绕过CPU。 这被称为DMA(直接存储器访问)。 这些是用来传输数据到磁盘,networking,显示适配器等
对于端口IO(操作码IN和OUT),软件是启动器。 对于IRQ,硬件首先会触发软件响应。
只有设备驱动程序被允许执行所有这些。 如果您尝试从应用程序中执行操作,操作系统将立即粉碎它。 应用程序通过设备驱动程序提供的API连接到这个世界。 许多API是标准化的,所以你可以在不需要以不同方式进行交互的情况下replace实际的设备(例如打印机,磁盘,键盘,鼠标,CRROM,ATX电源开关)。
我们来比较物理和软件解决scheme。
当按下button时,实际上是向电源装置发送5伏信号。 这5伏的电源从来没有真正closures(即使你认为你的电脑closures)。 当你按下button打开电脑时,你需要5伏的电压 – 在这一点上,另外5伏电压被送到电源装置,告诉它重新开启。
所以实际上,你的物理button被转换成电子信号,以便电源做某些事情。
当你用这些术语来思考事物时,你突然意识到计算机不需要把它的电子信号变成一个物理的button来closures电源 – 这是他们增加了对人类有益的东西(例如,如果你认为是一个微小的电机,推动了一个秘密的内部“closures”button – 它不存在)。
所以所有软件需要做的是指示一个电子信号,它触发电源进入5伏待机模式。
实际上,你的纯文本代码不会使计算机直接closures。 它调用底层操作系统的一个过程。 操作系统依次调用主板上的ACPI / APM。 这将使计算机closures。
小1号和0号如何与你的硬件电路相互作用是一个相当复杂的课题,你至less可以读一本书来完全理解它。
如果一般情况下您正在寻找如何执行其操作的设备,则该设备附带有存储在控制板的ROM / CHIP中的固件。 控制板用于通过电信号控制设备。
在固件之上,你将有司机/服务提供者。 应用程序将使用这些服务提供商/驱动程序来沟通或指示设备执行某些操作。
点击此处了解更多关于如何固件 – 通信到电子设备执行其操作?
我现在已经沉思了同一个问题,并认识到实际上从软件(幻想)世界到硬件(真实)世界的连接。
想想像电路和开关那样简单的东西,然后想像一个更加抽象的东西,像加法器或ALU。 随着时间的推移,抽象build立在自身上,在下一个ROM中变得复杂。 然后来到微码,操作码,机器语言,然后最后汇编和C.之后来到BIOS,操作系统,驱动程序和graphics用户界面,并且看到传来你心爱的“关机”button。
它很简单:我们编写的代码/软件是在实际CPU上由0(OFF)和1(ON)表示的电信号。从这一点考虑电stream和电机。