计算机组成原理,你还真不需要理解cpu的每一个电路怎么运行,但当我懂得内存与外存的区别,以及缓冲区这些概念时,代码的书写思维和我入门时真的有很大不同。
老师建议拆电脑玩(拆坏了不负责噢~) 总的来说,就是加深对电脑的了解吧。
首先,我们可以把计算机分解成最原始的部件——晶体管。晶体管是一种半导体材料,其最重要的作用就是半导:可以通过电流的变化,实现电路的切换。比如计算机最基础的与或非运算,都可以通过晶体管组成的电子元件实现。而通过晶体管的电位差不同,就可以体现"二进制数据",即0和1。再加上电容和电阻,就能把这种二进制数据临时保存起来。
综合这些特性,大牛们发现把晶体管用作精密的数学计算,可以极大的提高运算的效率。比如我有2个电容,分别是充满电和没有电,对他们同时释放电信号,电容就会把其中的电子放出来,经过特定的逻辑电路,如与门,得到了0的结果。要计算1+1,实际上也是类似的原理。我先设计一个加法电路,把若干电容组合成的"数字"流过这个电路,把结果存入目标电容,就得到了结果。大规模的复杂运算以此类推。
最早期的计算机真的就是用许多结晶体管实现的复杂电路结构,通过控制输入电流得到希望的输出结果。后来人们发现,这种计算可以用某些形式抽象成多种指令,不用针对每次计算设计复杂的电路,只要调用指令就可以实现任何一种计算组合,于是诞生了cpu。只有cpu,每次都要自己配置输入信号,实在太痛苦,就做了纸带输入给计算机。后来又发现纸带还是很麻烦,于是发明了输入终端和对应的存储设备。后来又发现很多数据要临时保存起来,供连续计算使用,于是发明了内存。再后来pc的发展经历了无数次的变革,让计算机一步步到了今天的地步,也就是你现在看到的这样。
其中的历程非常曲折,也许有机构能够把他们全部组织成一本漫长的历史,但个人肯定是无能为力的。
综合这些特性,大牛们发现把晶体管用作精密的数学计算,可以极大的提高运算的效率。比如我有2个电容,分别是充满电和没有电,对他们同时释放电信号,电容就会把其中的电子放出来,经过特定的逻辑电路,如与门,得到了0的结果。要计算1+1,实际上也是类似的原理。我先设计一个加法电路,把若干电容组合成的"数字"流过这个电路,把结果存入目标电容,就得到了结果。大规模的复杂运算以此类推。
最早期的计算机真的就是用许多结晶体管实现的复杂电路结构,通过控制输入电流得到希望的输出结果。后来人们发现,这种计算可以用某些形式抽象成多种指令,不用针对每次计算设计复杂的电路,只要调用指令就可以实现任何一种计算组合,于是诞生了cpu。只有cpu,每次都要自己配置输入信号,实在太痛苦,就做了纸带输入给计算机。后来又发现纸带还是很麻烦,于是发明了输入终端和对应的存储设备。后来又发现很多数据要临时保存起来,供连续计算使用,于是发明了内存。再后来pc的发展经历了无数次的变革,让计算机一步步到了今天的地步,也就是你现在看到的这样。
其中的历程非常曲折,也许有机构能够把他们全部组织成一本漫长的历史,但个人肯定是无能为力的。
组成原理:是不是学过中断、8259A、保护模式寻址等等?体现在操作系统里,为了实现进程调度,你要用时钟中断,为了会用中断,你要写8259A的控制程序;为了实现实模式到保护模式的切换和保护模式编程,你必须理解处理器的段保护机制等
过去的厂商做计算机都是从硬件到软件一整套,你说的这些东西都会涉及到
现在这种软硬结合的工作大概做嵌入式的会比较多一些
不过造计算机门槛低了,有钱的话你也可以自己DIY
比如用FPGA,CPLD做CPU,自己画PCB,做板子,裁剪内核,烧ROM........
自己做板卡,或者自己造一个虚拟设备,写驱动程序
写虚拟机,cpu模拟器
现在这种软硬结合的工作大概做嵌入式的会比较多一些
不过造计算机门槛低了,有钱的话你也可以自己DIY
比如用FPGA,CPLD做CPU,自己画PCB,做板子,裁剪内核,烧ROM........
自己做板卡,或者自己造一个虚拟设备,写驱动程序
写虚拟机,cpu模拟器
学这门课程之前,要先忘掉这门课程名字中的“计算机”三个字。每节课,每个课程阶段都会介绍一种电路。从简单到复杂,从开关到ALU。每个阶段做出来的东西看起来都和“计算机”没什么关系,除了他们都能存储和运算。但是会很清楚的了解到每个阶段做出来的东西其实完全没有“存储”和“运算”功能。他们只不过是一种电路的状态,或者通过一个信号,控制另一部分电路的状态。由于很简单,很容易弄清楚这个东西是如何工作的。最后把所有东西拼成一块CPU的时候,就像你趴在地上拼拼图,拼完最后一块起身俯视的感觉。会了解到高低电平是如何通过各种门电路变成数据,变成屏幕上花花绿绿的程序的。这就是所谓的“原理”。
这门课完全可以用一个词来概括,就是“抽象”。在我看来这也是整个计算机设计中所蕴含的的灵魂。
其实一个门电路完全不知道自己在做什么,不过是按照电气特性把高电平变成低电平,低电平变成高电平。是人们把这些不同的状态抽象出0和1的概念,然后从中产生了“逻辑门”。并用此来表达逻辑运算,然后用这些逻辑运算去表示二进制的数值运算,再把这些运算组合起来,用一组开关来启动,就有了一条指令,最终把这些简单的电路变成了CPU。整个过程不过是一层一层的抽象。上层依赖于下层所提供的功能与意义,完成本身的功能同时又提供了更高层次的抽象。最后你从上挖到下,最底下的一层根本找不到什么0或1 。包括操作系统和各种协议,绝大部分计算机相关的东西都是这么一层层抽象出来的。这就是“计算机”“组成”的“原理”。
友情提示,理论课可以逃,但实验课绝对不能逃。不知道你们的实验课做的是什么,我们是用VHDL写程序,然后烧到一个FPGA试验台里面。由于我的理论课老师每次课程要花至少三分之二的时间给我们讲西游记的处世哲学,所以我基本没怎么上过。但实验课一次没逃过,就算因故缺勤也会自己找老师补上。我感觉算法也好,理论也好,玩具也好,如果自己不亲自拆一遍再装回去,就没办法深刻理解它们是怎么跑起来的。
其实一个门电路完全不知道自己在做什么,不过是按照电气特性把高电平变成低电平,低电平变成高电平。是人们把这些不同的状态抽象出0和1的概念,然后从中产生了“逻辑门”。并用此来表达逻辑运算,然后用这些逻辑运算去表示二进制的数值运算,再把这些运算组合起来,用一组开关来启动,就有了一条指令,最终把这些简单的电路变成了CPU。整个过程不过是一层一层的抽象。上层依赖于下层所提供的功能与意义,完成本身的功能同时又提供了更高层次的抽象。最后你从上挖到下,最底下的一层根本找不到什么0或1 。包括操作系统和各种协议,绝大部分计算机相关的东西都是这么一层层抽象出来的。这就是“计算机”“组成”的“原理”。
友情提示,理论课可以逃,但实验课绝对不能逃。不知道你们的实验课做的是什么,我们是用VHDL写程序,然后烧到一个FPGA试验台里面。由于我的理论课老师每次课程要花至少三分之二的时间给我们讲西游记的处世哲学,所以我基本没怎么上过。但实验课一次没逃过,就算因故缺勤也会自己找老师补上。我感觉算法也好,理论也好,玩具也好,如果自己不亲自拆一遍再装回去,就没办法深刻理解它们是怎么跑起来的。
确实是本了不起的神书,目前已经出了第六版了。大牛Andrew S. Tanenbaum使用语言、层次和虚拟机的概念,结构化的对计算机进行描述,使得计算机的功能层次能非常清晰地呈现。另,还记得差不多10年前初读此书,第一次震撼地读到“硬件和软件在逻辑上是等同的”,至今记忆犹新。
沿着Tanenbaum的分层式思想说,组成原理这一层在硬件层(或者说数字逻辑层)之上,向上则承接操作系统层。笼统讲,硬件层最重要的贡献是解决了如何使用半导体器件实现布尔代数逻辑,使得在更高层工作的人不用再考虑如何使用半导体器件实现单个的逻辑门,而是可以从逻辑门出发组合出更复杂的功能模块实现更复杂的功能。计算机组成原理层解决的核心问题,就是如何在门电路的基础上搭建出可以执行程序实现计算的机器。操作系统层则要解决在这样一台“裸机”上实现资源管理、任务管理等关键功能,以便供更高层级上的用户可以方便使用计算机。
理解这个层次关系以及组成原理层所要解决的核心问题对于贯穿这门课的知识点、理解计算机组成十分关键。计算机组成原理介绍的内容主要是以冯氏结构(存储指令、顺序执行)为基础,加之指令集,以及cache、流水线等重要的性能优化技术。
从课程的角度看,计算机组成原理的课程知识内容多,知识点比较庞杂,各教材内容组织顺序差别大,因此先从大的方向上把握冯氏结构的主干(计算部件、存储器、总线的工作原理),进而熟悉其他各知识点内容以及各知识点间的关联关系,最后再在复习时从整体上建立一个包括所有知识点及其联系的知识架构,个人觉得是一种比较好的学习方法。
课程实验的重要性,在之前诸位答主的答案中都说得很全面了,最后想推荐另一本书,Randal E.Bryant 的 深入理解计算机系统 (豆瓣),该书从编程的角度给了许多基于计算机组成原理优化程序设计的方法和例子,可以作为组成原理学习的有益补充参考。
沿着Tanenbaum的分层式思想说,组成原理这一层在硬件层(或者说数字逻辑层)之上,向上则承接操作系统层。笼统讲,硬件层最重要的贡献是解决了如何使用半导体器件实现布尔代数逻辑,使得在更高层工作的人不用再考虑如何使用半导体器件实现单个的逻辑门,而是可以从逻辑门出发组合出更复杂的功能模块实现更复杂的功能。计算机组成原理层解决的核心问题,就是如何在门电路的基础上搭建出可以执行程序实现计算的机器。操作系统层则要解决在这样一台“裸机”上实现资源管理、任务管理等关键功能,以便供更高层级上的用户可以方便使用计算机。
理解这个层次关系以及组成原理层所要解决的核心问题对于贯穿这门课的知识点、理解计算机组成十分关键。计算机组成原理介绍的内容主要是以冯氏结构(存储指令、顺序执行)为基础,加之指令集,以及cache、流水线等重要的性能优化技术。
从课程的角度看,计算机组成原理的课程知识内容多,知识点比较庞杂,各教材内容组织顺序差别大,因此先从大的方向上把握冯氏结构的主干(计算部件、存储器、总线的工作原理),进而熟悉其他各知识点内容以及各知识点间的关联关系,最后再在复习时从整体上建立一个包括所有知识点及其联系的知识架构,个人觉得是一种比较好的学习方法。
课程实验的重要性,在之前诸位答主的答案中都说得很全面了,最后想推荐另一本书,Randal E.Bryant 的 深入理解计算机系统 (豆瓣),该书从编程的角度给了许多基于计算机组成原理优化程序设计的方法和例子,可以作为组成原理学习的有益补充参考。
由于我们院师资不行,这算是我们那旮旯拿得出手的几个课了,内容和其他院的没啥区别,就是搭一个简单的CPU,我们那儿主要是用Verilog语言,xilinx软件写一个阉割的MIPS处理器,当然只是一个五级流水线的(还水水写了个单周期的没啥难度)。
我觉得这门课算是一个分水岭,数字电路和计算机组成,搞软件的和硬件的得学;再深入下去,那就是计算机架构了,算是CE专业的重头戏;再深入下去,那就是VLSI,半导体这种硬件专业大课,搞CS的就不用看了。搞软件的要了解计算机的原理,实际上看个计算机组成就能掌握原理了。当时这门儿课学的很感兴趣,想往架构方向发展,妈的自己院不开,结果自己看书看paper去其他院蹭,唉哟妈讲的太好了,时间冲突最后一段儿讲GPU架构的没去,始终觉得那门儿课是我本科上(蹭)的最爽的一门专业课。
最后说说上计算机组成的体验吧,我觉得想学好就靠一个勤字,我当时挺自私的,把组里所有的活儿都干了,单刷可爽~等一次次在充满bug的软件上调试好然后烧到FPGA板儿上成功跑出test case,多少努力都值了。基本上从迷之异常到能工作,你对这个体系的理解也就透了。最后我靠这个练就的Verilog debug能力混到院里一个数字电路助教职位,混到一封推荐信,不得不说运气太好了。
我觉得这门课算是一个分水岭,数字电路和计算机组成,搞软件的和硬件的得学;再深入下去,那就是计算机架构了,算是CE专业的重头戏;再深入下去,那就是VLSI,半导体这种硬件专业大课,搞CS的就不用看了。搞软件的要了解计算机的原理,实际上看个计算机组成就能掌握原理了。当时这门儿课学的很感兴趣,想往架构方向发展,妈的自己院不开,结果自己看书看paper去其他院蹭,唉哟妈讲的太好了,时间冲突最后一段儿讲GPU架构的没去,始终觉得那门儿课是我本科上(蹭)的最爽的一门专业课。
最后说说上计算机组成的体验吧,我觉得想学好就靠一个勤字,我当时挺自私的,把组里所有的活儿都干了,单刷可爽~等一次次在充满bug的软件上调试好然后烧到FPGA板儿上成功跑出test case,多少努力都值了。基本上从迷之异常到能工作,你对这个体系的理解也就透了。最后我靠这个练就的Verilog debug能力混到院里一个数字电路助教职位,混到一封推荐信,不得不说运气太好了。