代码是如何控制硬件的?

标签: 代码 控制 硬件 | 发表时间:2014-07-15 00:00 | 作者:知乎用户(登录查看详情)
出处:http://www.zhihu.com
既然楼主提到“低电平”,看来对数字电路是有一点了解的。

那么,翻开数字电路相关教材,最前面几页。

一般它都会告诉你,三极管/场效应管类似继电器(一种通过线圈产生磁场、然后用磁场控制物理开关的通断与否的设备);在它一个管脚上输入/切断电压信号,另一个管脚就会出现高/低电平。


这东西,就是数字电路的基础。


你敲入的任何东西,最终就是通过类似的东西/机制储存的;所谓“指令”,其实就是“某个命令码“(一般叫机器码),这个”命令码”会改变CPU内部一堆“开关”的状态,以激活不同的电路;然后数据(前面提到过,它也是用三极管/场效应管的导通与否“记忆”的)利用类似的机制,被送入这个被“指令”激活的电路——这些电路是工程师们利用最最基础的三极管控制原理,用一大堆三极管组合出来的:当数据(某种高低电平的组合)经过这些电路后,就会变成另外一组高低电平的组合:这个组合刚好和“指令”代表的功能所应该给出的结果一致。

这段话可能有点难以理解。那么,看下最简单的与门吧:数据有两个,分别通过两条不同的线路进入与门;输出只有一个,必须给它输入两个高电平,它才会输出高电平;否则就输出低电平(这一般简化表述为:只有输入两个1,它才输出1,否则输出0)。

——这就是所谓的“与”逻辑;一组这样的“与”逻辑就与计算机指令/高级语言里的“按位与”直接对应。
——而按位与这个指令,意思就是选择一组线路,把数据导通到这组“与”逻辑电路之上;然后这组与逻辑电路就会输出两组数据的按位与的结果。



——类似的,二进制加法,1+1=0(同时进位);1+0=1;0+1=1;0+0=0:这可以用一个异或电路来模拟(因为异或电路的规则就是1+1=0、1+0=1、0+1=1、0+0=0);但这样(同时进位)这个说明就会丢失了,所以需要同时用一个与门模拟高位进位(前面说过,与门就是只有两个1才会输出1,其它输出0;综合异或的说明:这是不是就和二进制加法的规则刚好一致了呢?)

然后更高一位就成了两根输入线上的数据相加、再加上进位数据……依此类推:这就是用开关做加法的思路。而这样堆起来的一组开关,就叫加法器。

——add指令呢,就是选中上面做的那一堆用来做加法的开关们;然后给它们输入数据(不要忘了,两组高低电平而已),这些数据就驱动着构成加法器的那些开关们,噼里啪啦一阵乱响之后(嗯,如果是老掉牙的继电器计算机的话:还记得BUG的故事吗?),电路就稳定在某个状态了:此时,加法器的输出,恰恰就是输入数据的和(当然是这样了。前面讲过,我们是刻意用异或门和与门精心组合,让它们刚好和加法的效果一致)。



——其它种种指令,莫不大同小异(更复杂/高级的时钟、流水线啥的……暂时就无视吧)


你可以翻翻课本。上面讲过加法器的实现。

而加法器和另外一些逻辑电路加起来,就是所谓的ALU(算术逻辑单元,一下子就高大上了有木有)。


简而言之,代码在计算机内部,本身就是一组特定的高低电平组合;而计算机是精心设计的、海量的、用高低电平控制通断的开关组;当给这个开关组输入不同的电平组合时,就会导致它内部出现复杂的开关动作,最终产生另外一组高低电平的组合作为输出;这些开关动作经过精心设计,使得它的行为是可解释、可预测的——解释/预测的规则,就是CPU的指令集。

——换言之,在机器内部,一切本来就是高低电平,不存在转换问题。
——反而是键盘/鼠标/mic的输入要经过模数转换;而视频、音频之类的输出,要经过数模转换




————————————————————————————————
我知道,很多人困惑的,可能并不是开关的原理;而是:如果CPU不过是一堆开关的话,它为什么能“听懂”类似“加法”“do...while”这类高大上的复杂指令、甚至做出office、photoshop甚至人工智能这样神奇的东西呢?这些高大上的语义,是怎么被电路所理解的呢?



加法之类简单指令,前面已经介绍过了;而提到更复杂的东西……这就不得不说说图灵的贡献了。


还是从最小儿科的题目开始。假设你从来没听说过乘法表;那么,你怎么算8×9呢?

我们知道,A x B就是B个A相加或A个B相加的意思。那么,要算8×9,我们只要把8个9加起来就够了:8次加法而已。


