20135306黄韧 信息安全系统设计基础期中学习总结

信息安全系统设计基础第八周学习总结

知识点总结

第1计算机系统漫游

△计算机系统是由硬件和系统软件组成的,它们共同协作以运行应用程序。计算机内部的信息被表示为一组组的位.它们依据上下文有不同的解释方式。程序被其他程序翻译成不同的形式,开始时是ASCII文本.然后被编译器和链接器翻译成二进制可执行文件。
处理器读取并解释存放在主存里的二进制指令,因为计算机可以把大量的时间用于存储器、I/O设备和CPU寄存器之间复制数据,所以将系统中的存储设备划分成层次结构--CPU寄存器在顶部,接着是多层的硬件高速缓存存储器、DRAM主存和磁盘存储器在层次模型中,位于更高层的存储设备比低层的存储设备要更快,单位比特开销也更高。层次结构中较高层次存储设备可以作为较低层次设备的高速缓存。
操作系统内核是应用程序和硬件之间的媒介。
它提供三个基本的抽象:1)文件是对I/O的抽象;2)虚拟存储器是对主存和磁盘的抽象:3)进程是对处理器、主存抽象和I/O设备的设备最后,网络提供了计算机系统之间通信的手段。从特殊系统的角度来看,网络就是一种I/O设备。

第2信息的表示和处理

△计算机将信息按位编码,通常组织成字节序列。用不同的编码方式表示整数、实数和字符串。不同的计算机模型在编码数字和多字节数据中的字节排序时使用不同的约定。
C语言的设计可以包容多种不同字长和数字编码的实现。虽然高端机器逐渐开始使用64位字长,但是目前大多数机器仍使用32位字长。大多数机器对整数使用补码编码,而对浮点数使用IEEE浮点编码。在位级上理解这些编码,并且理解算术运算的数学特性,对于想使编写的程序能在全部数值范围上正确运算的程序员来说,是很重要的。
在相同长度的无符号和有符号整数之间进行强制类型转换时,大多数C语言实现遵循的原则是底层的位模式不变。在补码机器上,对于一个W位的值,这种行为是由函数T2Uw和U2Tw来描述的。

第3程序的机器级表示

△在本章中,我们窥视了C语言提供的抽象层下面的东西,以了解机器级编程。通过让编译器产生机器级程序的汇编代码表示,我们了解了编译器和它的优化能力,以及机器、数据类型和指令集。在第5章,我们会看到,当编写能有效映射到机器上的程序时,了解编译器的特性会有所帮助。我们还更完整地了解了程序如何将数据存储在不同的存储器区域中。在第12章会看到许多这样的例子,我们需要知道个程序变量是在运行时栈中,是在某个动态分配的数据结构中,是在某个全局存储位置中。理解程序如何映射到机器上,会让理解这些存储之间的区别容易些。
机器级程序和它们的汇编代码表示,与C程序的差别很大。在汇编语言程序中,各种数据类型之间的差别很小。程序是以指令序列来表示的,每条指令都完成一个单独的操作。部分程序状态,如寄存器和运行时栈,对程序员来说是直接可见的。本书仅提供了低级操作来支持数据处理和程序控制。编译器必须用多条指令来产生和操作各种数据结构,来实现像条件、循环和过程这样的控制结构。我们讲述了C语言和如何编译它的许多不同方面。我们看到C语言中缺乏边界检查,使得许多程序容易出现缓冲区溢出。虽然最近的运行时系统提供了安全保护,而且编译器帮助使得程序更安全,但是这已经使许多系统容易受到入侵者的恶意攻击。

第4处理器体系结构

