精华内容
下载资源
问答
  • 我拍了一个B站的视频,简单说明了我是怎么学计算机组成原理》的,在这里放一个入口,希望能对一些人有一些帮助吧: 我是怎么学完《计算机组成原理》的 ...

    我拍了一个B站的视频,简单说明了我是怎么学《计算机组成原理》的,在这里放一个入口,希望能对一些人有一些帮助吧:

    我是怎么学完《计算机组成原理》的

    展开全文
  • 如何学习计算机组成原理

    千次阅读 多人点赞 2018-09-13 09:31:15
    《操作系统》是站在软件的角度看计算机的运行原理,《计算机组成原理》则是站在硬件的角度来看计算机的运行原理,因此这门课对于学习计算机的学生来说非常重要。我这里不谈怎么通过考试,相信对于现在的的大学考试...

    最近看组成原理看得相当无聊,去网上找学习方法,找到一篇不错的文章。
     
           《操作系统》是站在软件的角度看计算机的运行原理,《计算机组成原理》则是站在硬件的角度来看计算机的运行原理,因此这门课对于学习计算机的学生来说非常重要。我这里不谈怎么通过考试,相信对于现在的的大学考试来说,只要认真备考的都不会通不过,所以这里不谈怎么通过考试,而是谈怎么学到有用的东西。
     
      对于以后想从事嵌入式系统、操作系统设计等和硬件结合比较紧密的工作的同学,我建议所有的内容都要学好,而如果以后想从事软件相关工作的同学也要学好存储器、输入输出系统、计算机的运算方法、指令系统、CPU的结构和功能等章节的内容,因为做大型系统软件会涉及到调优的问题,如果只懂软件,而不知道硬件在怎么运行的话,调优会受到限制,软件无法发挥硬件的最大优势。举一个简单的例子,我所在的公司以前开发过一套软件系统,在Intel的服务器上运行,一开始我们的软件运行效率非常低,然后Intel派了一个对硬件、软件都非常熟悉的团队来进行调优,经过调优,我们的程序运行效率提高了10倍。
     
      这门课程和数字电路等课程不同,《数字电路》是站在微观的角度讲解计算机的原理的,而《计算机组成原理》则是站在宏观角度讲解的,因此大可不必在电路图等细节问题上陷得太深,只要像zsk425 说的那样,以“抽象”的观点看问题,只要知道它在做什么就可以了,不要管它内部是怎么实现的。
     
      这门课和其他专业课不同,大部分都是理论性的东西,很少有动手实验的内容,因此很多同学感觉非常枯燥。那么我的建议就是自己多结合自己的电脑进行联想和研究,多到网上搜索相关的资料,那样理解就会更加深刻。《计算机组成原理》、《操作系统》、《计算机组成原理》是可以当成“小说”来看的课程,不要皱着眉头把它当成理论学,而是把课本想象成一个给你讲计算机运行原理的说书人。
     
      比如学到《系统总线》的时候,你就想:计算机部件之间的通讯如果是通过一根线来进行的话肯定非常慢,因为数据、控制信息等都要通过一根线进行,而如果分成数据总线、地址总线和控制总线三条线的话数据、控制、地址信息就可以并行进行,所以速度就快了。然后你就可以到网上搜PCI、ISA总线等的介绍,南北桥芯片的介绍等,这样你就能把知识做到“不用刻意记就记住了”。
     
      讲到存储器的缓存的时候,你就琢磨缓存到底是在做什么。缓存就是为了解决低速设备读取的问题,从内存中读数据肯定没有直接从CPU的缓存中读取快,所以就需要把经常被读取的数据放到缓存中,以后读的时候直接去缓存中读取就可以。缓存不能设计的太小,因为太小的话很多需要缓存的数据放不进去,太大的话则会增加成本,而且会导致很多不需要被缓存的数据也缓存了。然后你就到网上看主流的CPU内置的1M、2M、8M缓存的比较的文章,相信你就会理解深刻了。
     
      讲到程序查询方式、DMA方式等的时候你就联想企业中的人员管理,有的企业里边A员工让B员工做一件事情也要领导转达任务分派,而且有的企业里一些普通的事情员工之间就可以处理,无需要领导过问。
     
      讲到奇偶校检码的时候你就可以思考为什么有的压缩文件、视频文件有轻微的损坏仍然能够打开,你甚至可以自己写一个程序来实现校检功能。
     
      总之,多到网上搜集相关资料,多联想,把它当成小说来读就会轻松、愉快很多,学的也会更扎实。

    展开全文
  • 计算机组成原理

    2018-07-31 09:11:05
    《操作系统》是站在软件的角度看计算机的运行原理,《计算机组成原理》则是站在硬件的角度来看计算机的运行原理,因此这么课对于学习计算机的学生来说非常重要。我这里不谈怎么通过考试,相信对于现在的的大学考试来...

           《操作系统》是站在软件的角度看计算机的运行原理,《计算机组成原理》则是站在硬件的角度来看计算机的运行原理,因此这么课对于学习计算机的学生来说非常重要。我这里不谈怎么通过考试,相信对于现在的的大学考试来说,只要认真备考的都不会通不过,所以这里不谈怎么通过考试,而是谈怎么学到有用的东西。 对于以后想从事嵌入式系统、操作系统设计等和硬件结合比较紧密的工作的同学,我建议所有的内容都要学好,而如果以后想从事软件相关工作的同学也要学好存储器、输入输出系统、计算机的运算方法、指令系统、CPU的结构和功能等章节的内容,因为做大型系统软件会涉及到调优的问题,如果只懂软件,而不知道硬件在怎么运行的话,调优会受到限制,软件无法发挥硬件的最大优势。举一个简单的例子,我所在的公司以前开发过一套软件系统,在Intel的服务器上运行,一开始我们的软件运行效率非常低,然后Intel派了一个对硬件、软件都非常熟悉的团队来进行调优,经过调优,我们的程序运行效率提高了10倍。 这门课程和数字电路等课程不同,《数字电路》是站在微观的角度讲解计算机的原理的,而《计算机组成原理》则是站在宏观角度讲解的,因此大可不必在电路图等细节问题上陷得太深,只要像zsk425 说的那样,以“抽象”的观点看问题,只要知道它在做什么就可以了,不要管它内部是怎么实现的。 这门课和其他专业课不同,大部分都是理论性的东西,很少有动手实验的内容,因此很多同学感觉非常枯燥。那么我的建议就是自己多结合自己的电脑进行联想和研究,多到网上搜索相关的资料,那样理解就会更加深刻。《计算机组成原理》、《操作系统》、《计算机组成原理》是可以当成“小说”来看的课程,不要皱着眉头把它当成理论学,而是把课本想象成一个给你讲计算机运行原理的说书人。 比如学到《系统总线》的时候,你就想:计算机部件之间的通讯如果是通过一根线来进行的话肯定非常慢,因为数据、控制信息等都要通过一根线进行,而如果分成数据总线、地址总线和控制总线三条线的话数据、控制、地址信息就可以并行进行,所以速度就快了。然后你就可以到网上搜PCI、ISA总线等的介绍,南北桥芯片的介绍等,这样你就能把知识做到“不用刻意记就记住了”。 讲到存储器的缓存的时候,你就琢磨缓存到底是在做什么。缓存就是为了解决低速设备读取的问题,从内存中读数据肯定没有直接从CPU的缓存中读取快,所以就需要把经常被读取的数据放到缓存中,以后读的时候直接去缓存中读取就可以。缓存不能设计的太小,因为太小的话很多需要缓存的数据放不进去,太大的话则会增加成本,而且会导致很多不需要被缓存的数据也缓存了。然后你就到网上看主流的CPU内置的1M、2M、8M缓存的比较的文章,相信你就会理解深刻了。 讲到程序查询方式、DMA方式等的时候你就联想企业中的人员管理,有的企业里边A员工让B员工做一件事情也要领导转达任务分派,而且有的企业里一些普通的事情员工之间就可以处理,无需要领导过问。 讲到奇偶校检码的时候你就可以思考为什么有的压缩文件、视频文件有轻微的损坏仍然能够打开,你甚至可以自己写一个程序来实现校检功能。

    展开全文
  • 函数 A 调用函数B是怎么执行的 程序执行会先把A入栈 当A中的函数指令执行到要调用B的时候,会调用call B 把函数B调用结束后要执行的下一条指令地址压栈 执行push rbp操作把函数B压栈 函数B执行完毕 调用pod B B出栈...

    函数调用栈

    栈帧 整个函数A所占用的所有内存空间 就是A的栈帧
    函数 A 调用函数B是怎么执行的

    1. 程序执行会先把A入栈
    2. 当A中的函数指令执行到要调用B的时候,会调用call B
    3. 把函数B调用结束后要执行的下一条指令地址压栈
    4. 执行push rbp操作把函数B压栈
    5. 函数B执行完毕 调用pod B B出栈 并且把刚才入栈的指令放入PC寄存器 同时把控制权返回给出栈后的栈顶

    其实程序最终的执行都是一条一条的指令,不断的更新PC寄存器中的指令地址,函数调用也是一个指令 call,如果所有的程序都在一个函数里执行也就不存在什么函数调用栈了,函数的地址在编译阶段已经确定,不过是虚拟地址而已,当函数之间相互调用时 不过就是增加一种函数调用栈的机制,来达到执行了一个函数后再回来继续执行效果。
    与if/else的跳转过去就不回来的相比 函数调用栈更高明一些吧

    内联函数(inline) 以及编译器优化

    标记为内联函数的函数 编译器会帮助我们进行优化,把函数的实现部分直接插入到函数的调用处,也就是有10个地方调用这个函数就有10份这样的代码

    编译 连接 装载

    一、编译
    如下代码

    //add_lib.c
    int add(int a, int b){
    	return a + b;
    }
    
    #include<stdio.h>
    int main(){
    	int a = 10;
    	int b = 5;
    	int c = add(a,b);
    	printf("c = %d",c);
    }
    

    gcc -g -c add_lib.c link_example.c 编译两个文件 生成 目标文件

    二、链接-连接器生成可执行文件

    gcc -o link-example add_lib.o link_example.o
    

    三、整个过程

    由编译器生成汇编代码 汇编器生成目标代码 链接器连接静态文件生成可执行文件
    装载器把可执行文件装载到内存中 CPU从内存中读取指令和数据 开始真正的执行。程序是通过装载器变成指令和数据的。

    四、ELF文件格式

    1. 文件头:保留文件属性、对应的CPU、对应的操作系统
    2. 代码段:存储程序的代码和指令
    3. 数据段:全局变量和局部静态信息
    4. 重定位表:保存的是那些跳转是我们不知道的,在链接之前不知道要跳转到哪里,这些信息都存储在重定位表中
    5. 符号表 保存当前文件里定义的函数名称和对应的地址薄

    五、链接器干的事儿

    1. 扫描所有输入的目标文件 把符号表里的信息收集起来,构成全局符号表
    2. 根据重定位表把不确定的跳转地址代码根据符号表里的地址进行一次修正
    3. 把所有的目标文件对应段进行一次合并,最终形成可执行代码。

    六、装载器干的事儿

    1. 解析可执行文件,把对应的指令和数据加载到内存中 让CPU执行

    内存

    一、内存分页

    1. 分页是把整个物理内存空间切分成一段段固定尺寸的大小
    2. getconf PAGE_SIZE 查看操作系统的页大小
    3. 一个页中的物理内存是连续的,这时一个程序不再是拥有整个程序大小的连续内存区域,而是分成了很多页
    4. 内存分页之后,程序也不需要一次性就把程序全部加载到内存里,只需要把当前需要的指令加载到内存中就好,当程序访问到不存在的物理内存时会出发一次缺页中断,这是操作系统会把存放在硬盘上的虚拟内存读出来加载到物理内存中。

    动态链接

    一、 地址无关码

    1. 动态代码库的变量和函数 都使用相对地址
    2. 动态链接解决方案

    plt 程序连接表
    got 全局偏移表
    共享库在内存中的物理地址是确定的,不同的程序在加载动态库的时候会往自己的数据段中插入一个全局偏移表,这个偏移表记录着所使用的动态库的相对地址,当要使用其中的函数时只需要查找全局偏移表,然后找到物理地址就好。

    虽然不同程序调用同样的动态库,各自的内存地址是独立的,调用的又都是同一个动态库,但是不需要去修改动态库里面的代码所使用的地址,而是各个程序各自维护好自己GOT 就能找到对用的动态库了。

    二进制表示

    一、数字二进制表示

    1. 最高位是符号位
      5 0101
      -5 1011 -23+21+1 = -5
    2. 二进制加法 -5 + 1
      1011 + 0001 = 1100 = -8 + 4 = -4

    二、字符二进制表示

    1. ASCII 美国信息交换标准码 只有英文数字和特殊字符 8 位 128个字符
    2. 字符集 是字符的集合 例如Unicode 包含150万种语言的14万个不同字符
    3. 字符编码 是对于字符集里的字符 怎么用二进制一一表示的字典 字符集就可以用UTF-8 UTF-16 UTF-32 进行编码

    电路

    一、电报机

    蜂鸣器+电线+按钮 按下的时间长一点就是一个划信号 按下时间短一些就是一个点信号 对应的就是0/1 SOS 就是 点点点划划划点点

    二、继电器
    电信号在传输过程中 由于线路长了之后信号会减弱 电阻等原因,那么这是就需要在中间有一个加强信号的机制,就是继电器,他会把信号原封不动的往下传,远离就是 开关和磁性线圈,开关默认是关上的 当同上电之后磁性线圈有了磁性 就让开关断开 又断电 那么对应到下游就是01信号一层一层传递

    展开全文
  • 从函数调用开始,在计算机指令层面函数间的相互调用是怎么实现的,以及什么情况下会发生栈溢出 1 栈的意义 先看一个简单的C程序 function.c 直接在Linux中使用GCC编译运行 [hadoop@JavaE...
  • 文章目录计算机组成原理基础(1)总览计算机的基本硬件组成冯·诺依曼体系结构可编程存储程序冯·诺依曼体系结构计算机性能-CPU主频什么是性能? 计算机组成原理基础(1) 总览 学习计算机组成原理,其实就是学习和拆解...
  • 实数怎么表示,能用二进制表示所有的实数嘛,开始是用BCD编码来表示 BCD编码 用 4 个比特来表示 0~9 的整数,那么 32 个比特就可以表示 8 个这样的整数。然后我们把最右边的 2 个 0~9 的整数,当成小数部分;把...
  • 对应到计算机组成原理(硬件层面) 算法 — 各种计算机指令 数据结构 — 二进制数据 计算机用0/1组成的二进制,来表示所有信息 程序指令用到的机器码,是使用二进制表示的 存储在内存里面的字符串、整数、浮点数...
  • 本书涵盖 数制说明->数字电路->组成原理->微机原理->->计算机体系结构->计算机外设与设备驱动,可以对计算机学习者学习计算机硬件有所帮助。由于是个人总结摘抄版本,书刊内容没有仔细修改。但整个书刊抽取计算机...
  • 和现实联系起来,我们求两个数的乘法时怎么算。 例如,求1000乘以1110的结果。 我们会列一个算式,如下: 1000是被乘数,1110是乘数。拿乘数的每一位和被乘数相乘,得到的数向左移动相应的位数,最后相加就是结果。...
  • 一个计算机程序是怎么被分解成一条条指令来执行的呢 1 CPU如何执行指令 CPU里差不多几百亿个晶体管 实际上,一条条计算机指令执行起来非常复杂 好在CPU在软件层面已经为我们做好了封装 对于程序员来说,我们只要知道...
  • 你在学写程序的时候,有没有想过,古老年代的计算机程序是怎么写出来的? 当年写程序,不像现在这样,都是用一种古老的物理设备,叫作“打孔卡(Punched Card)” 用这种设备写程序,没法像今天,掏出键盘就能打字...
  • 来看看,计算机在硬件层面究竟是怎么表示二进制的,你就会明白,为什么计算机会选择二进制。 1 怎么做到“千里传书” 马拉松的故事相信你听说过。公元前490年,在雅典附近的马拉松海边,发生了波斯和希腊之间的希波...
  • 组成原理是让你从整体上精略地让你了解计算机怎么工作的,内容上侧重于计算机的几大组成(运算器,控制器,存储器,输入设备,输出设备与总线结构),具体来说,是具体一条指令在cpu中是如何执行的,计算机的储存...
  • 想要学习这门课,可是被浮点数难倒了,哪位可以给我讲讲浮点数到底是怎么来的? 里面的阶码,尾数的是怎么运算的? 还有怎么和十进制之间转换?
  • 目录 前言 一、什么是计算机指令 二、常见的计算机指令 ...具体又要怎么学呢?学了之后对我未来编码又有那些帮忙呢?也很清楚抱着好奇心与问题去学习是最好的,但成年人的世界往往是需要抱着任务去学习。 一...
  • 通过CPU主频,来谈谈“性能”究竟是什么 “性能”这个词,不管是在日常生活还是写程序的时候,都经常...在前面说过,学习和研究计算机组成原理,就是在理解计算机是怎么运作的,以及为什么要这么运作。“为什么”所要解
  • 学计算机组成原理时,有一章讲机器运算,什么定点和浮点的乘法和除法,什么原码和补码的乘法和除法,感觉有点难度啊,上课光听老师讲很容易懵,课下自己钻研很花费时间,各位大神怎么看?有没有什么建议,我是计算机...
  • 你在学写程序的时候,有没有想过,古老年代的计算机程序是怎么写出来的?上大学的时候,我们系里教 C 语言程序设计的老师说,他们当年写程序的时候,不像现在这样,都是用一种古...
  • 一想就想到了计算机组成原理上学过的。位运算的思想可以应用到很多地方,这里简单的总结一下用位运算来实现整数的四则运算。 大佬带你看位运算怎么实现四则运算! 加法运算: int AddWithoutArithmetic(int num1,...
  • 主存如何与CPU进行连接?地址线、数据线和控制线都怎么连接?这是本文的学习目标。
  • 因为本身专业也不是自动化或计算机,对其培养计划也没有太多了解,就不知到要先什么再什么(不过都过之后就知道了????)。有时候接触单片机的知识或教程,上来就是怎么做可以实现这个目的,而我们学习时也就是...
  • 上一讲,我们讲解了时钟信号是怎么实现的,以及怎么利用这个时钟信号,来控制数据的读写,可以使得我们能把需要的数据“存储”下来。那么,这一讲,我们要让计算机“自动”跑起来。 通过一个时钟信号,我们可以实现...
  • 和小学学习数学一样,完了加法之后,我们自然而然就来学习乘法。既然是退回到小学,我们就把问题搞的简单一点,先来看两个4位数的乘法。这里的4位数,当然还是一个二进制数。 十进制中的13乘以9,计算的结果应该是...

空空如也

空空如也

1 2 3 4 5 ... 11
收藏数 204
精华内容 81
关键字:

计算机组成原理怎么学