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

第八周期中总结

Chapter0、LINUX常用命令总结


man -k:

man是manul的缩写 帮助文档。

-

常用来搜索,结合管道使用。例句如下:

 man -k k1  | grep k2  |grep 2

搜索同时含有k1和k2,且属于系统调用。

最后的数字意味着帮助手册中的区段,man手册共有8个区段,最常用的是123,含义如下:

1.linux 
2.系统调用
3.C语言

上述可以由man man 命令知道。 但是如果要单独知道单独某个区段时就要如下命令:

   man 3 printf

意思就是查找C语言中printf的用法。

man -k sort

这个就跟定位排序差不多。

man -k file |grep read |grep 2
grep -nr read only /usr/include

这个命令就是:如何读文件

grep -nr

这条语句可以用来查找关键字,全文搜索,并且可以直接查找文件内的内容。其中:

n:为显示行号
r:为递归查找

例如,如果想查找某个宏,我们已知宏保存在include文件夹中,所以可以使用下列语句:

grep -nr XXX  /usr/include (XXX为所要查找的宏)

如果想要查找搜索具体的行,即如果要查当前目录下*c中main函数在哪个文件里面:

grep main*.c 

cheat命令

cheat是非常好用的“打小抄”搜索工具,能够方便的告诉你你想要的内容。 示例:

cheat ls

反正就是想知道什么就查cheat XXX就可以了

  1. cheat命令是在GNU通用公共许可证下,为Linux命令行用户发行的交互式备忘单应用程序。
  2. 它提供显示Linux命令使用案例,包括该命令所有的选项和简短但尚可理解的功能。

其他核心命令

  1. find查找一个文件在系统中的什么位置,locate是神速版本的find
  2. grep 可以对文件全文检索,支持正则表达式,
  3. whereis,which告诉你使用的命令工具装在什么地方。

Chapter7:链接


常用工具:vim 编辑器

vim是一种非常好用的编辑器,总共有六种基本模式,最常用的是普通模式、插入模式和命令行模式。需要熟悉这三种模式之间的切换方式:

