一、前言
试想一下,我们编辑好HelloWord程序,如果是C/C++语言编写,一般是一个.c或者.cpp的文件,这是一个文本文件,你一般会把它放在你的硬盘里面,难道不是吗?比如桌面、D、E盘下,那当我们打算运行HelloWord的时候计算机就需要加载这个文件,然后经过一系列的流程来执行我们所写的代码,今天要解释的就是这一系列的流程。
二、计算机系统硬件组成
上面这张图是Inter Pentium系列产品的模型,主要包括总线、I/O设备、主存、处理器这四个部分,下面详细解释着四个部分:
1、I/O设备
控制器或适配器与I/O总线相连。
控制器和适配器的相同与不同:相同是指他们都是用来I/O设备与计算机其他硬件(总线)进行数据信息传递用的,不同在于控制器是一个芯片组,内置于I/O设备或主板,而适配器是一块插在主板上的卡,如显卡。
2、总线
贯穿整个计算机硬件系统的一组电子管道,携带位信息或字节信息在计算机各个部件之间传递,但是总线一次能携带的位数或字节数是固定的,这称为总线宽度,如32为Windows系统总线宽度是4个字节,即32位信息。
3、主存
也就是我们所指的运行内存,注意与硬盘不同,一般是指内存条,它主要用来存储程序和程序处理的数据,以什么样的形式存储呢?这个后面会讲,现在一定要记住主存逻辑上是一个字节数组,什么是字节数组,首先它是一个数组,这个数组以字节为单位进行计算,如我们一般在C语言中定义的整数数组
int arr[10];
这表示一个含有10个整数的数组,每个整数有4个字节,对应来说,主存(内存)就是一个形如下面的数组
RAM_type RAM[N];
其中RAM_type是一个字节类型的数据类型,与char类似,在内存中占一个字节,RAM[N]表示主存数组,N为数组长度,即表示主存能包含多少个字节,那到底
N为多少呢?
它与总线宽度有关,如果按照上面说的总线宽度是32位,那么N = 4GB(2的32次方),也就是说主存数组的索引值从0到4GB-1,这就是指的主存的地址,怎么理解呢?要解释这个问题需要理解两个点:
(1)什么是机器指令?我们写的一行C语言代码与机器指令的关系?主存怎么存储机器指令?
机器指令肯定是机器能执行的一条命令,如读取内存中一个变量的值等;
一行C语言代码可能对应一条机器指令也可能是多条;
一般来说,组成程序的每条机器指令都由不同数量的字节构成,那刚好主车就是一个字节数组,一条机器指令可能存在主存中的一个字节中或者多个字节中。
(2)怎么理解总线宽度与主存数组长度相等?
程序计数器(PC),在任何时刻PC都指向内存中的一条指令,即可以理解为PC就是一个指向一条机器语言指令的指针,指针的值就是这条指令在主存中的地址(索引值),最重要的一点就是PC的容量是一个字(4个字节),所以
PC = 总线宽度 = 主存(数组)长度
现在再来理解总线宽度与主存数组长度相等,最重要的是你要理解内存寻址的意思,PC和总线宽度都是32位,则可以把总线理解为32根地址线,那32根地址线最多能寻址的范围是多少呢?那就是4GB啊,难道不是吗?如果是2根地址线,能寻址的范围是0(二进制00)~4(二进制11),所以主存数组长度就是 与总线宽度相等。
另外,这也说明了Windows 32位系统最多能识别4GB的内存,就算你安装8GB的内存条,它也只能用4GB
4、处理器
处理器即计算机中央处理单元(CPU),它主要用来解释(或执行)存储在主存中指令的引擎,上面也说明了处理器的核心是一个字长的存储设备,即PC(程序计数器),但同时处理器还包括寄存器文件(一组长度为字长的寄存器)、算术逻辑单元ALU(主要计算新的数据和地址值),CPU在指令要求下一般会执行以下这些命令:
(1)加载:从主存到寄存器,把一个字节或者一个字从主存复制到寄存器文件,以覆盖寄存器原来的内容;
(2)存储:从寄存器到主存;
(3)操作:先寄存器到算术逻辑单元ALU进行计算,然后结果再从ALU到寄存器;
(4)跳转:主存到PC,用于更新PC的值。
三、后记
这些理解首先来自于《深入理解计算机系统》,其次是网上的一些博客,再加上自己的一些理解,整理出来,作为共享,希望大家批评指正。确实,作为一个想写代码的程序员,由于前期知识扩展不够,知识面不广,在大致阅读了《深入理解计算机系统》这本书之后,发现计算机系统的确实蛮有意思的,而且和程序的编写与运行有千丝万缕的联系,其实这也是废话,哈哈,程序本来是由计算机来执行的嘛,当然有联系了,后面还会继续深入,坚持总结、更新博文。