信息安全系统设计基础第八周期中总结

信息安全系统设计基础第八周期中总结

【学习时间:12小时】

【学习内容:CHAPTER1——CHAPTER7内容重点;疑问与考试错题分析;实验环节难点回顾】

一、课本章节内容重点

(一)第一章

1.信息就是“位+上下文”。

【理解:信息本身的表示形式是相对固定的,在linux系统内(以及其他的操作系统内),操作信息、数据信息等都是以二进制形式存储的;这些二进制位如何理解、怎么划分,是靠上下文的要求决定的。二者联系起来组成了“信息”的概念。】

2.系统的硬件组成

  • 总线:携带信息字节并负责在各个部件之间传递;定长的字节块,即字。字中的字节数(即字长)是一个基本的系统参数。
  • I/O设备
  • 主存,由一组DRAM组成

3.操作系统两个基本功能:防止硬件被失控的应用程序滥用;向应用程序提供简单一致的机制来控制复杂的低级硬件设备

4.操作系统三个基本抽象:文件<--I/O设备;虚拟存储器<--主存,磁盘I/O设备;进程<--处理器,主存,I/O设备

(二)第二章

5.gcc -m32 可以在64位机上生成32位的代码

6.字节顺序的两种表示方法:小端是“高对高、低对低”,大端与之相反

7.整数表示:负数-1在补码编码中,和Umax的编码一样(每位都是1)

8.几乎所有的机器都使用补码;通常,大多数数字都默认为有符号.然而,在一个运算式中,如果有一个参数是无符号的 ,那么另外一个也会默认为无符号数

9.数字截断:将一个w位的数丢弃前k位得到的数字(二进制)为:2^w mod 2^k,有可能发生溢出.

10.补码的非:除了x=-2^(w-1)和0的非是他们本身之外,其他数字的非(加法逆元)都可以通过2^w-x获得。

11.C语言中,有符号数字的乘法是通过将2w位截断为w位的方式来实现的。即:xy - U2T((xy)mod 2 ^w)

【难点:可以理解为,两个补码表示的数字,将它们的二进制表示的无符号数相乘得到的结果截取前w位;这样得到的结果和无符号数乘法的结果一致】

12.对于负数除以2^k,我们可以用“偏置”来修正不合适的舍入:利用x/y=(x+y-1)/y

13.浮点数构造

IEEE浮点标准——用V= (-1)^sM2^E来编码一个数。其中:

符号:s决定这个数是负数(s=1)还是正数(s=0),对于数值是0的符号位解释为特殊情况。

尾数:M是一个二进制小数。

阶码:E对浮点数加权,可以是负数。

【难点:如何把一个十进制数字转化成浮点数?

步骤:将原数用二进制表示出来,左移小数点n位得到规格化表示;将小数点左侧的部分补0构造小数字段;用偏置量加上n得到的结果用二进制表示出来得到阶码位,前面加上一位的符号位,组合起来即可】

(三)第三章

14.gcc -S xxx.c 可以得到C语言编译器产生的汇编代码,但不会做其他工作;使用“-c”命令,GCC就会编译并汇编该代码,得到二进制文件XXX.o。

15.寻址方式的通用公式:有效地址可以表示为Imm+R[Eb]+R[Ei]*s。Imm为立即数偏移;Eb为基址寄存器;Ei为变址寄存器;s为比例因子。如:

1)Ea——操作数值:R[Ea]

2)(Ea)——操作数值:M(R[Ea])【难点:这里的意思是说,需要将这个存储单元中的内容作为地址进行寻址】

3)Imm(Ea)——操作数值:M(Imm+R[Ea])

16.SUB S,D——将D-S的结果送至D

17.SET类指令根据t=a-b的结果所设置的条件码来将一个字节(目的操作数)设置为0或者1

18.IA32利用程序栈来支持过程调用(包括将数据和控制)。为单个过程分配的那部分栈做栈帧。最底端(地址最大)%ebp为帧指针;最顶端(地址最小)%esp为栈指针。当程序执行时,栈指针可以移动。

19.转移控制——

1)call指令:后接被调用过程的起始的指令地址。效果是将返回地址入栈,并跳转到被调用过程的起始处。

2)ret指令:从栈中弹出地址,并跳转到这个位置。

【难点:如何理解?

