【深入理解计算机系统[2]】第一章 计算机系统漫游

第一章 计算机系统漫游

这章通过一个hello程序的生命周期开始对系统的学习。这章将会学习一些实践技巧,例如避免由计算机表示数字的方式导致的奇怪的数字错误;将会学习优化C代码的窍门,以充分利用处理器和存储器系统的设计;将了解到编译器是如何实现过程调用的,以及如何避免缓冲区溢出错误带来的安全漏洞;将会学习如何编写自己的Unix外壳、动态存储分配包、web服务器,认识到并发带来的希望和陷阱。

一、信息就是位+上下文

hello.c源程序:

#include <stdio.h>

int main()

{

printf(“hello,world\n”);

}

hello程序的生命周期从源程序开始,源程序是由01组成的(bit)序列。8个位被组织成一组,称为字节。每个字节表示程序中的某个文本字符,一般用ASCII标准来表示,即用一个唯一的单字节大小的整数值来表示每个字符。

hello程序以字节序列的方式存储在文件中,每个字节都有一个整数值。每个文本行都以一个不可见的换行符’\n’结束,对应整数值为10。只由ASCII字符构成的文件称为文本文件,其他文件都称为二进制文件。

基本思想:系统中所有信息——包括磁盘文件、存储器中的程序、存储器中存放的用户数据以及网络上传送的数据,都是由一串位表示的。区别不同数据对象的唯一方法是上下文。不同的上下文中,同样的字节序列可能表示一个整数、浮点数、字符串或者机器指令。

二、程序被其他程序翻译成不同格式

                        其他程序          按可执行目标程序格式打包,并以二进制磁盘文件存放

高级语言程序语句-------->机器语言指令------------------------------------>可执行目标文件

 

编译:gcc -o hello hello.c

编译系统如图所示:

 

·预处理阶段:预处理器根据以字符#开头的命令修改原始的C程序。以.i作为文件扩展名。

例如:#include<stdio.h>命令告诉预处理器读取系统头文件stdio.h的内容并插入到程序文本中,得到另一个C程序hello.i

·编译阶段:编译器将hello.i翻译成hello.s,包含一个汇编语言程序。

·汇编阶段:汇编器将hello.s翻译成机器语言指令,并将指令打包成可重定位目标程序的格式,将结果保存在hello.o中。hello.o是一个二进制文件,字节编码是机器语言指令而不是字符。

·链接阶段:链接器处理合并,得到可执行目标文件,可以被加载到内存中,由系统执行。

例如:hello程序中调用了printf函数,它是标准库里的函数,存在于一个printf.o的预编译好的目标文件中,链接器将这个文件合并到hello.o文件中,得到hello文件。

 

三、处理器读并解释存储在存储器中的指令

要在系统上运行可执行文件,将其文件名输入到外壳中:

unix> ./hello

hello,world

unix> 

外壳是一个命令行解释器,输出提示符,等待输入一个命令行,执行命令。

 

3.1 系统的硬件组成

 

CPU:中央处理单元。  ALU:算术/逻辑单元。  

PC:程序计数器。    USB:通用串行总线

 

1.总线

贯穿整个系统的一组电子管道。总线携带信息字节并负责在各个部件之间传递。通常总线传送定长的字节块(字)。字中的字节数是一个基本的系统参数。32位的字长是4个字节,64位的是8个字节。假设字长为4个字节,且总线每次只传送一个字。

 

2.I/O设备

系统与外部世界的联系通道。实例中包括键盘,鼠标,显示器,磁盘驱动器。每个I/O设备通过一个控制器或者适配器与I/O总线相连。控制器是主板上的芯片组,适配器是插在主板插槽上的卡,功能都是在I/O总线和I/O设备之间传递信息。

 

3.主存

临时存储设备,在处理器执行程序时,用来存放程序和程序处理的数据。主存是由一组动态随机存取存储器(DRAM)芯片组成的。存储器是一个线性的字节数组,每个字节都有唯一的地址(数组索引),地址从0开始。C程序变量对应的数据项的大小是根据类型变化的。例如32位机器上,short类型的数据需要2个字节,intfloatlong类型需要4个字节,double需要8个字节。

 

4.处理器(中央处理单元CPU

解释或执行存储在主存中指令的引擎。核心是一个字长的存储设备(寄存器),称为程序计数器(PC)。PC在任何时刻都指向主存中的某条机器语言指令(含有该条指令的地址)。从系统通电开始到断电期间,处理器不断地从PC指向的存储器处读取指令,解释指令中的位,执行指令指示的简单操作,再更新PC,使其指向下一条指令,下一条指令不一定与刚刚执行的指令相邻。

操作围绕主存、寄存器文件、算术/逻辑单元(ALU进行。寄存器文件是小的存储设备,由1字长的寄存器组成,每个寄存器都有唯一的名字。ALU计算新的数据和地址值。CPU可能会执行以下操作:

·加载:把一个字节或一个字从主存复制到寄存器,以覆盖寄存器原来的内容。

·存储:把一个字节或一个字从寄存器复制到主存的某个位置,以覆盖这个位置上原来的内容。

·操作:把两个寄存器的内容复制到ALU,ALU对这两个字做算术操作,并将结果存放到一个寄存器中,以覆盖寄存器原来的内容。

·跳转:从指令本身中抽取一个字,并将这个字复制到PC中,以覆盖PC中原来的值。

指令集结构描述的是每条机器代码指令的效果,微体系结构描述的是处理器是如何实现的。

 

 

3.2 运行hello程序

 

初始时,外壳程序执行它的指令,等待我们输入一个命令,当我们在键盘上输入字符串后,外壳程序将字符逐一读入寄存器,再把它存放到存储器中。

当我们敲回车键时,外壳知道我们已经结束了命令的输入,外壳执行一系列指令来加载可执行的hello文件,将文件中的代码和数据从磁盘复制到主存,数据包括最后输出的字符串(利用直接存储器存取DMA,数据可以不通过处理器而直接从磁盘到达主存)。当代码和数据被加载到主存,处理器开始执行hello程序的main程序中的机器语言指令,指令将字符串的字节从主存复制到寄存器文件,再从寄存器文件中复制到显示设备,最终显示在屏幕上。

 

四、处理器读并解释存储在存储器中的指令

 

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值