普通→插入: i 或 a 
插入→普通: Esc 或 Ctrl + [
普通→命令行: :
命令行→普通:Esc 或 Ctrl + [ 

常用的进入、保存和退出指令:

进入:vim 文件名
保存:命令行模式 :w
退出:命令行模式 :q

常用动作:

删除:dd删除整行
复制:yy复制整行
粘贴:p-  

※实用功能:交换上下行——ddp,快速交换光标所在行与它下面的行。

Vim模式:

 1.普通模式
 2.插入模式
 3.可视模式
 4.选择模式
 5.命令行模式
 6.Ex模式 

vim启动进入普通模式,处于插入模式或命令行模式时只需要按Esc或者Ctrl+[(这在vim课程环境中不管用)即可进入普通 模式。普通模式中按i(插入)或a(附加)键都可以进入插入模式,普通模式中按:进入命令行模式。命令行模式中输入wq回车 后保存并退出vim。 

  1. 普通模式:

    按键          说明
    h           左
    l           右(小写L)
    j           下
    k           上
    w           移动到下一个单词
    b           移动到上一个单词
    

2.插入模式:

 命令       说明
i        在当前光标处进行编辑
I        在行首插入
A        在行末插入
a        在光标后插入编辑
o        在当前行后插入一个新行
O        在当前行前插入一个新行

3.退出vim:

(1).命令行模式下退出vim:

从普通模式输入:进入命令行模式,输入wq回车,保存并退出编辑

以下为其它几种退出方式:

命令              说明
:q!             强制退出,不保存
:q              退出
:wq!            强制保存并退出
:w <文件路径>    另存为
:saveas 文件路径 另存为
:x              保存并退出
:wq             保存并退出

(2)普通模式下退出vim:

  普通模式下输入Shift+zz即可保存退出vim

4.删除文本:

进入普通模式,使用下列命令可以进行文本快速删除:

x :删除游标所在的字符
X: 删除游标所在前一个字符
Delete:同x
dd:删除整行 
dw:删除一个单词(不适用中文)
d$或D:删除至行尾
d^:删除至行首
dG:删除到文档结尾处
d1G:删至文档首部
注:在命令之前加上数字,表示一次删除多行

常用工具:gcc

编译过程:

(1)预处理:gcc –E hello.c –o hello.i;gcc –E调用cpp
(2)编 译:gcc –S hello.i –o hello.s;gcc –S调用ccl
(3)汇 编:gcc –c hello.s –o hello.o;gcc -c 调用as
(4)链 接:gcc hello.o –o hello ;gcc -o 调用ld

常用选项:

 -c     只编译不链接,生成目标文件.o
 -S     只编译不汇编,生成汇编代码
 -E     只进行预编译,不做其他处理
 -g     在可执行程序中包含标准调试信息
 -o file    将file文件指定为输出文件
 -v     打印出编译器内部编译各过程的命令行信息和编译器的版本
 -I dir 在头文件的搜索路径列表中添加dir目录 

gdb

注意:使用GCC编译时要加“-g”参数,然后才能够用gdb调试

GDB最基本的命令有:

gdb programm(启动GDB) 
l      查看所载入的文件
b      设断点
info b 查看断点情况
run    开始运行程序
bt     打印函数调用堆栈
p      查看变量值
c      从当前断点继续运行到下一个断点  
n      单步运行(不进入)
s      单步运行(进入)
quit   退出GDB

四种断点:

 1.行断点
          b [行数或函数名] <条件表达式>
 2.函数断点
          b [函数名] <条件表达式>
 3.条件断点
          b [行数或函数名] <if表达式>
 4.临时断点
          tbreak [行数或函数名] <条件表达式>

另外的调试工具:

cgdb,有单独的debug窗口,更方便查看

ddd,图形页面

make和makefile

一个Makefile文件主要含有一系列的规则,每条规则包含以下内容:

  • 需要由make工具创建的目标体,通常是可执行文件和目标文件,也可以是要执行的动作,如‘clean’;

  • 要创建的目标体所依赖的文件,通常是编译目标文件所需要的其他文件。

  • 创建每个目标体时需要运行的命令,这一行必须以制表符TAB开头

格式为:

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

定义变量的两种方式:

(1)递归展开方式   
         VAR=var
(2)简单方式     
         VAR:=var

使用变量的格式为:

$(VAR)

正则表达式

作用:

  • 验证是否匹配
  • 查找
  • 替换

规则:

  • 特殊符号,表示后面的字符本身
  • [ ] 匹配其中任意字符,但每次匹配只匹配一个
  • [^ ] 匹配除其中的任意字符,每次匹配只匹配一个
  • {n} 次数修饰,重复n次,具体如下:

    ?= {0,1}
    += {1, }    
    *= {0, }
    {m,n}:至少为m,至多为n
    

匹配方法:

  • ^ 从字符串开始的地方匹配
  • $ 从字符串结束的地方匹配
  • | 可以匹配左或者右
  • () 1.次数修饰中,可以表示当做整体;2.结果中,可以表示单独表示

贪婪:尽可能多的匹配

加了?后——非贪婪,尽可能少的匹配

静态库和动态库

 静态库:.a(linux)、.lib(windows)
 动态库:.so(linux)、.dll(windows)

静态库(以linux为例)

创建该库:

gcc -c addvec.c multvec.c
ar rcs libvector.a addvec.o multvec.o

涉及到的参数所做动作:

gcc -c只编译,不连接成为可执行文件。
      即:把.c文件编译成.o文件
ar -r:在库中插入模块(替换)
       -c:创建一个库
       -s:写入一个目录文件索引到库中
即:把两个.o文件归档成静态库存档文件.a并且写入目录文件索引到库中

创建它的可执行文件:

gcc -02 -c main2.c
gcc -static -o p2 main2.o ./libvector.a

相关参数含义:

gcc -02 和-0都是代码优化指令,可以减少编译时间
    -c 只编译,不连接成为可执行文件
    -static 告诉编译器驱动程序,链接器应该构建一个完全链接的可执行目标文件
    -o 命名生成文件

动态库(linux)

构造创建共享库:

gcc -shared -fPIC -o libvector.so addvec.c multvec.c

参数解析:

 -fPIC  指示编译器生成与位置无关的代码
 -shared 指示链接器创建一个共享的目标文件
 -o         命名生成文件

把.c文件编译成为.o文件,放入新建的共享库中,并且命名。

链接程序

gcc -o p2 main2.c ./libvector.so

创建一个可执行目标文件p2,在运行时可以和动态库libverctor.so链接。

  1. 链接可以在编译时由静态编译器完成,也可由在加载时和运行时由动态链接器完成。
  2. 链接器处理称为目标文件的二进制文件,其有三种不同形式:

    (1)可重定位的 (2)可执行的 (3)共享的

  3. 链接器主要任务:

    (1)符号解析 
    (2)重定位

    符号解析:将目标文件中的每个全局符号都绑定到一个唯一的定义

    重定位:确定每个符号的最终存储器地址,并修改对那些目标的应用

  4. 静态链接器由GCC类似编译取驱动器调用,他们将多个可重目标文件合并成一个单独的可执行目标文件

  5. 多个目标文件可以被连接到一个单的的静态库中。链接器用库来解析其他目标模块中的符号引用

  6. 加载器可将可执行文件的内容映射到存储器,并运行这个程序。链接器还能生成部分连接的可执行目标文件,这样的文件中有对定义在共享库中的程序和数据和数据的未解析的引用。

Chapter1:计算机系统漫游

重点内容

  1. 信息=位+上下文。

【理解:这是本章最重要也是可以概括本章中心思想的一句话。系统中所有的信息——包括磁盘文件、存储器中的程序、存储器中存放的用户数据以及网络上传送的数据,都是由一串位表示的。而区分不同数据对象的唯一方法是我们读到这些数据对象时的上下文。】

2.系统的硬件组成

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

3.操作系统内核是应用程序和硬件之间的媒介。它提供三个基本抽象:

 (1)文件是对I/O设备的抽象
(2)虚拟存储器是对主存和磁盘的抽象
(3)进程是对处理器,主存和I/O设备的抽象

4.存储器层次结构的主要思想是一层上的存储器作为低一层存储器的高速缓存

5.操作系统两个基本功能:

 防止硬件被失控的应用程序滥用;
 向应用程序提供简单一致的机制来控制复杂的低级硬件设备

Chapter2、信息的表示和处理

重点内容

【这一章我认为是之后几章做习题的基础,因为这一章主要讲述的就是编码和二进制变机器码的算法啊什么的,所以必须得学好这一章且要经常复习。】

  1. 一个字节是8位,也就是两位十六进制数。
  2. 整数中,有符号数和无符号数的表示,补码表示,位运算和逻辑运算,溢出、截断和扩展;
  3. 浮点数中,二进制小数,最重要的是IEEE小数:

    IEEE浮点标准:

     用V=(-1)^s X 2^E X M 来表示一个数:
     符号:s决定这个数是正还是负。0的符号位特殊情况处理。
     阶码:E对浮点数加权,权重是2的E次幂(可能为负数)
     尾数:M是一个二进制小数,范围为1~2-ε或者0~1-ε(ε=1/2的n次幂)
    

编码规则:

单独符号位s编码符号s,占1位
k位的阶码字段exp编码阶码E
n位小数字段frac编码尾数M(同时需要依赖阶码字段的值是否为0)

两种精度:

  • 单精度(float),k=8位,n=23位,一共32位;
  • 双精度(double),k=11位,n=52位,一共64位。

三种被编码情况

  • 规格化的
  • 非规格化的
  • 特殊值

还有舍入方式:

1).向偶舍入(默认方法) 即:将数字向上或向下舍入,是的结果的最低有效数字为偶数。 能用于二进制小数。

2).向零舍入 即:把整数向下舍入,负数向上舍入。

3).向下舍入 正数和负数都向下舍入。