二者配合,实现函数调用时的衔接:即,call类似于先行的探险者,将迷宫入口处的地址存到某个安全的地方,然后探索迷宫(函数);ret类似于保障人员,在探险完成之后将该地址取出来,带领程序回到最初的入口处,接着走大路(主程序)】

(四)

20.Y86

一个简单的、可以称之为IA32指令集的子集的指令集;只包括四字节整数操作,寻址方式比较少。指令编码长度从1——6字节不等。指令集的一个重要性只就是字节编码必须具有唯一的解释。

关于指令结构,每条指令的第一个字节表明指令的类型;这个字节分为两个部分,每部分四位:高四位是代码部分(0——0xB),第四位是功能部分。这里补充一些缩写:立即数(i),寄存器(r)、存储器(m)。指令附加的寄存器指示符字节依次是数据源(如果是立即数,把这一位设置成0xf)、目的寄存器/基址寄存器。有些指令需要附加四字节的常数字,采用小端法(倒序)编码

21.pushl会把栈指针减4,并将一个寄存器值写入存储器中。因此,执行pushl %esp 和 popl %esp的结果是不固定的。

22.处理操作的阶段——

  • 取指:从寄存器读取指令字节,地址为程序计数器的值。计算下一条指令地址等于PC中的值加上已取出指令的长度;
  • 译码:从寄存器文件中最多读出两个操作数,它读入指令rA和rB指明的寄存器,不过有些是读寄存器%esp的;
  • 执行:ALU执行指明的操作、引用的有效地址或者是修改栈指针,得到的值称为valE;
  • 访存:将数据写入存储器或者从存储器读出数据,读出的数据叫做valM;
  • 写回:写两个结果到寄存器文件;
  • 更新PC:将PC设置成下条指令地址。

23.关于一些指令的执行阶段的说明

  • OPI,rrmovl,irmovl指令在访存阶段是不做操作的;此外,irmovl因为是长指令格式,所以PC要加6;
  • rmmovl,mrmovl在访存阶段要将寄存器值valA吸入存储器或者从存储器中读出valM
  • call指令和ret指令与popl和pushl类似;对于call指令来说,要将valP(紧跟call之后那条指令的地址)压入栈中

24.SEQ的时序(逐步深化)

  • 要控制处理器中活动的时序,只需要寄存器和存储器的时钟控制
  • 除了指令存储器只用来读指令故而可以看作组合逻辑之外,剩余的程序计数器、条件码寄存器、数据存储器和寄存器文件需要通过一个时钟信号来控制(控制时序)
  • 在每个时钟周期内,程序计数器都会装载新的指令地址;只有执行整数运算指令的时候,才会装载条件码寄存器。只有执行rmmovl,pushl,call时,才会写数据存储器。
  • Y86指令集的本质遵循这样一项组织原则:处理器从来不需要为了完成一条指令的执行而去读由该指令更新了的状态 【如何理解?也就是说,处理器所“经手”的指令中,如果有某些是可以改变机构状态的;那么一定先改变状态之后再执行指令。这样保证了操作的时序性(防止指令执行起来互相颠倒)】

(三)第六章

25.关于DRAM

  • DRAM的芯片中的单元被分成d个超单元,每个超单元都由w个DRAM单元组成。一个d*w的DRAM总共存储了dw位的信息。超单元被组织成一个r行c列的长方形阵列,这里rc = d。信息通过引脚的外部连接器流入和流出芯片。
  • 每个DRAM芯片被连接到某个称为存储控制器的电路,这个电路可以一次传送w位到每个DRAM芯片或者依次从每个芯片传出w位。电路设计者将DRAM组织成二维而不是线性数组的一个原因是降低芯片上地址引脚的数量。

26.数据流通过总线的共享电子电路在处理器和DRAM之间来回;包括读事务(从主存到CPU)和写事务。总线是一股并行的线,可以携带数据、控制信号和地址(数据总线,地址总线,控制总线)。

27.磁盘结构

  • 磁盘是保存大量数据的存储设备;但读取速度慢。
  • 磁盘有若干盘片组成,密封在容器(磁盘驱动器)内;每个盘片的两个表面都有一组被称为磁道的同心圆;每个同心圆由一些间隙分隔成一组等容量磁道(通常是512字节),间隙中存储的是标识扇区的格式化位。
  • 柱面:所有盘片表面到主轴中心距离相等的磁道的集合