△我们已经看到,指令集体系结构,即ISA,在处理行为和如何实现处理器之间提供了一层抽象。ISA提供了程序执行器行为的一种顺序说明,也就是一条指令执行完了,下一条指令才会开始。从IA32指令开始,大大简化数据类型、地址模式和指令编码,我们定义了Y86指令集。得到的ISA既有RISC指令集的属性,也有CISC指令集的属性。然后,将不同指令组织放到五个阶段中处理,在此,根据被执行指令的不同,每个阶段中的操作也不相同。据此,我们构造了SEQ处理器,其中每个时钟周期执行一条指令,它会通过所有五个阶段。
流水线化通过让不同的阶段并行操作,改进了系统的吞吐量性能。在任意一个给定的时刻:多条指令被不同的阶段处理。在引入这种并行性的过程中,我们必须非常小心,以提供与程序的顺序执行相同的程序级行为。通过重新调整SEQ各个部分的顺序,引入流水线,我们得到SEQ+,接着添加流水线寄存器,创建出PIIE―流水线。然后,添加了转发逻辑,加速了将结果从一条指令发送到另一条指令,从而提高了流水线的性能。有几种特殊情况需要额外的流水线控制逻辑来暂停或取消一些流水线阶段。
在本章中,我们学习了有关处理器设计的几个重要经验:
1.管理复杂性是首要问题,想要优化使用硬件资源,在最小的成本下获得最大的性能。为了实现这个目的,我们创建了一个非常简单而一致的框架,来处理所有不同的指令类型。有了这个框架,就能够在处理不同指令类型的逻辑中共享硬件单元。
2.我们不需要直接实现ISA。它的直接实现意味着一个顺序的设计。为了获得更高的性能我们想运用硬件能力以同时执行许多操作,这就导致要使用流水线化设计。通过仔细设计和分析,我们能够处理各种流水线冒险,因此运行一个程序的整体效果,同用ISA模型获得的效果完全一致。
3.硬件设计人员必须非常谨慎小心。一旦芯片制造出来,就几乎不可能改正任何错误了。开始就使设计正确是非常重要的。这就意味着要仔细地分析各种指令类型和组合,甚至那些看上去没有意义的情况,例如弹出值到栈指针。必须用系统的模拟测试程序彻底地测试设计。在开发PIPE的控制逻辑中,我们的设计有个细微的错误,只有通过对控制组合的仔细而系统的分析才能发现。

第6存储器层次结构