4).向上舍入 正数和负数都向上舍入。

默认的(即向偶舍入)方法可以得到最接近的匹配,其余三种可用于计算上界和下界。

4.计算机将信息按位编码,通常组成字节序列。用不同的编码方式表示整数,师叔和字符串。不同的计算机模型在编码数字和多字节数据中的字节排序时使用不同的约定。

5.浮点表示用过将数字编码为x乘以2的y次方的形式近似地表示实数。最常见的浮点表示方式是由IEEE标准754定义的。它提供了几种不同的精度,最常见的是单精度(32位)和双精度(64位)。IEEE浮点也能够表示特殊值,如负无穷,正无穷和NaN。

6.信息存储:       

机器及程序将存储器视为一个非常大的字节数组,称为虚拟存储器。存储器的每个字节都由一个唯一的数字来标识,称它为地  址,所有可能地址的集合称为虚拟地址空间。

7.寻址和字节顺序:           

 (1)大端法(2)小端法

小端是“高对高、低对低”,大端与之相反

8.布尔代数:           

与&  或|  非~  异或^

9.C语言中的位移运算           

   <<左移
   >>右移(注意区别逻辑右移和算术右移)

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

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

Chapter3、程序的机器级表示

这一章我觉得就是汇编的复习,只是本人上学期汇编学的不是很透彻,所以很多都不会。