换句话说,这里有个很好的思想,即: 很多“高级”数学计算(如乘法),其实用“低级”方法(如加法)一样是可以算的。


图灵的贡献就是,他证明了,如果一台机器,可以接受一系列的输入、并按输入指示完成运算;那么,当这台机器可支持的操作满足“图灵完备”的要求时,它就可以模拟任何其它数学/逻辑运算!

——比如说,一台只会做加法的机器,只要能想办法它实现“连续做指定次数加法”,那它就可以模拟一台乘法机。而能够模拟任何数学/逻辑运算的机器,并不比加法机复杂太多。

换句话说,要搞出一台“无所不能”的计算机器,并不需要穷尽一切可能,而是只要支持少的令人发指的几条指令,就可以办到了。



比如说,CPU,它根本上其实只会三招:与、或、非。

与就是全为真,则输出真;或是只要一个为真,则输出真;非则是输入真它就输出假、输入假就输出真——所谓的真假,一般写作1、0,在计算机内部就是高低电平。


别看CPU只会这三板斧;可当它们巧妙的组合起来后(构造成计数器、指令寄存器等等等等再组合成CPU),就达到了图灵完备的要求,产生了质变。



具体是怎么做的,这就不是三言两语能说清楚的了。还是仔细看看自己的数字电路这本书吧。

——数字电路研究的,就是如何用与或非这三板斧,来实现各种高级运算甚至CPU指令集这么复杂的事物
——而CPU指令集呢,则形成了另外一个强大得多的图灵机,这就是机器码(和汇编指令几乎一一对应);然后呢,诸如c/c++、java等高级语言,就是利用CPU指令集形成的、另一个更加强大的图灵机(编译器/解释器负责两种图灵机之间的翻译工作)。
——而程序员们研究的,就是如何用编程语言这样一个强大的图灵机,去实现office、photoshop、wow甚至人工智能这样复杂的事物。
——这也是一个层层模拟的过程。




————————————————————————————
总之,开关的通断是基础;而各种神奇的功能是如何用这么简单的东西组合出来的呢,那就必须理解“程序”原理(也就是图灵机原理)了。

如果说,计算机是一个人,那么,软件就是他掌握的知识。这个知识使得他不仅能掰这手指头数数,甚至还可以去洞悉宇宙的奥秘。


————————————————————————————————
具体一些,人是怎样开车的呢?

首先,他要知道车的控制原理(知识/软件);然后,基于这些知识,大脑向他的四肢肌肉发出神经冲动,驱使他完成转方向盘、挂挡、踩离合器/油门等种种动作,最终达到开车这个目的。


软件控制硬件,也是类似的原理。

前面说过,程序本身就是高低电平的组合;它通过在CPU上执行来模拟各种决策过程;同时,计算机就是一堆开关;那么,通过指令向某些地址写出数据(访问特定地址是通过各种寻址机制/指令完成的,归根结底也可以说是通过开关切换,改变了电路拓扑),就等于开启/关闭了对应地址上的某个开关;这个开关可以是类似CPU内部那样的一组三极管,也可以是通向另外一个继电器的信号线——这个信号就促使继电器闭合,于是电机导通……

就好象人开汽车一样,神经发出的微不足道的电脉冲经过肌肉放大,影响了发动机/变速箱的运转,然后汽车就开走了。
计算机也一样:它通过向控制特定地址上的开关输出0/1(高低电平),就可以通过事先准备的物理设施驱动诸如航模电机、舵机等等机构,这就完成了航模控制。


完整的控制回路甚至可以是:
航模上的传感器采集飞行姿态、地形、位置等等数据(最终转换成高低电平构成的信号)----信号通过某些端口送到CPU-----CPU执行程序,程序读取传感器发来的信号,决定下一步的行动-----经过智能判断后,通过控制特定地址上的开关(前面提过,向这个地址发一组高低电平构成的数据就行了),驱动诸如航模电机、舵机等等机构,完成航模控制。

这,就是所谓的“机器人”(当然,只是最简化的机器人原理而已)。

— 完 —
本文作者: 知乎用户(登录查看详情)

【知乎日报】 你都看到这啦,快来点我嘛 Σ(▼□▼メ)

此问题还有 19 个回答,查看全部。
延伸阅读:
小米 2 代的硬件配置真的有 1.5GHZ,四核 CPU 吗?
小米手机二代与一代最大的区别会是硬件方面吗?

相关 [代码 控制 硬件] 推荐:

代码是如何控制硬件的?