△基本存储技术包括随机存储器(RAM)、非易失性存储器(即OM)和磁盘。RAM有两种基本类型。静态RAM(SRAM)快一些,但是也贵一些,它既可以用做CPU芯片上的高速缓存,也可以用做芯片下的高速缓存。动态RAM(DRAM)慢一些,也便宜一些,用做主存和图形帧缓冲区。非易失性存储器,也称为只读存储器(ROM)即使是在关电的时候,也能保持它们的信息,它们用来存储固件。旋转磁盘是机械的非易失性存储设备,以每个位很低的成本保有大量的数据,但是访问时间比DRAM更长。固态硬盘(SSD基于非易失性的闪存,越来越变成旋转磁盘对某些应用的具有吸引力的替代产品。
一般而言,较快的存储技术每个位的价格会更高,而且容量较小。这些技术的价格和性能属性正在以显著不同的速度变化着。特别地,DRAM和磁盘访问时间远远大于CPU周期时间。系统通过将存储器组织成存储设备的层次结构来弥补这些差异,在这个层次结构中,较小、较快的设备在顶部,较大、较慢的设备在底部。因为编写良好的程序有好的局部性,大多数数据都可以从较高层得到服务,结果就是存储系统能以较高层的速度运行,但却有较低层的成本和容量。
程序员可以通过编写有良好空间和时间局部性的程序来显著地改进程序的运行时间。利用基于SRAM的高速缓存存储器特别重要。

实验操作

(一)Linux命令

1. man -k

  • man -k k1|grep k2|grep 2

2. cheat

  • 使用du命令对当前目录下的目录或文件按大小排序 的命令是du -sk *| sort -rn
  • To list the content of /path/to/foo.tgz archive using tar ( tar      -jtvf /path/to/foo.tgz )

3. grep

  • 使用grep查找当前目录下*.c中main函数在那个文件中的命令是grep      main *.c
  • grep -nr xxx/usr/include 查找宏
  • ~/test 文件夹下有很多c源文件,查找main函数在哪个文件中可用命令grep      main *.c

4. find

  • 查找当前目录下2天前被更改过的文件find . -mtime +2 -type f -print
  • 查找当前目录下所有目录的find命令是find . -type      d

(二)vi、gcc、gdb、make的使用

1. gcc库选项

  • static 进行静态编译,即链接静态库,禁止使用动态库
  • shared 1.可以生成动态库文件 2.进行动态编译,尽可能地链接动态库,只有当没有动态库时才会链接同名的静态库(默认选项,即可省略)
  • L dir 在库文件的搜索路径列表中添加dir      目录
  • lname 链接称为libname.a(静态库)或者libname.so(动态库)的库文件。若两个库都存在,则根据编译方式(-static 还是-shared)而进行链接
  • $ gcc –g gdb.c -o testgdb 使用gdb调试$ gdb testgdb 启动gdb键入 l命令相当于list命令,从第一行开始列出源码

2. gdb调试器

  • 查看文件: 在gdb 中键入“l”(list)就可以查看所载入的文件
  • 设置断点: 设置断点是调试程序中一个非常重要的手段,它可以使程序运行到一定位置时暂停。因此,程序员在该位置处可以方便地查看变量的值、堆栈情况等,从而找出代码的症结所在。在gdb 中设置断点非常简单,只需在“b”后加入对应的行号即可
  • 查看断点情况: 在设置完断点之后,用户可以键入“info      b”来查看设置断点情况
  • 运行代码: gdb 默认从首行开始运行代码,键入“r”(run)即可(若想从程序中指定行开始运行,可在r 后面加上行号)
  • 查看变量值: 在程序停止运行之后,程序员所要做的工作是查看断点处的相关变量值。在gdb 中键入“p”+变量值即可
  • 单步运行: 单步运行可以使用命令“n”(next)或“s”(step),它们之间的区别在于:若有函数调用的时候,“s”会进入该.数而“n”不会进入该函数。
  • (gdb) break 16 设置断点,在源程序第16行处。
  • (gdb) break func 设置断点,在函数func()入口处。
  • (gdb) info break 查看断点信息。

3. make

  • makefile的好处:自动化编译。make是一个命令工具,是一个及时makefile中命令的工具程序。make工具最主要也是最基本的功能就是根据makefile文件中描述的源程序至今的相互关系来完成自动编译、维护多个源文件工程。
  • Makefile的一般写法

test(目标文件): prog.o code.o(依赖文件列表)tab(至少一个tab的位置) gcc prog.o code.o -o test(命令)

4. vi

vi 有3 种模式,分别为命令行模式、插入模式及命令行模式。

(1)命令行模式

用户在用vi 编辑文件时,最初进入的为一般模式。在该模式中用户可以通过上下移动光标进行“删除字符”或“整行删除”等操作,也可以进行“复制”、“粘贴”等操作,但无法编辑文字。

(2)插入模式

只有在该模式下,用户才能进行文字编辑输入,用户按[ESC]可键回到命令行模式。

(3)底行模式

在该模式下,光标位于屏幕的底行。用户可以进行文件保存或退出操作,也可以设置编辑环境,如寻找字符串、列出行号等。

vi的基本流程

(1)进入vi,即在命令行下键入“vi hello”(文件名)。此时进入的是命令行模式,光标位于屏幕的上方

 

(2)在命令行模式下键入i 进入插入模式

 

(3)最后,在插入模式中,按“Esc”键,则当前模式转入命令行模式,并在底行行中.入“:wq”(存盘退出)进入底行模式

vi 的各模式功能键

命令行模式常见功能键

i 切换到插入模式,在目前的光标所在处插入输入的文字,已存在的文字会向后退

 

a 切换到插入模式,并从目前光标所在位置的下一个位置开始输入文字

 

o 切换到插入模式,且从行首开始插入新的一行

 

0(数字0) 光标移到本行的开头

 

G 光标移动到文件的最后

 

nG 光标移动到第n 行

 

$ 移动到光标所在行的“行尾”

 

n<Enter> 光标向下移动n 行

 

dd 删除光标所在行

 

ndd 从光标所在行开始向下删除n 行

 

yy 复制光标所在行

 

nyy 复制光标所在行开始的向下n 行

 

u 恢复前一个动作

插入模式常见功能键

插入模式的功能键只有一个,即按“Esc”键可回到命令行模式。

底行模式常见功能键

:w 将编辑的文件保存到磁盘中

 

:q 退出vi(系统对做过修改的文件会给出提示)

 

:q! 强制退出vi(对修改过的文件不作保存)

 

:wq 存盘后退出

 

:w [filename] 另存一个名为filename 的文件

 

:set nu 显示行号,设定之后,会在每一行的前面显示对应行号

 

:set nonu 取消行号显示

 

自己的收获

    第一次接触老师的这种授课方式刚开始的时候有些不适应,毕竟自己的计算机基础不好而且很难对计算机方面的课程产生兴趣,但是还是养成了积累循序渐进的习惯,掌握了一定的计算机系统及Linux指令知识, 这本《深入理解计算机系统》确实是本值得推荐的好书,基本上面面俱到,涉及到了目前所学习内容的方方面面,对任何一门专业课都能起到启蒙作用。其中最大的收获是提高实际操作能力的提高,能够将理论和实践形成统一。

自己的不足

  • 对有的难点问题没有一问到底,有的题只掌握了方法没有掌握原理,在学习过程中接受所学知识比较困难。
  • 没有及时复习,而且并没有很好地理解,看过的知识点会忘记,Linux命令还没有彻底掌握。
  • 编程方面还是有很大的问题,而且有问题问的不够及时,如果问题堆积的话会更不容易解决。

参考资料

  1. 教材《深入理解计算机系统》
  2. 每周测试答案解析 http://group.cnblogs.com/topic/73060.html
  3. 教材学习指导:http://group.cnblogs.com/topic/73069.html

 

posted @ 2015-11-01 15:36  黄伯伯  阅读(200)  评论(1编辑  收藏  举报