重要内容

  1. gcc -S xxx.c 可以得到C语言编译器产生的汇编代码,但不会做其他工作;使用“-c”命令,GCC就会编译并汇编该代码,得到二进制文件XXX.o。
  2. 寻址方式的通用公式:有效地址可以表示为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]) 
    
  3. SUB S,D——将D-S的结果送至D

  4. SET类指令根据t=a-b的结果所设置的条件码来将一个字节(目的操作数)设置为0或者1
  5. IA32利用程序栈来支持过程调用(包括将数据和控制)。为单个过程分配的那部分栈做栈帧。最底端(地址最大)%ebp为帧指针;最顶端(地址最小)%esp为栈指针。当程序执行时,栈指针可以移动。
  6. 转移控制——

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

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

  7. 翻译循环

汇编中可以用条件测试和跳转组合起来实现循环的效果,但是大多数汇编器中都要先将其他形式的循环转换成do-while格式。

1.do-while循环

通用形式:

 do
        body-statement
        while(test-expr);

循环体body-statement至少执行一次。

可以翻译成:

 loop:
         body-statement
         t = test-expr;
         if(t)
              goto loop;

即先执行循环体语句,再执行判断。

2.while循环

通用形式:

 while (test-expr)
         body-statement- 

GCC的方法是,使用条件分支,表示省略循环体的第一次执行:

 if(!test-expr)
       goto done;
 do
      body-statement
       while(test-expr);
 done:

接下来:

t = test-expr;
if(!t)
     goto done:
loop:
     body-statement
      t = test-expr;
     if(t)
          goto loop;
done:

归根究底,还是要把循环改成do-while的样子,然后用goto翻译。

3.for循环

for循环可以轻易的改成while循环,所以再依照上面的方法改成do-while再翻译即可。

寄存器使用惯例

程序寄存器组是唯一能被所有过程共享的资源。

这个惯例是为了防止一个过程P调用另一个过程Q时寄存器中的值被覆盖。惯例如下:

%eax,%edx,%ecx  调用者保存寄存器(Q可覆盖,P的数据不会被破坏)
%ebx,%esi,%edi  被调用者保存寄存器(Q在覆盖这些值前必须压入栈并在返回前回复他们)
%ebp,%esp   惯例保持
%eax用来保存返回值

