我只想说,总结的很乱..也有没写清楚的...谁要是想学了,还得自己看,,哎...
摩尔定律:
2.微处理器的性能每18个月提高一倍,或价格下降一半.
计算机发展历程:
第一代:电子管;第二代:晶体管;第三代:中小规模集成电路(操作系统出现);第四代:大规模集成电路;第五代:超大规模集成电路(微处理器出现);第六代:智能计算机;哎,都是浮云..
冯诺依曼机特点:
计算机有五大部分组成:运算器,存储器,控制器,输入,输出设备..
指令和数据存储在存储器;
指令和数据用二进制表示;废话…
指令由操作码和地址码组成..
机器以运算器为中心(现代计算机以存储器为中心);
存储器组成:
地址寄存器/地址译码器/读写命令/数据缓冲寄存器; 首先访问存储器是按地址访问吧 所以要把地址先缓存起来,然后呢 有的还需要经过地址译码器才能得到真正的地址,现在地址有了,读还是写呢?这下就得靠读命令还是写命令了,,读了之后,放哪呢,,当然是放数据缓冲寄存器了…
运算器组成:
首先任何运算都能转换为加法和移位运算完成..所以,运算器由加法器,移位门,通用寄存器组(用来存要计算的数或计算结果的),输入选择门(这么多寄存器哪些参与运算呢当然要选择了),数据总线..
控制器组成:
1. 指令部件:程序计数器,指令寄存器,指令译码器,.
2. 时序部件:脉冲源,启停控制逻辑,节拍信号发生器.
3. 控制单元:反正就是由各种信号形成的..
4. 中断逻辑控制:控制中断处理的..
时钟周期=主频分之一;主频的意思是一秒钟有多少时钟周期
cpi= 一条指令所需的时钟周期数
mips=每秒百万指令数; 所以一秒的时钟周期数除以一条指令所用的时钟周期就是 一秒执行的指令数即 mips=主频/cpi;
运算速度:一条指令用多少秒…
cpu周期就是机器周期;一次基本操作的时间,比如取指令,存储器读,等
寻址范围:
如果告诉你地址线的条数n ,问按字节访问时,寻址范围是多少,那肯定是2的n次方,要是按字访问呢?简单,该计算机一个字包括2^k个字节 则寻址范围就是2的(n-k)了,以为从地址线中拿出了k根进行字内寻址了..(不明白留言)
指令的执行阶段过程:
1)取指令阶段 :按照程序计数器取出指令,程序计数器加一
2)指令译码阶段:分析操作码,决定操作内容,并准备操作数
3)指令执行阶段:执行操作码所指定内容
真值和机器数的区别: 真值就是正负号加该数的绝对值;机器数就是把正,负号用0,1表示;
bcd码相加:
因为bcd码是表示十进制的 所以到1010就是错的 只要两个bcd码相加大于1001则加六修正.
海明码: 具有一位纠错能力,如果信息码有k位,设校验位的个数为r,则它能表示2r个信息,用其中的一个信息指出“没有错误”,其余2r-1个信息指出错误发生在哪一位.所以r应该满足下式 2r >=k+r+1;
海明码怎么求写起来挺复杂的,例如:要求信息码为101101的海明码,先计算需要多少位校验码 由上式知需要4位,然后校验码在整个码的位置是第(1,2,4,8,16…)也就是,整个码应该表示成: x10 x9 j4 x7 x6 x5 j3 x3 j2 j1
下来呢就是求校验码的值了,:怎么求呢 假设一共10位,则可由四个二进制码表示;第一位0001,第二位0010,第三位0011第四位0100第五位0101第六位0110第七位0111第八位1000.第九位1001第十位1010 所以呢e4 e3 e2 e1其中e1(最低位为1的相异或)就是等于j1异或x3异或x5异或x7异或x9 同理e2就是由四个二进制码表示的第二位为一的相异或..
然后呢 要是海明码无错误信息即e4 e3 e2 e1都为0,即可以求出j1,j2,j3,j4,ok了,海明码求出来了….现在知道海明码了,如果接收到数据后怎么知道他有没有错,继续用接受的数据求e4 e3 e2 e1 如果求的是0010则表示第二位错了 去把j2取反就行…我去 说的这么凌乱不知道大伙能看得懂不..罪过,不懂问我啊..
还有个东西 海明码如果要检测d位错,需要一个海明距为d+1的编码方案,如果要揪出d位错,需要一个海明距为2d+1的编码方案,,这个是通信学过的,,其它人不懂可以不看…
定点数的算术移位
正数:全部补零 ; 负数:要分三种情况了
定点数由原码表示:左右移全部补零
反码表示:左右移全部补1
补码表示:左移补0,右移补1(补码其实左边是反码右边是原码为什么这么说了有兴趣可以问我)所以左移时得给最右边补,,即当成是给原码补….
提一下1. 逻辑移位不管什么全是补零2,当采用双符号表示数时,最高位是真正的符号位,算术移位时只有低符号位参与移位.
求补码:已知x的补求(-x)的补 怎么求呢?连同x补的符号位在内全部取反,末位加一,,这个是公式,我没研究为什么...然后还有个公式(x+y)补=(x)补+(y)补,这个很重要…
溢出的概念和判断方法:3种 首先要知道相同符号位相加 才有可能溢出,不是数变大了就是数变小了..所以判断溢出的方法有三种:
1. 只要实际参加操作的两个数符号位相同且与结果的符号位不同则肯定出现溢出了.
2. 最高位进位和符号位异或是1,则溢出.
3. 双符号位,两位不同则溢出,且真正的正负由最高符号位表示.
ieee754标准
S |
阶码(含阶符) |
尾 数 |
数符 用移码表示
注意这里的移码并非一般的补码取反加一,而是原码加127不是加128 因为留出全1表示无穷大..
浮点数怎么判断溢出呢?当浮点数的阶码大于最大阶码时称为上溢,进行中断溢出处理,当浮点数的阶码小于最小阶码时称为下溢,当机器零处理…
浮点数的加减法运算://need add 这个没写完…明天再加..
还是举例说明吧:例如十进制数x= -5/256,y=+59/1024 按机器补码浮点运算规则计算x-y, 双阶符,双数符,阶码三位.尾数九位.
1.对阶:
2.尾数求和:
3.规格化:
4.舍入处理:
5.溢出判断:
存储器的层次结构
缓存(cache)-主存层次主要解决CPU和主存速度不匹配的问题; 主存-辅存层次主要解决存储系统的容量问题
Cache的命中率:=访问cache的命中次数除以总的访存次数…
平均访问时间:=访问cache用的存取周期乘以命中率+主存的存取周期乘以未命中率
所以呢要是求cache-主存系统的效率千万不能以为就是命中率,,而是等于访问cache的存取周期除以平均访问时间..真绕..
Cache和主存的地址映射方式:三种;全相联,直接相连,组相连.
全相联:这个有点扯,,只要cache有地方.主存中任何一块都可以来放,,有点像数据结构里的线性探测在散列…是吧!
直接相连:若cache有n块则,主存第i块应该存放到cache的第imodn块中;
组相连:将cache分成x组 则主存第i块应该存放到cache的第imodx组中至于在该组的哪块就用全相联办法,随便放..
只读存储器(ROM)的分类:
1. 可编程序的只读存储器(PROM) 一次性写入的存储器;
3. 可擦可编程序的只读存储器(EPROM)用紫外线照射即可擦除.
4. 可电擦可编程序只读存储器(E2PROM)具有电擦除功能.
5. 快除读写存储器(Flash Memory)读写操作一般是以块为单位.
SRAM的存储原理是依靠双稳态电路,DRAM的存储原理是采用电容式存储.sram存取速度快,集成度低,功耗大,dram刚好相反..
DRAM的刷新有三种方式:刷新是所有芯片的某行同时被刷新..
1. 集中刷新:由于刷新的时候是不能进行读取的,所以就出现了:死时间;
2. 分散式刷新:存储周期=读或写周期+刷新一行的时间,没有了死时间.所谓的死时间其实都分散到存储周期中去了.
3. 异步刷新:就是每两毫秒(这个时间是极限了在不刷新就丢失了)刷新一行..死时间等于一个读写周期,因为在两毫秒内读写了n次而只刷新了一行..
字扩展和位扩展: 字扩展选中其中一片,比如1k*8的扩展成4k*8的,那么需要4片,最后每片的地址范围是原来所需的10位前面加上片选的4位(假设没采用什么2,4译码器)每个位扩展同时将所有片选中.
大端模式:比如十六进制数123456 则在内存中正常存 地址0存12 地址1存34 地址2存56 小端模式:地址0存56,地址1存34 地址2存12
虚拟存储器:实际上东西在辅存上,让人感觉是在内存里.. 我们编程时的地址 都是虚拟地址也叫逻辑地址.
下来重点说下虚地址到实地址的转换:只考虑页式存储,至于什么段式.段页式等操作系统再讲吧..页式就是存储器分成了一页一页的,,每页里分为好多行,(cache里把这行叫做块,)越扯越多了,,虚地址经过查页表就能知道实地址是什么,,页表又是什么呢?页表是存储在内存中的,虚页号与页框号的对应关系表,,也就是说虚地址分为两部分 虚页号和页内地址;实地址对应的由页框号和页内地址组成;
由于查页表要访存,所以有了tlb(快表) 快表和cache的相同点是都有映射方式:举例:组相连映射,则tlb和cache内容包括组号,标记位,页框号 如果是组相连则虚地址和实地址都是由三部分组成(和页表不一样) :标志位,组号,页内地址,,这下由虚地址怎么查找实地址呢?先找到组号,然后查表里的tag看和地址中前半部分(tag)比一样则'取出该tag对应的页框号,就是实地址的页框号…还有一点cache和tlb不一样的是:访问cache用的是实地址,即物理地址.
指令的基本格式:
指令由操作码和地址码表示;地址码可以使操作数本身,也可以是操作数地址等.操作数地址的个数有四/三/二/一/零地址等.操作码有变长的..比如指令字长固定的情况下,让设计一套指令系统包括三地址指令x条.二地址指令y条.一地址指令z条,则先满足三地址取n3位则2的n种三地址 一般都会大于x条所以剩下多余的表示 就当做二地址的扩展 然后 再取n2位满足二地址以此类推,,也就是说 三地址的操作码长度小于二地址的小于一地址的,至于怎么判断他是几地址的 就看是否属于扩展后的表示..
寻址方式:分为指令寻址.数据寻址;
指令寻址:就是从现在正在执行的指令找到下条准备执行的指令..两种办法.一程序计数器自动加1就是下条要执行的指令.二.转移指令会给出要转移到哪条指令上去的.
数据寻址分为九类:
1. 立即寻址:地址码里就是需要的操作数,直接取.用途:通常用于赋值操作
2. 直接寻址:指令给的是操作数的地址,数其实在内存中
3. 隐含寻址:操作数地址隐含在某个寄存器中.
4. 一次间址寻址:指令给出的是操作数地址的地址,就是说根据地址码的值,第一次访存取的是操作数的地址:还要再访一次才是操作数..用途:子程序返回/查表之类的.
5. 寄存器寻址:指令给的是操作数所在寄存器的寄存器编号;编号占的位数当然比内存地址占的少多了..
6. 寄存器间接寻址我去 寄存器里存的是操作数所在的内存的地址:
7. 基址寻址:有个基址寄存器,操作数的有效地址是基址寄存器的值加上形式地址;注意基址寄存器的内容不能由用户改变..而形式地址可变.
8. 变址寻址:操作数的地址是变址寄存器的值加上形式地址,跟基址相反,,变址寄存器的值可由用户改变,反而形式地址不能变..用途:处理数组问题
9. 相对寻址:操作数的地址等于程序计数器的值加上形式地址;用途:转移类指令,和程序浮动.比如某段程序在内存中经常变化位置..
risc的特点:
1. 指令长度固定,指令格式种类少,寻址方式种类少.
2. 只有取数/存数指令访问内存,其余指令的操作都在寄存器内完成.
3. cpu中的通用寄存器比cisc的多..
4. 采用流水线技术..超流水线和超标量技术
5. 控制器采用组合逻辑控制,不是微程序控制,采用优化的编译程序.
Cisc就不说了反正和risc相反就行了.
Cpu访存是为了什么?
1. 取指:取指令 取指令的信息流为
(1)(pc)->mar//pc带个括号指的是取pc里面的值输入到地址缓冲寄存器中
(2)1->r//发出读命令
(3)m(mar)->mdr.//在主存中此地址的内容输入到数据缓冲寄存器.
(4)mdr->iR//将要执行的指令存入指令寄存器
(5)op(iR)->cu//op(iR)指的是指令的操作码
2. 间指:取操作数地址:信息流为
(1) ad(iR)->mar//将指令的地址码打入地址缓冲存储器
(2) 1->r//发出读命令
(3) M(mar)->mdr// 将有效地址从主存输入到数据缓冲存储器
3. 执行:取操作数(假设是一次间址)
4. 中断:存程序断点:
指令流水线:
如果把一条指令的解释过程分为三步:取指令,译码,执行,则在第一条译码的时候,第二条就可以取指令了,等第一条执行时,第二条已经在译码了,然后第三条就可以开始取指了…所以当使用流水线时,执行n条指令所需要的时钟周期是3+(n-1)*1 因为除了第一条以后的每条指令都相当于是在再一个时钟周期就完成执行..
影响流水线的性能:
1. 资源相关:就是前一条指令还在用某个资源,所以后面的只能等了…
2. 数据相关:包括写后读,读后写,写后写…这三种情况必须是各自都按顺序来,才不会错..举个例子:如果应该先读x单元的数据完了后再给x单元写,而现在是先写了,所以读出来的就是错的,这时就犯了读后写的错误了即(WAR write after read)
流水线性能指标:
1. 吞吐率:单位时间内流水线所完成的指令数…
2. 加速比:不适用流水线所用的时间除以使用流水线所用的时间.
超标量技术:就是一组指令,同时使用流水线.. 超流水线技术:把指令的执行分成更多步.
多重中断过程:
先执行中断隐指令:
关中断,保存断点及旧psw,取中断服务程序入口地址及新psw
下来执行中断服务程序:
保护现场,送新屏蔽字,开中断,服务处理,关中断(不管是多重还是单重中断在 恢复现场之前必须关中断防止在恢复现场过程中被新的中断请求打断,出现错误),恢复现场及原屏蔽字,开中断,中断返回 ,