- - 知乎每日精选
既然楼主提到“低电平”,看来对数字电路是有一点了解的. 那么,翻开数字电路相关教材,最前面几页. 一般它都会告诉你,三极管/场效应管类似继电器(一种通过线圈产生磁场、然后用磁场控制物理开关的通断与否的设备);在它一个管脚上输入/切断电压信号,另一个管脚就会出现高/低电平. 那么,看下最简单的与门吧:数据有两个,分别通过两条不同的线路进入与门;输出只有一个,必须给它输入两个高电平,它才会输出高电平;否则就输出低电平(这一般简化表述为:只有输入两个1,它才输出1,否则输出0).

事务控制代码示例

- - ITeye博客
如果不了解事务的概念的话,可参见笔者的另一篇文章"事务和MVCC" http://frank1234.iteye.com/blog/2164232. 这个没啥好说的,直接上代码.             //开始事务.             //事务提交.             //注意有异常必须得回滚,否则执行成功的sql会持久化到数据库中.

从教女友写代码中学到的,教人写代码在一定程度上是硬件问题

- - 博客园_新闻
英文原文: Teaching Someone To Code Is Partly A Hardware Problem. 从今年四月一直到七月,我在教我女友写代码. 我最大的收获是认识到了教人写代码在一定程度上是个硬件问题. 虽然 codecademy、可汗学院、Scratch 和其他机构为了教学优化了代码编辑器,但代码编辑器总是卡在它们的软件外壳上.

开放的另一面:从法庭材料解读 Google 如何控制硬件商

- Public - 爱范儿 · Beats of Bits
关于 Skyhook 状告 Google 一事,我们曾在《最近让 Google 烦心的二三事——用户隐私,人才流失和专利官司》简单提及:. 和 Google 同为地理位置服务商之一的 Skyhook Wirless 因 Google 侵犯专利和反竞争行为将其一纸告上法庭. Skyhook 声称 Google 凭借自身和手机厂商之间的关系优势,“强制厂商在 Android 设备上运行 Google 的地理位置程序”,甚至还干涉 Skyhook 和摩托罗拉之间的合约,这给他们造成数百万美元的损失.

开放硬件1.0

- 拉登 - Solidot
Shawn the R0ck 写道 "开放源代码硬件的原则和定义已经有了1.0的版本. 开放硬件是指一种可见的人工产物---比如机器,电子设备或者其他的物理东东,总之,设计者开发了所有的设计图纸让所有人都可以修改,重新发布和使用,这种开放和自由的哲学直接受自由软件的影响. 这份定义有意帮助开放硬件的相关许可证的提出和修订.

Nginx带宽控制

- - 火丁笔记
有个老项目,通过 Squid 提供文件下载功能,利用  delay_parameters 实现带宽控制,问题是我玩不转 Squid,于是盘算着是不是能在 Nginx 里找到类似的功能. 好消息是 Nginx 提供了  limit_rate 和  limit_rate_after,举个例子来说明一下:.

代码重构

- - ITeye博客
随着程序的演化,我们有必要重新思考早先的决策,并重写部分代码. 代码需要演化;它不是静态的事物. 重写、重做和重新架构代码合起来,称为重构.    当你遇到绊脚石  ---  代码不在合适,你注意到有两样东西其实应该合并或是其他任何对你来说是"错误"的东西  -------- . 如果代码具备以下特征,你都应该考虑重构代码:.

Spark的硬件配置

- - 简单文本
从MapReduce的兴起,就带来一种思路,就是希望通过大量廉价的机器来处理以前需要耗费昂贵资源的海量数据. 这种方式事实上是一种架构的水平伸缩模式——真正的以量取胜. 毕竟,以现在的硬件发展来看,CPU的核数、内存的容量以及海量存储硬盘,都慢慢变得低廉而高效. 然而,对于商业应用的海量数据挖掘或分析来看,硬件成本依旧是开发商非常关注的.

Firebug控制台详解

- boho - 阮一峰的网络日志
Firebug是网页开发的利器,能够极大地提升工作效率. 我曾经翻译过一篇《Firebug入门指南》,介绍了一些基本用法. 控制台(Console)是Firebug的第一个面板,也是最重要的面板,主要作用是显示网页加载过程中产生各类信息. Firebug内置一个console对象,提供5种方法,用来显示信息.

HBase 之访问控制

- gengmao - Trend Micro CDC SPN Team
构建和运维HBase集群是一个非常有挑战性的工作. HBase凭借其在海量数据的良好的扩展性和高效的读写能力,受到越来越多公司的重视. 在公司里,HBase越来越受欢迎. 希望通过HBase读写数据的产品越来越多,在兴奋之余,头疼的问题也来了. 毕竟,作为线上的产品,我们不希望过多人随意的访问,会照成很多潜在的风险,比如误删,误操作.