28.对扇区的访问主要有三个部分:

- 寻道:将读写头定位到包含目标扇区的磁道上。Tseek取决于它以前的位置和传动臂在盘面上的移动速度。时间通常为3——9ms。
- 旋转:一旦读写头定位到了期望的磁道,驱动器等待目标扇区的第一个位旋转到读写头下面。平均旋转时间是最大时间(等磁盘旋转一圈)
- 传送:驱动器开始写或者读扇区的内容;时间长短取决于旋转速度和每条磁道的扇区数目。平均时延为 Tavg=1/RPM*1/(平均扇区数/磁道)*60secs/1min
- 补充:访问一个磁盘扇区的512字节的主要时间在于寻道和旋转延迟。访问时间:磁盘>DRAM>SRAM

29.CPU使用一种称为存储器映射I/O的技术来向I/O设备发出命令的。在使用其的系统中,地址空间中,有一块地址是为与I/O设备通信保留的;叫做I/O端口

30.存储器层次结构的中心思想是:对于每个k,位于k层的更快更小的存储设备作为位于(k+1)层的更大更慢的存储设备的缓存。

31.高速缓存存储器(S,E,B,m)

  • 每个存储器地址有m位,形成M=2^m个不同地址。这m位被划分成t个标记位、s个组索引位和b个块偏移位。
  • 这样一个机器的高速缓存被组织成S=2^s个高速缓存组的数组;每个数组包含E个高速缓存行;每行由一个B=2^b字节的数据块、一个有效位(指明这个行是否包含有效信息)、t=m-(b+s)个标记位(唯一标识存储在这个高速缓存行中的块)组成
  • 高速缓存的大小为C=SEB

【理解:从高向低来看,M=2^m个地址平均分给S=2^s个组,每组获得2^(m-s)个地址,即(m-s)位;减去t位用于标记块,还有2^(m-t-s)个地址可以表示一个块,也就是说,一个块可以有2^(m-t-s)个字节的信息】

32.术语“抖动”描述的是:即,高速缓存反复地加载和驱逐相同的高速缓存块的组——解决办法之一就是在每个数组末尾加上若干字节的填充。

二、疑问与考试错题分析

(一)疑问反馈

1.这里对gcc helloprint.c hellomain.c –o hello的解释中,最后一个命令的意思是什么?(猜测:是否是将这两个.o文件转换为一个可执行的,名称为hello的文件?)

【解释:是这样的,可以参见下方的步骤分解。】

2.P63:

通过类似的推理,我们可以得出,对于一个位模式为[x(w-1),x(w-2),……,0,……,0]的补码数x,以及在0<=k<=w范围内的任一k,位模式为[x(w-k-1),x(w-k-2),……,0,……,0]就是x*2^k的补码表示

为什么截断前面的k位、后面补上0之后,就是一个乘式结果的补码表示?

【解释:这里就包括了溢出(即得不到正确结果)的可能性。就是说,这样操作得到的结果和实际去乘得到的结果一样。】

3.P66练习题2.42

写一个函数div16,对任何整数参数,返回x/16的值。不能使用四则运算和任何条件运算符、比较运算符。(假设你的机器是32位,使用补码表示,右移都是算术右移)

int div16(int x)
{
    int bias = (x>>31)&0xf;//如果是负数,bias就会变成f
    return (x+bias)>>4;
}

不太理解如何证明负数运算时,加上bias(即f)之后就可以直接右移四位?

【假设x是负数,则加上bias=15之后,就相当于(x+16-1)/16,达到了偏置的效果。】

4.既然leal是mov的变形,那么所有可以用leal的场合都可以用mov吗?

【二者还是有区别的;leal指令是将有效地址直接写到目的寄存器。】

5.P383

有些系统也使用纠错码,其中计算机的字会被多编码几个位(例如,32位的字可能用38位来编码),这样一来,电路可以发现并纠正一个字中任何单个的错误位。

并不明白,这样前后有什么因果关系?

【由娄老师进行解释:奇偶校验码即典型应用。】

