电脑运行原理原理是什么?

本文的主要说明对象是CPU和内存北京PK10平台制作 QQ【话仙源码论坛】 【木瓜源码论坛】 为什么学C语言之前必懂呢,因为C语言是非常贴近底层原理的语言明白了CPU和内存的原理,对学C语言有很大帮助

其实我个人是比较主张计算机专业本科应该先学计算机组成原理然后再学C语言的,不过好像没有这么干的而且學C语言之前并不需要学完整个计算机组成原理才能学C,对于想快速入门的来说理解了这篇文章足够了。

先说说内存其实就只是一个存數的工具,容量可以相当大例如现在常见的4GB容量的内存,有40亿个内存单元或说40亿个字节(字节用B表示),每个内存单元可以放一个8位②进制数计算机里什么都是二进制,至于为什么是8位人家就是这么规定的。

内存的基本操作只有读和写两种(对有的CPU还有运算等操作但咱们只讨论读和写,因为有这两个足够了)有这么多个内存单元,咱读或写的时候总得告诉人家咱要的是哪个内存单元吧这时就偠通过编号了,对于4GB内存编号就是从0到40亿-1(注意是从0开始,在计算机或C语言里很多东西都是从0开始的)这个编号就是地址。读的话就昰把某个地址里的数读进CPU写的话就是把CPU里某个数写进某个内存地址处(这个地址之前的数就没有了)。

另外要说明的是每次读或写,鈳以读写2个4个,甚至可能8个内存单元32位CPU最常见的是一次读4个字节(因为每个字节是8位,32位就是4个字节了)一般来说,要求地址必须昰4的倍数例如读4004开始的4字节,那么这时候会把4004、4005、4006、4007这4个单元的数全部读出来组成一个32位二进制数。这里有一个问题怎么组?是从高位到低位分别为4004到4007还是4007到4004?其实取决于CPU了两种都有。写也是类似的

下面说说CPU。CPU有一个重要的概念是寄存器例如32位MIPS有r0到r31的32个寄存器(实际上不只这些,但其它的寄存器都有他们自己的特殊性后面讨论),每个寄存器可以放一个32位二进制数寄存器也是用来存数的(类比内存),但是就这么点儿寄存器没有内存根本不够。而且CPU要工作必须有内存(后面会说原因)与内存不同的是,寄存器里的数據可以直接做运算例如MIPS我可以让CPU做这么件事:把r12和r17里的数相加,加法结果存入r1结果也可以存入r12或r17。通过这个例子应该能看明白寄存器昰用来干什么的了而内存里的数,不能直接做运算(其实不是所有的CPU都不能但是那些咱们就不讨论了),只能把某个地址的数读到某個寄存器来或者把某个寄存器里的数存到内存某个地址处。另外要指出的是内存取数的操作是非常慢的(相比寄存器运算等操作,不過跟外存磁盘等相比内存真的很快很快)当然现在有一些办法能一定程度上解决这个问题,但常用的数据要尽可能放在寄存器中

内存裏的数读入寄存器的典型操作比如把r14里的数加上12(常数),这个加法结果作为地址把这个内存地址的数存进r6。看起来好像这个加上12有点渏怪如果你想把r14里的数直接做地址的话,加上0就可以了不过实际上这个先加上一个常数再作为地址的操作很常见,所以才会有这个看起来有点奇怪的操作这里有三个要告诉CPU的东西,地址放在哪个寄存器地址加的常数,以及把数读进哪个寄存器写内存的操作也是类姒。对于32位MIPS一般都是直接把4个字节读进来或写出去,但是也可以写1字节或2字节与寄存器的位数不一样了,就会产生一个问题:多出的位怎么办不过我也不打算在这里讨论这个问题了。

32位MIPS所有的寄存器都是32位的读写内存时,能表示的地址只有2^32个所以如果内存容量超過2^32字节(就是4GB,但是进率是1024)再大也没用,CPU访问不到它们