Chapter4、处理器体系结构

这一章就是围绕Y86而展开并教授的。

Y86指令

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

这个字节分为两个部分,每部分四位: 高四位是代码部分(0——0xB),第四位是功能部分。

这里补充一些缩写: 立即数(i),寄存器(r)、存储器(m)。

指令附加的寄存器指示符字节依次是数据源(如果是立即数,把这一位设置成0xf)、目的寄存器/基址寄存器。

有些指令需要附加四字节的常数字,采用小端法(倒序)编码

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

4.处理操作的阶段——

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

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

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

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

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

Y86异常

 值     名字       含义
 1     AOK      正常操作
 2     HLK      处理器执行halt命令
 3     ADR      遇到非法地址
 4     INS      遇到非法指令

Chapter6、存储器层次结构

中心思想:每层存储设备都是下一层的“缓存”。

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

寻道:将读写头定位到包含目标扇区的磁道上。Tseek取决于它以前的位置和传动臂在盘面上的移动速度。时间通常为3——9ms。
旋转:一旦读写头定位到了期望的磁道,驱动器等待目标扇区的第一个位旋转到读写头下面。

   平均旋转时间是最大时间(等磁盘旋转一圈)

传送:驱动器开始写或者读扇区的内容;时间长短取决于旋转速度和每条磁道的扇区数目。
    平均时延为 Tavg=1/RPM*1/(平均扇区数/磁道)*60secs/1min
补充:访问一个磁盘扇区的512字节的主要时间在于寻道和旋转延迟。访问时间:磁盘>DRAM>SRAM

缓存命中

当程序需要第k+1层的某个数据对象d时,首先在当前存储在第k层的一个块中查找d,如果d刚好缓存在第k层中,就称为缓存命中。

该程序直接从第k层读取d,比从第k+1层中读取d更快。

缓存不命中

即第k层中没有缓存数据对象d。

这时第k层缓存会从第k+1层缓存中取出包含d的那个块。如果第k层缓存已满,就可能会覆盖现存的一个块

覆盖——替换/驱逐

替换策略:

随机替换策略-随机牺牲一个块 最近最少被使用替换策略LRU-牺牲最后被访问的时间距离现在最远的块。

缓存不命中的种类

(1)强制性不命中/冷不命中
     即第k层的缓 存是空的(称为冷缓存),对任何数据对象的访问都不会命中。

(2 )冲突不命中
     由于一个放置策略:将第k+1层的某个块限制放置在第k层块 个小的子集中,这就会导致缓存没有满,但是那个对应的块满了,就会不命中。

 (3)容量不命中
      当工作集的大小超过缓存的大小时,缓存会经历容量不命中,就是说缓存太小了,不能处理这个工作集。

每周测试题

第三周

填空:实验楼环境中所有的默认系统用户名和密码均为 (shiyanlou                )。
填空:Linux Bash中,Ctrl+a快捷键的作用是(将光标移至输入行头,相当于Home键)。
判断:Linux Bash中, man printf和man 1 printf 功能等价。 ok
填空:在 Linux 里面可以使用使用(groups)命令知道自己属于哪些用户组。
填空:在 Linux 里面可以使用使用(chmod)命令修改文件的权限。
填空:Linux中没有C盘,D盘,其文件系统的目录是由(FHS)标准规定好的。
 判断:Linux Bash中,cd - 命令可以切换到'home'目录。 x     应该是cd ~ , cd -切换到上一个目录
判断:Linux Bash中,强制删除test文件的命令是(rm -f     test )。
判断:Linux Bash中,cat -n 和 nl 命令功能等价。ok

判断:Linux Bash中,source 和 . 命令功能等价。 ok
填空:Linux Bash中,查找home目录中前天创建的文件的命令是(find ~ -ctime 2)。 区分 2 +2 -2 的意义, 三种时间参考学姐李冰清的研究