【补充解释:奇偶校验可描述为:给每一个码字加一个校验位,用它来构成奇性或偶性校验。可以看出,附加码元d2,是简单地用来使每个字成为偶性的。因此,若有一个码元是错的,就可以分辨得出,因为奇偶校验将成为奇性。奇偶校验编码通过增加一位校验位来使编码中1个个数为奇数(奇校验)或者为偶数(偶校验),从而使码距变为2。】

6.P402

另一方面,因为sum是标量,对于sum来说,没有空间局部性。

为什么标量没有空间局部性?(如果一个存储位置被引用了一次,那么程序很可能在不远的将来被引用附近的一个存储器位置)

【解释:就是因为标量只会引用它本身,而不涉及附近位置的量。与此相反,数组等向量就可以很好地体现空间局部性。】

7.P403

图6-20中

int sumaraycols(int a[M][N])
{    
    ……
    for(i=0;i<N;j++)
        for(j=0;j<M;j++)
            sum+=a[i][j];
    ……
}

这里,为什么是"i<N","j<M"?是不是应该对调一下变成"i<M","j<N"?

【这里我参考了影印版《深入理解计算机系统》,确认此处就是"i<M","j<N"。】

8.P253

图4-19显示了rmmovl和mrmovl在顺序实现中的计算。其中在访存阶段,会将寄存器值valA写到存储器,或者从存储器中读出valM。

为什么要有这个步骤呢?看似并无必要。

【娄老师解释:这两个指令的功能:rmmovl把寄存器的值写到内存,mrmove把内存中的数据写到寄存器,实现上很重要的步骤就是将寄存器值valA写到存储器,或者从存储器中读出valM,没这两个步骤就不能实现两个指令的功能,是很有必要的。 】

9.P249

下面的图展示了一个典型的寄存器文件:……寄存器文件有两个读端口,还有一个写端口。

那么,“读”与“写”都是向这个寄存器中输入数据吗?

【解释:读 表示 输出;写 表示 输入】

(二)考试错题分析

1.Linux Bash中, man printf和man 1 printf 功能等价。 (ok)

在linux中,默认man printf即是对linux系统命令中的printf进行操作(调用关于printf的帮助文档)

2.Linux Bash中,cd - 命令可以切换到'home'目录。( x )

应该是cd ~ , cd -是切换到上一个目录。

3.Linux Bash中,source 和 . 命令功能等价。 (ok)

这两个都是指的根目录。

4.Linux Bash中,查找home目录中前天创建的文件的命令是(find ~ -ctime 2)。

find命令执行查找功能;~代表home目录(根目录);ctime 2代表2天前创建的文件(时间点,而不是时间段)。

5.数据结构中有线性查找算法,C标准库中没有这个功能的函数,但Linux中有,这个函数是(lfind或lsearch)

可以用find进行查找

6.链接器的两个主要任务是(符号解析和重定位)。

7.(加载器)将可执行文件的内容映射到存储器,并运行这个程序。

8.~/test 文件夹下有很多c源文件,查找main函数在哪个文件中的命令( grep main *.c )

【grep命令可以实现筛选的功能,筛选范围是所有的.c文件。】

9.C语言中: -2147483647-1U < -2147483647 ( ok )

【左侧的-2147483647-1在转换成无符号数的时候,会转换成(4294967296-2147483648)即2147483648;而-2147483647转换成无符号数字的时候也是加上4294967296,则比左侧大。】

10.把内存中地址为0x4050处的字复制到地址为0x405c处的指令是 movw ($0x4050) ,($0x405c) (x)

应该是movw $0x4050 ,($0x405c)

11.C语言中的循环结构可以用(条件测试和跳转组合起来)实现。

也就是说,条件测试负责把控循环的进出;而跳转则是执行循环体。

12.实现一个数字系统需要三组成部分(组合逻辑、存储器元素、时钟信号)。

三、实验环节重点回顾

(一)linux基础命令

1.Ctrl+d——键盘输入结束或退出终端;Ctrl+s——暂定当前程序,暂停后按下任意键恢复运行。

2.touch 命令创建文件。

3.关于man命令的分区:1 一般命令;2 系统调用;3 库函数,涵盖了C标准函数库。可以通过在 man 后面加上相应区段的数字查看相应段的内容。

4.知道某个命令的作用,只是想快速查看一些它的某个具体参数的作用,那么你可以用--help参数,大部分命令都会带有这个参数。(--help与man的区别就在于前者侧重于对命令参数的解释)

