本篇是对南大的计算机系统基础的第一篇的总结,也是对自己的学习成果的检验
之后会更新csapp的lab,只会提供做法思路不提供代码,若你在学习过程中有困惑可以私信我,欢迎一起交流,一起进步~
当计算机开始出现时,可谓是百家争鸣,每个人都有自己的想法,但是最终一直到今天为止还在起着巨大作用的是一位叫冯诺依曼的靓仔
他在上世纪五十年代提出的计算机由运算器,控制器,存储器,输入设备,输出设备组成,并且采用存储程序的工作方式到今天依然适用,你的电脑大概率就是采用的这种结构和工作方式
那肯定有同学不理解何为采用存储程序的工作方式,首先,你在一个.c文件下写下了经典的Hello,World代码,但是呢这个文件你可以打开而且你也明白这是hello world(即这个文件你是看得懂的,而不是一堆乱码),这叫做统一叫做文本文件,此时这文件是不能被执行的,因为你没有编译链接操作
当你按下run的时候,屏幕上输出了Hello World,那么这一过程发生了什么呢
建议先看完文字描述。。。。
你哒哒哒的在键盘敲下
gcc -o hello hello.c
然后你会得到一个名为hello的可执行文件,它就是hello.c 的编译链接后的文件,这个文件是保存在你的磁盘里的,不是主存哦!
gcc是GNU/Linux下的一个编译软件,-o代表级别,hello代表你对编译链接后的可执行文件命名(你也可以改为test,uiahfgofghw),hello.c就是你要编译的文件
PS:有人分不清主存和磁盘,比如你买电脑写着 16G+512G,代表你的主存16G,磁盘512G,磁盘读写速度很慢的,所以不能直接和磁盘进行IO,而应该把磁盘里的文件拷贝到主存里,和主存进行IO
那么当你敲下
./hello
你屏幕上会输出Hello World(记得输入enter键代表结束)
这一过程如何发生的呢?(建议结合图片观看)
当你敲下./hello,键盘(输入设备)会把输入的内容放到主存,然后在显示屏上显示,然后把可执行文件从磁盘中拷贝到主存中,因为可执行文件里都是01序列,机器可以直接识别执行,那么CPU就会在主存存放可执行文件的地方开始读取指令并执行,最后中得到Hello World
好了,Hello World程序告一段落,我们来看看指令的执行,这会更加的底层
指令会放在存储器里,然后由CPU进行读取执行操作
我们以一个小栗子来说明
我们有这么一个东西,主存里放的都是指令(01序列)
指令格式长这样
指令是定长的,8位
现在我们看第一条指令,此时PC值为0,PC存放的是将要执行的指令的地址
地址为0的地方放了 1110 0110 1110是op,代表M型即对主存操作,1110代表load
load含义是从主存中加载东西到寄存器里,这里默认寄存器是R0
但肯定没有这么简单,CPU里面的ALU等部件都还没说呢,先把指令放到IR(指令寄存器),然后进行指令译码,op显是1110,代表着load,然后1110 0110 前面是op,后面是地址码,把主存地址为:0110的内容先放到MDR(主存数据寄存器)中,然后再把PC+“1”,PC始终指向下一条执行指令所在的地址
最最最后,把MDR的内容放到了R0里,这里便是一条指令执行的详细过程
补充:指令执行的过程会产生一些控制信号,比如在执行取指令的时候,把主存地址为0的内容:1110 0110放到IR里,这其中就有一个Read的控制信号发送到主存,意为可读
上述肯定也有一些同学没有看懂,这边建议结合计算机系统基础教材来看,我会把书籍的电子版上传供大家免费下载