判断:Linux Bash中,使用tar命令把home目录打包成home.tar的命令是( tar -cf home.tar  ~)
填空:Linux Bash中,zip命令使用(-e)参数可以创建加密压缩包。
判断:Linux Bash中,df和 du 命令功能等价。x
填空:Linux Bash中,ls . | sort 命令的功能是( 显示当前目录内容并排序            )
填空:Linux Bash中,使用grep查找当前目录下*.c中main函数在那个文件中的命令是(  grep main *.c )
填空:Linux Bash中,使用wc统计hello.c共有几行代码的的命令是( wc -l hello.c                      )
判断:col 命令的-h参数可以将Tab换成对等数量的空格建。x  , 空格换tab
填空:Linux Bash中,把ls命令显示当前目录的结果存入ls.txt的命令输出重定向命令是(ls > ls.txt)
填空:Linux Bash中,(tee   )命令可以同时重定向到多个文件。

第四周

  • man -k 填空: 数据结构中有线性查找算法,C标准库中没有这个功能的函数,但Linux中有,这个函数是(lfind或lsearch)
  • cheat 填空:To list the content of /path/to/foo.tgz archive using tar ( tar -jtvf /path/to/foo.tgz )
  • find 填空:查找当前目录下所有目录的find命令是(find . -type d)
  • grep 填空:查找宏 STDIN_FILENO 的值的命令是(grep -nr XXX /usr/include)
  • CH01填空:计算机系统中的所有信息都是位串表示的,所谓(信息)就是位+上下文。
  • CH01填空:存储器层次结构的主要思想是上层存储器作为下层存储器的(高速缓存)。
  • CH01填空:操作系统中最基本的四个抽象是(虚拟机、进程、虚拟存储器、文件)。
  • CH07填空:链接器的两个主要任务是(符号解析和重定位)。
  • CH07选择:教材p449中 swap.c中的bufp1 是( A ) A 全局符号 B外部符号 C本地符号 D以上都不对
  • CH07 判断:C语言中,全局变量是强符号。(X)
  • CH07 填空:(加载器)将可执行文件的内容映射到存储器,并运行这个程序。
  • CH07 选择:Linux中,反汇编.text节中的二进制指令使用的工具是(d)A ar B strings C readelf D objdump

第五周