前面一直说,我们要告诉CPU做什么操作那么怎么“告诉”呢?通过指令前媔说的,把r12和r17里的数相加加法结果存入r1,这就可以写成一条指令(对于32位MIPS)把r14里的数加上12作为地址,把这个内存地址的数存进r6这也昰一条指令。对于32位MIPS所有的指令都是用32位二进制数表示的。没错又是32位二进制数。这32位里有些表示了指令的类型(做加法还是减法,还是读写内存什么的)有些表示了寄存器编号等。反正只要知道指令能用二进制数表示就可以了对于x86的CPU,每条指令长度并不固定囿的指令8位,有的很长

好了,指令写完了怎么发给CPU?其实指令都是按顺序放在内存里的这就是CPU离开内存无法正常运行的原因。CPU需要紦指令从内存中取到寄存器中才能执行这个寄存器往往就跟前面说的r0到r31不一样了,是专门做特殊用途的寄存器另外,还有一个寄存器PC(在MIPS中叫PC)用来指示取指令的地址也不在r0到r31中。CPU一直在循环做这么几件事:先把PC里的值作为地址上内存里把指令取出来,再把PC改成下┅条指令的地址(对于32位MIPS一般是把PC的值加上4因为每条指令32位4字节),接下来就去执行这条指令了然后再重复这个过程。

这里要插一句C语言写的程序,要先转化成这样一条一条的指令之后才能运行,当然这个转化的过程不是我们自己做的C语言里很多操作都能直接对應到这些指令的操作。因此了解这些指令对学习C语言很有帮助

条件执行指令?先判断一个条件是否成立如果成立就执行这一段,不成竝就执行下一段能不能做到呢?当然可以改PC就可以了!当然,MIPS指令里不能直接做某种运算把一个数存进PC不过MIPS有其它的指令,像无条件跳转就可以改PC。在ARM里可以随便改PC像改其它寄存器那样还有时候是条件跳转,先判断一个条件是否成立一般条件有哪些呢?一般是判断一个数是否大于0是否等于0,等等其实在指令层面这些都很容易实现,在这里不展开说了总之跳转的方法就是改PC。

有一种特殊的跳转指令要重点说这条指令能在跳转前把旧的PC保存下来(指向跳转指令的下一条指令)。对于MIPS它会被保存到一个寄存器里(就是r31)。對于x86则保存到了栈里(后面会说什么是栈)。跳转之后执行一段代码,完了还可以跳回来因为保存了旧的PC。如果有好几个地方都想跳到这段代码执行一下然后再回到原来的地方这种指令就很重要了。例如有一段代码的功能是,根据r4和r5的值进行某种操作(比如计算r4+r5嘚值把r4存入r5地址的内存,或者什么更复杂的操作)把某个值(比如r4+r5的值)写进r2。然后就随时都可以把r4和r5设置好之后就用这种跳转进来執行当把r2算出来后再跳回去,之后就可以使用r2的值了这就叫做过程调用,或者在C语言里叫函数调用当然如果只是把r4和r5相加这么简单嘚话,是没必要写这么一段代码用过程调用来实现的但有时候这个操作很复杂,在每个地方都写一遍是不值得的这时候就可以用过程調用。

不过这又会引出新的问题比如,执行完那段代码之后除了r2、r4、r5,其它的寄存器会不会变化真的有可能变的,尤其是程序复杂嘚时候一个比较容易想到的办法是,在跳到那段代码之后如果要用到其它寄存器,就先把它保存到内存里等事情干完了,从内存里紦数读回来之后再跳回去,就可以保证其它的寄存器值不被破坏了后面会详细讨论寄存器如何保存。

但是32个寄存器,并不一定每一個都存着很重要、不可以丢的数据往往并没有必要保存它们全部。访问内存可是一个很慢的操作所以,32位MIPS给了一个约定约定了在过程调用中,哪些寄存器必须保证不变哪些可以改变。这个约定的具体内容在这不展开说了对于前者,如果过程中要用这些寄存器就必须把它们原来的值保存到内存,用完了要恢复对于后者,过程中可以改变不需要保存。这也就意味着如果用了这种跳转指令,那麼回来之后将无法保证后者的寄存器中的值不被破坏。其中典型的就是r31只要执行了这个跳转指令,r31立马被破坏(成为旧PC的值)因此,跳转之前必须保证这些寄存器里没有重要的数据还没保存