5.在 Linux 系统里, root 账户拥有整个系统至高无上的权利,比如 新建/添加 用户。默认情况下在sudo用户组里的可以使用sudo命令获得root权限。

6.创建新用户:sudo adduser [用户名];切换用户:su -l [用户名];查看用户组:groups [用户];添加用户组(在sudo组中的用户才有此权限):sudo usermod [用户组参数] [用户]

7.一个目录要同时具有读权限和执行权限才可以打开,而一个目录要有写权限才允许在其中创建其它文件。

8.更改文件所有者:sudo chown [新所有者] [文件];更改文件权限:chmod [所有者权限][同一用户组用户权限][其他权限] [文件]

9.echo [变量名称]:查看某变量的值

10.cut 命令,打印每一行的某一字段。

注:-d ':'表示以“:”为分隔符

11.grep命令参数

  • -r 参数表示递归搜索子目录中的文件;
  • -n表示打印匹配项行号;
  • -I表示忽略二进制文件
  • $就表示一行的末尾,一般加在关键字后

12.wc(统计并输出一个文件中行、单词和字节的数目)常用参数:

  • -l:行数
  • -w:单词数
  • -m:字节的数目

13.简答的正则表达式使用举例

(将匹配以'z'开头以'o'结尾的所有字符串) echo 'zero\nzo\nzoo' | grep 'z.*o'

(将匹配以'z'开头以'o'结尾,中间包含一个任意字符的字符串) echo 'zero\nzo\nzoo' | grep 'z.o'

(将匹配以'z'开头,以任意多个'o'结尾的字符串) echo 'zero\nzo\nzoo' | grep 'zo*'

(将匹配所有的数字) echo '1234\nabcd' | grep '[0-9]'

14.扩展正则表达式

  • 一些不便书写的或有其他特殊用途的 一些不便书写的或有其他特殊用途的 “字符,在前面加 “字符,在前面加 \” \” 后,就代表该符 后,就代表该符 号本身
  • " " 次数修饰 次数修饰 " " 放在 放在 " " 被修 被修 饰表达式 饰表达式 " " 后边。如: 后边。如: "[bcd][bcd]" "[bcd][bcd]" 写成 写成 "[bcd]{2}"
  • ^ 与字符串开始的地方匹配,不匹配字符
  • $ 与字符串结束的地方匹配,不匹配字符

(二)GCC、GDB使用

1.gcc编译步骤

  • gcc -E hello.c -o hello.i
    预处理
  • gcc -c hello.i -o hello.o
    将hello.i编译为目标代码
  • gcc hello.o -o hello
    gcc连接器将目标文件链接为一个可执行文件,一个大致的编译流程结束

2.编写用于调试的代码

执行

3.gdb调试

  1. gcc –g [C源文件] -o [可执行文件]
  2. gdb [可执行文件]
  3. gdb l(列出C代码) (图6)
  4. break [行数或其他]——设置断点
  5. info break——查看断点信息
  6. n——单步执行
  7. p [变量]——打印变量的值
  8. finish ——退出函数
  9. c——继续执行
  10. 部分调试过程截图

四、总结与建议

(一)不足之处

本次期中总结的过程中,我发现自己对基础知识掌握得较为扎实,然而对linux操作等需要动手实践的部分的确需要进一步提高——比如,我用在复习课本一章内容的时间并不长,因为每一章的重点在第一遍学习的过程中已经被我记录并且通过做题进行了巩固;而在复习实验部分时,我却觉得“温故而知新”,复习的过程更像是捡起之前未曾注意到或者未曾理解过的知识的过程。因而,在之后的学习中,动手实践,是我更应该侧重的地方。

(二)课程建议

我认为,起初的“先看书,后讲解”的课程学习模式可能对相当一部分同学来说是有难度的:一是因为课程起步阶段大多数同学不能很快适应,二是对课本把握不好,精力投入的侧重也难以把握。现阶段,“先讲解,再看书,后验收”的模式(在我看来)可以纠正之前的问题,促进高效率学习。另外,我觉得,在课上一如既往地坚持和加强对操作性内容的讲解,对于我这种“动手能力差”的同学来说是很有帮助的。

posted @ 2015-11-01 10:12  5216  Views(448)  Comments(1Edit  收藏  举报