首页 > 代码库 > 2017/05/05学习笔记

2017/05/05学习笔记

系统中所以的信息包括磁盘文件、内存中的程序、内存中存放的用户数据及网络上传送的数据都是由一串bit表示的。区分不同数据对象的唯一方法是我们读到这些数据对象时的上下文。
为了在C程序中做出好的编码选择,我们确实需要了解一些机器代码以及编译器将不同的C语句转化为机器代码的方式。
比如一个switch是否总是比一个if-else语句高效的多?
一个函数调用的开销有多大?
while循环比for循环更有效么?
指针引用比数组索引更有效么为什么将循环求和的结果放到一个本地变量中,会比其放到一个通过引用传递过来的参数中,运行起来快很多呢?
为什么我们只是简单地重新排列一下算术表达式中的括号就能让函数运行的更快?
一些最令人困扰的程序错误往往都与链接器操作有关,尤其是当你试图建立大型软件系统时,比如
链接器报告说他无法解析一个引用,这是什么意思?
静态变量和全局变量的区别是什么?
如果你在不同的C文件中定义了名字相同的两个全局变量会发生什么?
静态库和动态库区别是什么?
缓冲区溢出错误是造成大多数网络和Internet服务器上安全漏洞的主要原因.
学习安全编程的第一步就是理解数据和控制信息存储在程序栈上的方式会引起的后果.

系统的硬件组成

为了理解运行hello程序是发生了什么,我们需要了解一个典型系统的硬件组织。

总线

贯穿整个系统的是一组电子管道,称作总线,它携带信息字节并负责在各个部件间传递。通常总线被设计成传送定长的字节块,也就是字。字中的字节数是一个基本的系统参数,各个系统中都不尽相同。现在大多机器字长要么是4字节,要么是8字节

IO设备

IO设备是系统和外部世界联系的通道。键盘鼠标显示器,以及用于长期存储数据和程序的磁盘驱动器。最开始,可执行程序hello就存放在磁盘上。
每个IO设备都通过一个控制器或适配器与IO总线相连。控制器和适配器的区别主要在于它们封装的方式。控制器是IO设备本身或系统的主印制电路板上的芯片组。而适配器是一块在主板插槽的卡。无论如何,它们的功能都在IO总线和IO设备间传递数据。

主存

主存是一个临时存储设备,在处理器执行程序时,用来存放程序和程序处理的数据。从物理上来说,主存是由一组动态随机存取存储器芯片组成。从逻辑上来说,存储器是一个线性的字节数组,每个字节都有其唯一的地址,这些地址是从0开始的。一般来说,组成程序的每条机器指令都由不同数量的字节构成。与C程序变量相对应的数据项的大小是根据类型变化的。

处理器

中央处理单元,是解释存储在主存中指令的引擎。处理器的核心是一个大小为一字节的存储设备,称为程序计数器。在任何时候,PC都指向主存中的某条机器语言指令(即含有该条指令的地址)。
从系统通电开始,直到系统断电,处理器一直不断地执行程序计数器指向的指令,再更新程序计数器,使其指向下一条指令。处理器看上去是按照一个非常简单的指令执行模型来操作的,这个模型是由指令集架构来决定的。在这个模型中,指令按照严格的顺序执行,而执行一条指令包含执行一系列的步骤。处理器从程序计数器指向的内存读取指令,解释指令中的位,执行该指令指示的简单操作,然后再更新程序计数器,使其指向下一条指令,而这条指令并不一定和在内存中刚刚执行的指令相邻。
这样的操作并不多,它们围绕着主存 寄存器文件和算术、逻辑单元进行。寄存器文件是一个小的存储设备,由一些单个字长的寄存器组成,每个寄存器都有唯一的名字,ALU计算新的数据和地址值。
加载:从主存复制一个字节或一个字到寄存器,以覆盖寄存器原来的内容。
存储:从寄存器复制一个字节或一个字到主存的某个位置,以覆盖这个位置上原来的内容。
操作:把两个寄存器的内容复制到ALU,ALU磁这两个字做算术运算,将结果存放到一个寄存器中,以覆盖原来寄存器中的内容。
跳转:从指令本身中抽取一个字,并将这个字复制到程序计数器中,以覆盖程序计数器中原来的值

技术分享

2017/05/05学习笔记