信息安全系统设计基础第八周期中总结
信息安全系统设计基础第八周学习总结
知识点总结
第1章 计算机系统漫游
- 1.1 信息就是位十上下文
- 1.2 程序被其他程序翻译成不同的格式
- 1.3 了解编译系统如何工作是大有益处的
- 1.4 处理器读并解释储存在存储器中的指令
- 1.5 高速缓存
- 1.6 形成层次结构的存储设备
- 1.7 操作系统管理硬件
- 1.8 利用网络系统和其他系统通信
- 1.9 下一步
- 1.10 小结
计算机系统是由硬件和系统软件组成的,它们共同协作以运行应用程序。计算机内部的信息被表示为一组组的位.它们依据上下文有不同的解释方式。程序被其他程序翻译成不同的形式,开始时是ASCII文本.然后被编译器和链接器翻译成二进制可执行文件。
处理器读取并解释存放在主存里的二进制指令,因为计算机可以把大量的时间用于存储器、I/O设备和CPU寄存器之间复制数据,所以将系统中的存储设备划分成层次结构--CPU寄存器在顶部,接着是多层的硬件高速缓存存储器、DRAM主存和磁盘存储器在层次模型中,位于更高层的存储设备比低层的存储设备要更快,单位比特开销也更高。层次结构中较高层次存储设备可以作为较低层次设备的高速缓存。
操作系统内核是应用程序和硬件之间的媒介。
它提供三个基本的抽象:1)文件是对I/O的抽象;2)虚拟存储器是对主存和磁盘的抽象:3)进程是对处理器、主存抽象和I/O设备的设备最后,网络提供了计算机系统之间通信的手段。从特殊系统的角度来看,网络就是一种I/O设备。
第2章 信息的表示和处理
- 2.1 信息存储
- 2.2 整数表示
- 2.3 整数运算
- 2.4 浮点
- 2.5 小结
计算机将信息按位编码,通常组织成字节序列。用不同的编码方式表示整数、实数和字符串。不同的计算机模型在编码数字和多字节数据中的字节排序时使用不同的约定。
C语言的设计可以包容多种不同字长和数字编码的实现。虽然高端机器逐渐开始使用64位字长,但是目前大多数机器仍使用32位字长。大多数机器对整数使用补码编码,而对浮点数使用IEEE浮点编码。在位级上理解这些编码,并且理解算术运算的数学特性,对于想使编写的程序能在全部数值范围上正确运算的程序员来说,是很重要的。
在相同长度的无符号和有符号整数之间进行强制类型转换时,大多数C语言实现遵循的原则是底层的位模式不变。在补码机器上,对于一个W位的值,这种行为是由函数T2Uw和U2Tw来描述的。
第3章 程序的机器级表示
- 3.1 历史观点
- 3.2 程序编码
- 3.3 数据格式
- 3.4 访问信息
- 3.5 算术和逻辑操作
- 3.6 控制
- 3.7 过程
- 3.8 数组分配和访问
- 3.9 异类的数据结构
- 3.10 对齐(alignment)
- 3.11 综合:理解指针
- 3.12 现实生活:使用gdb调试器
- 3.13 存储器的越界引用和缓冲区溢出
- 3.14 *浮点代码
- 3.15 *在c程序中嵌入汇编代码
- 3.16 小结
在本章中,我们窥视了C语言提供的抽象层下面的东西,以了解机器级编程。通过让编译器产生机器级程序的汇编代码表示,我们了解了编译器和它的优化能力,以及机器、数据类型和指令集。在第5章,我们会看到,当编写能有效映射到机器上的程序时,了解编译器的特性会有所帮助。我们还更完整地了解了程序如何将数据存储在不同的存储器区域中。在第12章会看到许多这样的例子,我们需要知道个程序变量是在运行时栈中,是在某个动态分配的数据结构中,是在某个全局存储位置中。理解程序如何映射到机器上,会让理解这些存储之间的区别容易些。
机器级程序和它们的汇编代码表示,与C程序的差别很大。在汇编语言程序中,各种数据类型之间的差别很小。程序是以指令序列来表示的,每条指令都完成一个单独的操作。部分程序状态,如寄存器和运行时栈,对程序员来说是直接可见的。本书仅提供了低级操作来支持数据处理和程序控制。编译器必须用多条指令来产生和操作各种数据结构,来实现像条件、循环和过程这样的控制结构。我们讲述了C语言和如何编译它的许多不同方面。我们看到C语言中缺乏边界检查,使得许多程序容易出现缓冲区溢出。虽然最近的运行时系统提供了安全保护,而且编译器帮助使得程序更安全,但是这已经使许多系统容易受到入侵者的恶意攻击。
第4章 处理器体系结构
- 4.1 y86指令集体系结构
- 4.2 逻辑设计和硬件控制语言hcl
- 4.3 y86的顺序(sequential)实现
- 4.4 流水线的通用原理
- 4.5 y86的流水线实现
- 4.6 小结
我们已经看到,指令集体系结构,即ISA,在处理行为和如何实现处理器之间提供了一层抽象。ISA提供了程序执行器行为的一种顺序说明,也就是一条指令执行完了,下一条指令才会开始。从IA32指令开始,大大简化数据类型、地址模式和指令编码,我们定义了Y86指令集。得到的ISA既有RISC指令集的属性,也有CISC指令集的属性。然后,将不同指令组织放到五个阶段中处理,在此,根据被执行指令的不同,每个阶段中的操作也不相同。据此,我们构造了SEQ处理器,其中每个时钟周期执行一条指令,它会通过所有五个阶段。
流水线化通过让不同的阶段并行操作,改进了系统的吞吐量性能。在任意一个给定的时刻:多条指令被不同的阶段处理。在引入这种并行性的过程中,我们必须非常小心,以提供与程序的顺序执行相同的程序级行为。通过重新调整SEQ各个部分的顺序,引入流水线,我们得到SEQ+,接着添加流水线寄存器,创建出PIIE―流水线。然后,添加了转发逻辑,加速了将结果从一条指令发送到另一条指令,从而提高了流水线的性能。有几种特殊情况需要额外的流水线控制逻辑来暂停或取消一些流水线阶段。
在本章中,我们学习了有关处理器设计的几个重要经验:
- 管理复杂性是首要问题,想要优化使用硬件资源,在最小的成本下获得最大的性能。为了实现这个目的,我们创建了一个非常简单而一致的框架,来处理所有不同的指令类型。有了这个框架,就能够在处理不同指令类型的逻辑中共享硬件单元。
- 我们不需要直接实现ISA。它的直接实现意味着一个顺序的设计。为了获得更高的性能我们想运用硬件能力以同时执行许多操作,这就导致要使用流水线化设计。通过仔细设计和分析,我们能够处理各种流水线冒险,因此运行一个程序的整体效果,同用ISA模型获得的效果完全一致。
- 硬件设计人员必须非常谨慎小心。一旦芯片制造出来,就几乎不可能改正任何错误了。开始就使设计正确是非常重要的。这就意味着要仔细地分析各种指令类型和组合,甚至那些看上去没有意义的情况,例如弹出值到栈指针。必须用系统的模拟测试程序彻底地测试设计。在开发PIPE的控制逻辑中,我们的设计有个细微的错误,只有通过对控制组合的仔细而系统的分析才能发现。
第6章 存储器层次结构
- 6.1 存储技术
- 6.2 局部性
- 6.3 存储器层次结构
- 6.4 高速缓存存储器
- 6.5 编写高速缓存友好的代码
- 6.6 综合:高速缓存对程序性能的影响
- 6.7 综合:利用程序中的局部性
- 6.8 小结
基本存储技术包括随机存储器(RAM)、非易失性存储器(即OM)和磁盘。RAM有两种基本类型。静态RAM(SRAM)快一些,但是也贵一些,它既可以用做CPU芯片上的高速缓存,也可以用做芯片下的高速缓存。动态RAM(DRAM)慢一些,也便宜一些,用做主存和图形帧缓冲区。非易失性存储器,也称为只读存储器(ROM)即使是在关电的时候,也能保持它们的信息,它们用来存储固件。旋转磁盘是机械的非易失性存储设备,以每个位很低的成本保有大量的数据,但是访问时间比DRAM更长。固态硬盘(SSD基于非易失性的闪存,越来越变成旋转磁盘对某些应用的具有吸引力的替代产品。
一般而言,较快的存储技术每个位的价格会更高,而且容量较小。这些技术的价格和性能属性正在以显著不同的速度变化着。特别地,DRAM和磁盘访问时间远远大于CPU周期时间。系统通过将存储器组织成存储设备的层次结构来弥补这些差异,在这个层次结构中,较小、较快的设备在顶部,较大、较慢的设备在底部。因为编写良好的程序有好的局部性,大多数数据都可以从较高层得到服务,结果就是存储系统能以较高层的速度运行,但却有较低层的成本和容量。
程序员可以通过编写有良好空间和时间局部性的程序来显著地改进程序的运行时间。利用基于SRAM的高速缓存存储器特别重要。
第7章 链接
-
- 1 编译器驱动程序
-
- 2 静态链接
-
- 3 目标文件
-
- 4 可重定位目标文件
-
- 5 符号和符号表
-
- 6 符号解析
-
- 7 重定位
-
- 8 可执行目标文件
-
- 9 加载可执行目标文件
-
- 10 动态链接共享库
-
- 11 从应用程序中加载和链接共享库
-
- 12 与位置无关的代码(pic)
-
- 13 处理目标文件的工具
-
- 14 小结
链接可以在编译时由静态编译器来完成,也可以在加载时和运行时由动态链接器来完成。链接器处理称为目标文件的二进制文件,它有三种不同的形式:可重定位的、可执行的和共享的,可重定位的目标文件由静态链接器合并成一个可执行的目标文件,它可以加载到存储器中并执行。
链接器的两个主要任务是符号解析和重定位,符号解析将目标文件中的每个全局符号都绑定到一个唯一的定义,而重定位确定每个符号的最终存储器地址,并修改对那些目标的引用。
静态链接器是由像gcc这样的编译驱动器调用的。它们将多个可重定位目标文件合并成个单独的可执行目标文件。多个目标文件可以定义相同的符号,而链接器用来悄悄地解析这些多重定义的规则可能在用户程序中引入的微妙错误。多个目标文件可以被连接到一个单独的静态库中。链接器用库来解析其他目标模块中的符号引用,许多链接器通过从左到右的顺序扫描来解析符号引用,这是另一个引起令人迷惑的链接时错误的来源。加载器将可执行文件的内容映射到存储器,并运行这个程序。链接器还可能生成部分链接的可执行目标文件,这样的文件中有对定义在共享库中的程序和数据的未解析的引用在加载时加载器将部分链接的可执行文件映射到存储器,然后调用动态链接器,它通过加载共享库和重定位程序中的引用来完成链接任务。被编译为位置无关代码的共享库可以加载到任何地方,也可以在运行时被多个进程共享,为了加载、链接和访问共享库的函数和数据,应用程序还可以在运行时使用动态链接器。
重点
- 复习Linux命令,特别是man -k, cheat, grep -nr xxx /usr/include
- 复习vi, gcc, gdb,make的使用
- 复习教材内容ch01 ch02 ch03 ch04 ch06 ch07
- 复习前面的考题(答案解析见http://group.cnblogs.com/topic/73060.html)
自己的收获
- 学会了使用markdown。它的格式简单,即使在纯文本模式下也很易读。而且应用广泛,在博客园中可以使用,听说有些老师用markdown批改作文很方便。工具和库的支持也很好。
- 学会了安装使用虚拟机和简单的Linux系统操作。
- 感觉教材有难度,但是也没有想象中需要那么多的基础,很多内容都是可以看得懂的,需要的是耐心和反复读,这真的是一本很考验耐心的书......
- 最近的学习是从学习计算机本身开始探索计算机系统。计算机由处理器和存储器子系统组成。在核心部分,学会表示基本数据类型,比如整数和实数运算的近似值。然后,学会了应该考虑机器级指令如何操作这样的数据,以及编译器如何将C程序翻译成这样的指令。接下来,几种实现处理器的方法,使我们更好地了解硬件资源是如何被用来执行指令。理解了编译器和机器级代码,能使我们通过编写最高性能的C程序,来分析如何最大化程序的性能。这部分学习领着我们深入了解如何表示和执行应用程序。学会了帮助我们写出安全、可靠且充分利用计算资源的程序的技巧。
- 总的来说,学习了以下内容。第一章对计算机系统总体的做了一个简单的介绍。第二章主要说的是信息在计算机中的表示形式,包括整数和浮点数的表示形式。第三章是汇编语言的复习,过程调用,尤其是过程调用(包括递归调用)中堆栈的使用情况是重点。还有数据在内存中的对齐方式。第四章是计算机体系结构的内容,处理器结构,各种逻辑门、功能单元,指令集,指令的执行指令执行的流水线等。第六章详细介绍了计算机系统中的存储结构。不同种类的存储设备以及对应的存取数据的方式,存储设备的组织形式,Cache及其工作方式。第七章详细介绍了程序的链接过程,主要分为静态链接和动态链接,以及链接过程中使用到的技术。
自己的不足
- 对有的难点问题没有一问到底,有的题只掌握了方法没有掌握原理。
- 没有及时复习,看过的知识点会忘记。Linux命令还没有彻底掌握。
- 有问题问的不够及时,如果问题堆积的话会更不容易解决。
课程建议和意见
我曾经在博客里写希望老师能在我们自学前点拨一下,所以听到这星期三老师说以后几章的学习老师会先讲课再让我们练习的时候真的很开心。能理解老师说的软知识需要自己掌握。没有别的建议了。
参考资料
- 教材《深入理解计算机系统》
- 每周测试答案解析 http://group.cnblogs.com/topic/73060.html
- 教材学习指导:http://group.cnblogs.com/topic/73069.html
- 课程资料:https://www.shiyanlou.com/courses/413 实验,课程邀请码:W7FQKW4Y
- 教材中代码运行、思考一下,读代码的学习方法:http://www.cnblogs.com/rocedu/p/4837092.html。