man -k 填空:Linux中显示文件(file )属性(status)的命令是( stat )
cheat 填空:使用du命令对当前目录下的目录或文件按大小排序 的命令是( du -sk *| sort -rn )
grep 填空:~/test 文件夹下有很多c源文件,查找main函数在哪个文件中的命令( grep main *.c )
vi 填空: vi中查看函数qsort的帮助文档的快捷键为(K)
gdb 判断: gdb中next和step都可以单步跟踪,根据自顶向下原则应该优先选用step. (X )
ch01 填空:抽象是CS中一个重要的概念,在出来器里,(指令集结构)提供了对实际处理器的抽象。
ch01 选择:并行的三个层次不包含(C)。A 线程级并发 B指令级并行 C进程级并发 D SIMD
ch07 填空:gcc -f PIC xxx.c 中的PIC的意思是(位置无关的代码 or Position-Independent Code)
 2.4 填空:计算 0x503C + 100 = ( 0x50A0 ) ,结果用16进制表示
 2.6 填空:练习2.6中匹配的二进制共21位,用16进制表示是( 0x159141 )
 2.8 填空: a,b长度都是一个字节,a=1,b=6, a|b = ( 7 or [00000111] ) 
 2.11 判断: 代码中第四行 "<=" 换成“>=” 就可以解决代码问题。 ( X )
 2.13 判断: /*compute x&y, only calls to functions bis and bic*/
 int bool_and(int x, int y){
 int result = bic(x, y);
 return result;      
 } (X)
   2.14 填空:a,b长度都是一个字节,a=1,b=6, a||b = (  1 or true ) 
  2.18 填空:16位机器上,补码0x8004转化等值的十进制是( -2044 ) 
 2.19 判 T2U4(-8) + 8 = 16 (OK)
 2.21 判断:C语言中: -2147483647-1U < -2147483647 ( ok )
 2.23 填空:fun2(0xED005380) = (0xFFFFFF80)
 2.24 填空:四位数0xC 截断为3位数,解释为无符号数的截断值是(4)
 2.25 判断:代码for中条件 i<=(int) length -1 可以消除程序bug ( ok ) 
 2.27 判断: 函数代码可以是 ruturn x+y >= y; (ok) 
 2.29 填空: [11000] + [11000] = ([110000])
 2.33 填空:对于四位数补码8,其补码的非表示为十进制为(-8)
  2.34 填空:补码 [100] * [101] = ([001100])
 2.40 填空:K=31 移位2,加/减1,表达式为((x<<5)-x)
 2.44 判断: 针对题目:(x>0)|| ((x-1)<0)的值为真 (x)
 2.45 填空:二进制小数1.101转化为十进制为(1.625)
 2.47 判断:浮点数 00111转化为十进制为1.5 (X)
 2.50 填空:二进制数10.110舍入到最接近的二分之一的十进制的值为(2.5)
 2.54 判断: f== -(-f) (ok) 

 regex 判断: 正则表达式r.t可以匹配rt. (x)
 regex 判断:正则r表达式zo*可以匹配z. (ok)
 CH03 填空:从i386开始,x86体系结构扩展到了32位,增加了(平坦)寻址模式
 CH03 填空:在64位机器上,要用gcc编译出32位机器码,需要使用(-m32) 选项
 CH03 填空:对于机器级编程来说,两种重要的抽象是(ISA,虚拟地址)
 CH03 填空:Linux中,对目标代码code.o进行反汇编的命令是(objdump -d code.o)
 CH03 填空:IA32指令中,操作数的三种类型是(立即数、寄存器、存储器) 
 3.1 填空: 针对练习3.1中的图,操作数 8(%eax,%ecx,4)的值是(0x11)
 CH03 判断: 把内存中地址为0x4050处的字复制到地址为0x405c处的指令是 movw ($0x4050) ,($0x405c) (x)
 CH03 判断: %esp的值为0x10c, pushl %eax后,%esp的值为0x108. (ok)
 3.3 判断: movb $0xF, (%eax) 是正确汇编语句. (ok)
 3.5 填空: decode1函数的功能是( 数据交换 )
 3.6 填空: 指令leal 3(%eax,%ecx,4), %edx 存储在%edx中的值为( 3+x+4y ) 
 3.9 填空: arith函数的功能是( ~((x^y)>>3) -z )
 3.14 判断: 汇编代码不会记录程序值的类型。(ok) 
  CH03 填空:C语言中的条件表达式在汇编中是结合(有条件跳转和无条件跳转)实现的。
 CH03 填空:C语言中的循环结构可以用(条件测试和跳转组合起来)实现。

CH03 填空:Linux汇编中,形成空调用栈帧的语句是(push %ebp movl %esp %ebp) 


find: 填空:查找当前目录下2天前被更改过的文件 (find . -mtime +2 -type f -print)    


  4.1 Y86中 jmp 0x100 对应的机器码是(0x7000010000)
  4.2 Y86中 0xa00f 对应的汇编语句是(pushl %eax)

等等 。。主要还是经常看一下错题,这样就能巩固知识了。。

心得

此次复习让我更深刻的知道了一点,之前都太表面,深刻的知识都不会,然而现在不同了,至少可以看得懂练习题,所以很开心,我清楚的认识到下功夫真的会有所收获。下次从学的时候就要好好学透,加油。

参考资料

1.《深入理解计算机系统》

2.往期自己的博客。

3.还有博客园上的老师发的测试答案。

4.闫佳歆同学的博客版面。

5.实验楼linux基础那一块。

原文地址:https://www.cnblogs.com/20135239-yxlm/p/4928655.html