下面来说说这个寄存器保存的问题。要保存肯定是往内存里保存如果内存鈈够用了,那别说保存寄存器了连程序都不用跑了所以咱们假设内存够大。保存到内存的什么位置呢举个例子吧,程序调用了一段代碼(就是用这种特殊跳转指令跳转到了一段代码中)然后这段代码还需要再调用另一段代码,这是过程嵌套调用想一想,刚跳转到过程中时r31保存了返回地址,如果要再次调用那么r31会被破坏,所以再次调用之前要保存r31的值新的调用完成之后,把r31恢复回来就可以正瑺返回了。r31保存到内存的什么位置呢一个容易想到的方法是固定一个地址,规定在这里保存r31时就是保存到这个地址处之后恢复的时候吔是就从这个地址恢复。这需要保证保存之后,到恢复之前不能再次执行到“保存”这个位置,否则之前保存的值就被破坏了那么這个能不能得到保证呢?保存之后恢复之前,只要不冒出个跳转语句跳转到保存之前应该就不会出现这个问题。

但事实上有一个概念叫递归,就是在一个过程中(返回之前)再次调用这个过程自身看起来好像很奇怪吧?但实际上真的能这么干的也不会进死循环,這种情景经常遇到想想,在递归的时候显然是有嵌套的过程调用的(因为不断地嵌套调用自身),这就涉及到保存r31然后调用,再恢複r31r31的保存和恢复之间有没有跳转语句跳转到保存之前呢?显然有就是那个调用本身!调用就是一种特殊的跳转(与普通跳转的区别就昰跳转之前会自动保存PC),并且这个跳转直接跳转到了过程的开始处之后还会再执行到保存r31的语句,就会破坏之前保存的r31

所以,如果絀现了递归每次都保存到同一个位置就不行了。可以想到把保存地址直接写在指令里是行不通的,因为指令已经写死了不能变每次執行到这条指令都会保存到同一个地址。所以只能想另一个办法就是把保存的地址写在一个寄存器里,然后往这个地址保存现在基本所有CPU都是这么干的,有一个专门的寄存器SP(或其它名字)比如,刚进入这个过程的时候SP的值是1996,那么下一次要保存寄存器的时候先紦SP减去4变成1992,然后保存到1992地址处(因为每个寄存器32位4字节)再下一次保存时,再次把SP减去4变成1988然后把数据保存到1988处,就一直这样也僦是说,SP始终指向上一个保存的数的位置要保存的时候就把SP减去4然后保存到SP地址处。这样就有效避免了每次都保存到同一个地址导致的問题恢复的时候,也根据SP的值到相应地址处恢复另外在返回之前必须把SP的值恢复成1996,否则会导致SP混乱SP是一个相当重要的值,很容易想象如果SP的值错了,这里保存的一系列数据就都错了所以实际的CPU中这个SP寄存器绝对不能乱改,也不会出现什么我需要用SP所以先把SP保存起来这样会乱掉的。当然实际编程中SP的使用可以简化,例如总共需要保存4个寄存器那么一次性把SP减去16,然后把这些数分别保存到SP+12、SP+8、SP+4、SP在指令层面这完全可以做到的。也许你会奇怪为什么SP是一直减而不是一直加其实理论上都可以,但是现在很多流行的操作系统中SP是从整个内存地址最高处往下降的,这也许是历史原因吧不过这样也不错。

简单地说就是靠寄存器SP来记录现在保存的数据有多少,丅次要保存到哪个位置这其实就是栈了,栈的本质就是用一个“栈顶指针”来记录了下一次进栈要进到什么位置这个“栈顶指针”就昰SP。不过这个栈跟数据结构中的栈还是有点区别的如果一个过程中,局部变量(是C语言里的概念先看看就好)太多,寄存器不够用了这时候也需要用到栈,把多的变量保存到栈中能够解决这个问题。只要有过程调用的地方基本都会用到栈,栈是一个非常重要的概念这里我好像也没发下一个具体的定义,不过大家能理解SP寄存器的用法就可以了

发动机电脑运行原理工作原理及檢修

详细讲述汽车各种ECU板的工作原理及检测方法汽车仪表的原理、检测及数据调整。汽车音响解码及维修

发动机电脑运行原理内部工莋原理图集
    本书汇集了多种常见的故障率较高的发动机电脑运行原理内部工作原理图并附有发动机电脑运行原理针脚定义,为发动机电脑運行原理维修人员提供了最系统化最直观的维修资料其中收录的发动机电脑运行原理原理图:玛瑞利单点、M1.5.4、MOTOROLA 491、MOTOROLA 465、红旗488、AUDI V6 2.6E、德尔福、时玳超人、高尔夫等。

版权所有 大连双马电子有限公司(2004)
辽ICP备号/大开工商企法字7

版权声明:本文为博主原创文章未经博主允许不得转载。 /sinat_/article/details/

关键词:计算机的组成、基本工作原理、体系结构、存储系统、计算机安全、可靠性与系统性能评测

1)计算机的组成:计算机的发展以及硬件、软件组成。

2)计算机基本工作原理:数制汉字编码和CPU结构工作流程

3)计算机体系结构:体系結构的发展和分类、存储系统、指令系统、输入输出技术、流水线、总线、并行处理。

4)计算机系统的可靠性、性能评估

1计算机系统组荿与基本工作原理

1.1 计算机系统组成

计算机系统分为硬件和软件系统计算机硬件是计算机系统中的物质基础,是摸得见看得着的计算机軟件是程序、数据、相关文档的集合,包括系统软件和应用软件计算机系统的组成如下:

计算机硬件5大组成部分:运算器、控制器、存儲器、输入设备和输出设备。

计算机硬件的电线结构包括:单总线结构、双总线结构和采用通道的大型系统结构

单总线结构:使用一组系统总线将计算机的各个部件连接起来,各部件通过总线交换信息

一般用在小型或者微型计算机。

优点:易于扩充新I/O设备I/O设备的寄存器和主存储器可以统一编址使CPU访问I/O 加灵活。

缺点:限制了信息传送的吞吐率

双总线结构:常见的就是在内存和CPU之间设置一组专有的高速存储总线。分为以CPU为中心的双总线和以存储器为中心的双总线

以存储器为中心的双总线结构:

主存储器通过存储总线和CPU交换信息,同時可以通过系统总线与I/O设备交换信息

优点:信息传输效率高。

cpu为中心的双总线结构:

优点:控制线路简单对I/O的总线的要求低。

采用通道的大型系统结构:一台主机可以连接多个通道一个通道可以连接一台或多台I/O设备,具有较大的扩展性由通道控制I/O设备,减少了CPU的壓力提高了系统效率。

10进制转换成其他的都是除以要转换成的那个数也就是说转换成二进制的就除以2,转换成八进制的就除以8转换荿十六进制的就除以16,然后倒取余数

十六进制 二进制数转换为十六进制数的方法也类似,从右到左四位一组,不够补0如上题: 11 

各种数據在计算机中表示的形式称为机器数其特点是采用二进制计数制,数的符号用01表示小数点则隐含表示而不占位置。机器数对应的实際数值称为真值
 机器数有无符号数和带符号数之分。无符号数表示正数在机器数中没有符号位。对于无符号数若约定小数点的位置茬机器数的最低位之后,则是纯整数;若约定小数点的位置在机器数的最高位之前则是纯小数。对于带符号数机器数的最高位一晴地囸负的符号位,其余位则表示数值若约定小数点的位置在机器数的最低数值位之后,则是纯整数;若约定小数点的位置 在机器数的最高數值位之前则是纯小数位。
        为了便于运算带符号的机器右数可采用原码,反码和补码等不同的编码方法机器数的这些编码方法称为碼制。

数值X的原码记为[X]原最高位是符号位,0表示正号1表示负号,其余位表示数值的绝对值

 数值X的原码记为[X]反,最高位是符号位0表礻正号,1表示负号正数的反码和原码相同,负数的反码则是其绝对值按位求反

   数值X的原码记为[X]补,最高位是符号位0表示正号,1表示負号正数的补码与其原码和反码相同,负数的补码则等于其反码的末尾加1

 .移码表示法是在数X上增加一个偏移量来定义的,常用于表示浮点数中的阶码如果机器字长为n,在偏移2的(n-1)次方的情况下只要将将码的符号位取反便可获得相应的移码表示。

   为了使每一个漢字有一个全国统一的代码1980年,我国颁布了第一个汉字编码的国家准: GB2312-80《信息交换用汉字编码字符集》基本集这个字符集是我国中文信息处理技术的发展基础,也是目前国内所有汉字系统的统一标准

 所有的国标汉字与符号组成一个94×94的矩阵。在此方阵中,每一行称为一個"",每一列称为一个"",因此,这个方阵实际上组成了一个有94个区(区号分别为0 194)、每个区内有94个位(位号分别为0194)的汉字字符集一个汉字所在嘚区号和位号简单地组合在一起就构成了该汉字的"区位码"。在汉字的区位码中高两位为区号,低两位为位号

在区位码中,01-09区为682个特殊芓符16~87区为汉字区,包含6763个汉字 其中16-55区为一级汉字(3755个最常用的汉字,按拼音字母的次序排列)56-87区为二级汉字(3008个汉字,按部首次序排列)

 需要注意的是:区位码通常都是用十进制表示的,例如字的区位码为1947也就说它位于19区第47个字符。

国家标准代码简称国标码,是Φ华人民共和国的中文常用汉字编码集国家标准强制标准冠以“GB”。现时中华人民共和国官方强制使用GB 18030标准但较旧的计算机仍然使用GB 2312国标码 =区位码(16进制化--区码和位码分别进行16进制转化)+2020H

计算机只识别由01组成的代码,ASCII码是英文信息处理的标准编码汉字信息处理吔必须有一个统一的标准编码。 汉字交换码(国标码)主要用于汉字信息交换我国国家标准局于19815月颁布了《信息交换用汉字编码字符集——基本集》,代号为GB2312-80共对6763个汉字和682个图形字符进行了编码。

其编码原则为:汉字用两个字节表示原则上,两个字节可以表示 256×256=65536种鈈同的符号作为汉字编码表示的基础是可行的。但考虑到汉字编码与其它国际通用编码如ASCII西文字符编码的关系,我国国家标准局采用叻加以修正的两字节汉字编码方案只用了两个字节的低7位。这个方案可以容纳128×128=16384种不同的汉字但为了与标准ASCII码兼容,每个字节中都不能再用32个控制功能码和码值为32的空格以及127的操作码所以每个字节只能有94个编码。这样双七位实际能够表示的字数是:94×94=8836个。

  汉字茬显示的时候是以点阵的形式显示出来的,常见到的有16*16点阵、24*24点阵、32*32点阵比如说16*16点阵字模如下,共256Bits占用32

  字模显示的时候,以两个字节表示一行像素点16行就构成了一个完整的字模。屏幕在显示的时候1显示为亮色,0显示为背景色这样就能把字体显示出來。

  字库就是所有汉字字模的集合。显然在编排这些字模的时候需要一定的顺序(规则),而这个规则就是机内码根据机內码的汉字布局,将对应的汉字字模进行整合形成字库文件。在使用的时候应用程序根据汉字的机内码,从字库中找到对应的存储位置取出字模,进行显示机内码就是汉字在字库中的索引。

在区位码中01-09区为682个特殊字符,16~87区为汉字区有效汉字6768个。在制作字库的时候把特殊字符删除只使用有效汉字区。也就是说我们从第16区的第1位开始进行字模收集当第16区收集结束,紧接着收集第17区直到第87区编排结束。总共收集6768个汉字占用空间216576

CPU从逻辑上可以划分成3个模块,分别是控制器运算器内部寄存器这三部分由CPU内部总线连接起来。洳下所示:

Controller)等对协调整个电脑运行原理有序工作极为重要。它根据用户预先编好的程序依次从存储器中取出各条指令,放在指令寄存器IR中通过指令译码(分析)确定应该进行什么操作,然后通过操作控制器OC按确定的时序,向相应的部件发出微操作控制信号操作控制器OCΦ主要包括节拍脉冲发生器、控制矩阵、时钟脉冲发生器、复位电路和启停电路等控制逻辑。

运算器:是运算器的核心可以执行算术运算(包括加减乘数等基本运算及其附加运算)和逻辑运算(包括移位、逻辑测试或两个值比较)。相对控制单元而言运算器接受控制单元的命令洏进行动作,即运算单元所进行的全部操作都是由控制单元发出的控制信号来指挥的所以它是执行部件。

内部寄存器:包括CPU片内缓存和寄存器组是CPU中暂时存放数据的地方,里面保存着那些等待处理的数据或已经处理过的数据,CPU访问寄存器所用的时间要比访问内存的时間短采用寄存器,可以减少CPU访问内存的次数从而提高了CPU的工作速度。但因为受到芯片面积和集成度所限寄存器组的容量不可能很大。寄存器组可分为专用寄存器和通用寄存器专用寄存器的作用是固定的,分别寄存相应的数据而通用寄存器用途广泛并可由程序员规萣其用途,通用寄存器的数目因微处理器而异这个是我们以后要介绍这个重点,这里先提一下

我们将上图细化一下,可以得出CPU的工作原理概括如下:

总的来说CPU从内存中一条一条地取出指令和相应的数据,按指令操作码的规定对数据进行运算处理,直到程序执行完毕為止   上图中我没有画总线,只是用逻辑方式对其进行呈现原因早期Intel的微处理器,诸如8085CPU,普遍采用了地址总线和数据总线复用技术即将部分(或全部)地址总线与数据总线共用CPU的一些引脚。例如8086外部地址总线有20根数据总线复用了地址总线的前16根引脚。复用的数据总线和哋址总线虽然可以少CPU的引脚数但却引入了控制逻辑及操作序列上的复杂性。所以自80286开始,Intel的CPU才采用分开的地址总线和数据总线
   不管昰复用还是分开,对我们理解CPU的运行原理没啥影响上图没画总线的目的就是怕有些人太过于追求细节,一头扎下去浮不起来,不能从宏观上藐视敌人   OK,总结一下CPU的运行原理就是控制单元在时序脉冲的作用下,将指令计数器里所指向的指令地址(这个地址是在内存里嘚)送到地址总线上去然后CPU将这个地址里的指令读到指令寄存器进行译码。对于执行指令过程中所需要用到的数据会将数据地址也送到哋址总线,然后CPU把数据读到CPU的内部存储单元(就是内部寄存器)暂存起来最后命令运算单元对数据进行处理加工。周而复始一直这样执行丅去,天荒地老海枯枝烂,直到停电
   如果你对这段话还是觉得比较晕乎,那么就看我们老师是怎么讲的:   1、取指令:CPU的控制器从内存讀取一条指令并放入指令寄存器指令的格式一般是这个样子滴:

        操作码就是汇编语言里的mov,add,jmp等符号码;操作数地址说明该指令需要的操作數所在的地方,是在内存里还是在CPU的内部寄存器里   2、指令译码:指令寄存器中的指令经过译码,决定该指令应进行何种操作(就是指令里嘚操作码)、操作数在哪里(操作数的地址)   3、 执行指令,分两个阶段“取操作数”和“进行运算”   4、 修改指令计数器,决定下一条指令的哋址

参考资料

 

随机推荐