20145312 《信息安全系统设计基础》期中总结
教材学习内容总结
- 命令行常用快捷键
- 常用通配符
- 帮助命令:man
man手册区段:
要查看相应区段的内容,就在 man 后面加上相应区段的数字即可,如: - man 3 printf;
关键字检索:man -k k1| grep k2 | grep 2…(等于apropos)
例如:
man -k ad; #显示man手册中所有包含ad的命令或说明文件并列条显示 - 查找命令find find [path] [option] [action]
在指定目录下搜索指定文件名的文件:
find /etc/ -name interfaces - 时间参数:
-atime:最后访问时间
-ctime:创建时间
-mtime:最后修改时间 - n、+n、-n的区别:
-mtime n: n 为数字,表示为在n天之前的”一天之内“修改过的文件
-mtime +n: 列出在n天之前(不包含n天本身)被修改过的文件
-mtime -n: 列出在n天之前(包含n天本身)被修改过的文件
例如:
列出 home 目录中,当天(24 小时之内)有改动的文件:
find ~ -mtime 0
newer file: file为一个已存在的文件,列出比file还要新的文件名,例如:
列出用户家目录下比Code文件夹新的文件:
find ~ -newer /home/shiyanlou/Code
- 查找匹配字符串grep
grep [命令选项]... 用于匹配的表达式 [文件]...
例:搜索/home/shiyanlou目录下所有包含"shiyanlou"的所有文本文件,并显示出现在文本中的行号:
grep -rnI "shiyanlou" ~
-r 参数表示递归搜索子目录中的文件,-n表示打印匹配项行号,-I表示忽略二进制文件 - 查看环境变量中以"yanlou"结尾的字符串:
export | grep ".*yanlou$"
- 查找宏的值:
grep –nr [宏名称、全大写] /usr/include
其中-r代表递归查找,-n代表行数
11.基本指令
apt-get、cd、mkdir、cp(复制)、rm(删除)、mv(移动、重命名)、rename(批量重命名)、cat(正序查看文件)、tac(倒序查看文件)、nl(添加行号并打印)、more和less(分页查看)、zip、rar、tar、df(查看磁盘容量)、du(查看目录容量)、wc(计数)、uniq(去重)......
第二周
- vim的使用
(1)三种常用模式的切换:
常用模式:普通模式、插入模式和命令行模式。
普通→插入: i 或 a 插入→普通: Esc 或 Ctrl + [ 普通→命令行: :
命令行→普通:Esc
命令行模式下输入wq ,回车后保存并退出
(2)进入:vim/vim 文件名.格式
(3)帮助:大写“K”可以用来查找函数的帮助信息:查看 man page,命令模式下,将光标放在函数名上,按"K"可以直接察看 man page
2. gcc的使用
预处理:gcc –E hello.c –o hello.i;(gcc –E调用cpp)
编译:gcc –S hello.i –o hello.s;(gcc –S 调用ccl)
汇编:gcc –c hello.s –o hello.o;(gcc -c 调用as)
链接:gcc hello.o –o hello;(gcc -o 调用ld)
- 调试工具gdb的使用
gdb program 启动gbd
b 设断点(4种断点:行断点、函数断点、条件断点、临时断点)
run 开始运行程序
bt 打印函数调用堆栈
p 查看变量值
c 从当前断点继续运行到下一个断点
n 单步运行
s 单步运行
quit 退出gdb
display 跟踪变量值的改变
until 跳出循环
finish 跳出函数
help 帮助
第三周
- 信息存储
计算机最小的可寻址的存储器单位——字节
一个字节的值域:00H-FFH - 进制转换
-常用进制:二进制(B),十进制(D),八进制(O或者Q),十六进制(H)
-转换为二进制-十六进制相互转换,二进制的四位数字对应十六进制的一位数字
-二进制与八进制的转化是三位对应一位
-通常情况下,进制转换都以二进制为桥梁进行转换。 - 字
-字长决定虚拟地址空间的最大大小
-字长为w,虚拟地址的范围为1-(2^w-1) - 小端法和大端法
-小端法:最低有效字节在前面——“高对高,低对低”
-大端法:最高有效字节在前面 - 无符号数的编码
0-(2^w)-1中的每一个整数和长度为w的位向量是一一对应的 - 强制类型转换
-从位级角度考虑
-强制类型转换的结果保持位值不变,只是改变了解释这些位的方式 - c语言中的有符号数和无符号数及其转换
转换原则:底层的位保持不变。
(1)有符号数→无符号数
非负数——保持不变
负数——转换成大正数
(2)无符号数→有符号数
以2的w-1次方为界限:
小于它——保持不变
大于它——转换为负数值
8、扩展
扩展——从一个较小的数据类型转换为较大的数据类型,同时保持数值不变。
零扩展:多用于无符号数转换为一个更大的数据类型。只需在开头加上0即可。
符号扩展:多用于补码数字转换
第五周
- X86 寻址方式的变化:
(1)DOS时代的平坦模式,不区分用户空间和内核空间,很不安全;
(2)8086的分段模式;
(3)IA32的带保护模式的平坦模式 - 机器编程的两种抽象
(1)指令集体系结构(Instruction set architecture,ISA)——定义指令格式以及每条指令执行之后对状态的影响。大多数ISA将程序行为描述成按顺序执行的;
(2)虚拟地址 - 状态可见的几种处理器
(1)程序计数器 (PC,用%eip表示)
(2)整数寄存器 (包含8个命名的位置,存储32位的值)
(3)条件码寄存器 (实现if和while语句)
(4)浮点寄存器 (存放浮点数) - 操作数指示符:指示出执行一个操作中要引用的源数据值,以及放置结果的目标位置。操作数的三种类型:
立即数(不超过32位的数值)
寄存器(用Ea表示任意寄存器a,R[Ea]表示它的值)
存储器(会根据计算出来的地址访问某个内存,用M[addr]表示)
- 数据传送指令
(1)MOV类指令:将数据从一个位置复制到另一个位置,将源操作数的值复制到目的操作数。在IA32中规定不能从内存地址直接MOV到另一个内存地址,要用寄存器进行中转。其中,MOVS是符号扩展;MOVZ是零扩展。
(2)MOVS:将一个较小的源数据复制到一个较大的数据位置,高位用位扩展;
(3)MOVZ:将一个较小的源数据复制到一个较大的数据位置,高位用零扩展。
(4)PUSH&POP指令
PUSH:将数据压入程序栈中
POP:从程序栈中弹出数据
(栈遵循“后进先出”的原则,且栈顶向下增长;在栈指针%esp中保存着栈顶元素的指针)
- 条件码
(1)条件码寄存器:他们描述了最近的算术或逻辑操作的属性。
(2)常用的条件码:CF:进位标志;ZF:零标志;SF:符号标志;OF:溢出标志。
(3)LEAL指令:加载有效地址,将数据从存储器读到寄存器。
NEG,取负
SUB S,D,将D-S的结果送至D
移位操作 SAL,SHL,SAR,SHR的移位量可以是立即数或%cl中的数
(4)其他常见指令:
XOR:进位标志和溢出标志会设置成0
INC:设置溢出和零标志
DEC:设置溢出和零标志
CMP:根据操作数之差设置条件码
SUB:设置条件码,更新寄存器
TEST:改变目的寄存器的值
- 访问条件码
常用使用方法:
(1)根据条件码的某个组合,将一个字节设置成0或1
(2)可以条件跳转到某个其他部分
(3)可以有条件的传送数据
跳转指令及其编码
(1)JUMP指令,导致执行切换到程序中一个全新的位置。
(2)无条件跳转——jmp.<标号> 跳转到标号所指示的语句处;jmp *<操作数指示符> 【注意:如果形如%eax,即以%eax中的值作为跳转目标;而形如(%eax)则是以其中的值作为地址,读出跳转目标】
(3)有条件跳转——类似于SET类指令,是根据条件码或者其组合来跳转。(SET类指令根据t=a-b的结果所设置的条件码来将一个字节(目的操作数)设置为0或者1)
8. 循环
(1)do-while循环
(2)while循环
(3)for循环
(4)switch语句:根据一个整数索引值进行多重分支;通过使用跳转表使其更加高效。跳转表是一个数组,表项i是一个代码段地址(C语言用&表示一个指向数据值的指针;而&&表示一个指向代码位置的指针)
9. 栈帧结构
(1)IA32利用程序栈来支持过程调用(包括将数据和控制)。为单个过程分配的那部分栈做栈帧。最底端(地址最大)%ebp为帧指针;最顶端(地址最小)%esp为栈指针。当程序执行时,栈指针可以移动。
(2)机器用栈来传递过程参数、存储返回信息、保存寄存器,以及本地存储。
10. 转移控制
指令描述:
(1)call指令:目标是指明被调用过程起始的指令地址。效果是将返回地址入栈,并跳转到被调用过程的起始处。
call Label 过程调用
call *Operand 过程调用
(2)ret指令
从栈中弹出地址,并跳转到这个位置。
第六周
- 程序员可见的状态
(1)8个程序寄存器:%eax,%ecx,%edx,%ebx,%esi,%edi,%esp和%ebp。
(2)条件码:ZF(零)、SF(符号)、OF(有符号溢出)
(3)程序计数器(PC):存放当前正在执行的指令的地址
(4)存储器:很大的字节数组,保存着程序和数据。Y86系统用虚拟地址来引用存储器的位置,硬件和操作系统软件联合起来将虚拟地址翻译成实际或者物理地址。
(5)状态码(stat):表明程序执行的总体状态。(指示异常处理) - Y86指令
(1)movl:irmovl、rrmovl、mrmovl、rmmovl,分别显式地指明源和目的地的格式。第一个字母表明源的类型,i(立即数)、r(寄存器)或m(存储器 ),第二个字母代表目的,可以是r或者m。
(2)整数操作指令OPl:addl、subl、andl和xorl。只对寄存器数据进行操作,同时还设置条件码。
(3)跳转指令jXX:jmp、jle、jl、je、jne、jge、jg,根据分支指令的类型和条件码的设置来选择分支。
(4)条件传送指令cmovXX:cmovle、cmovl、cmove、cmovne、cmovge和comvg,与寄存器-寄存器传送指令rrmovl一样,但只有当条件码满足所需要的约束时才会更新目的寄存器的值。
(5)call指令将返回地址入栈,然后跳转到目的地址。ret指令从这样的过程调用中返回。
(6)pushl和popl:入栈和出栈。
(7)halt:停止指令的执行。 - 指令编码
(1)指令的字节级编码。每条指令需要1-6个字节不等。每条指令的第一个字节表明指令的类型,高4位为代码部分,低4位为功能部分,功能值只有在一组相关指令共用一个代码时才有用。
(2)整数操作:代码部分均为6,功能部分区分addl,subl,andl,xorl。分支指令和调用指令的目的地址是一个绝对地址。所有整数采用小端法编码。
分支指令:代码部分均为7
传送指令:代码部分均为2
(3)8个程序寄存器当中,每个都有相应的0~7的寄存器标识符。程序寄存器存在CPU中的一个寄存器文件中,这个文件就是一个小的、以寄存器ID作为地址的随机访问存储器。
(4)程序寄存器存在CPU中的一个寄存器文件中,这个文件就是一个小的、以寄存器ID作为地址的随机访问存储器。
(5)附加4字节的常数字:作为irmovl的立即数数据,rmmovl和mrmovl的地址指示符的偏移量,以及分支指令和调用指令的目的地址。
(6)指令集的一个重要性质就是字节编码必须有唯一的解释。 - 逻辑门
(1)逻辑门产生的输出,等于它们输入位值的某个布尔函数。逻辑门只对单个位的数进行操作,而不是整个字。
(2)逻辑门类型
(3)逻辑门总是活动的,一旦一个门的输入变化,在短时间内,输出就会跟着变化。 - 组合电路和HCL布尔表达式
(1)组合电路:很多逻辑门组合成一个网,构建的计算块。构建这些网有两条限制:
-两个以上的逻辑门的输出不能连接在一起,否则可能使线上信号矛盾,导致一个不合法的电压或电路故障。
-这个网必须是无环的,否则会导致网络计算有歧义。
(2)多路复用器:根据输入控制信号的值,从一组不同的数据信号中选出一个。
(3)HCL表达式和C语言中逻辑表达式的区别:
-组合逻辑电路的输出会持续地响应输入的变化,C表达式只有在程序执行过程中被遇到时才会求值
-C的逻辑表达式允许参数是任意整数,0表示FLASE,其他任何值都表示TRUE,逻辑门只对位值0和1进行操作
-C的逻辑表达式可能只被部分求值,组合逻辑没有部分求值的规则,逻辑门只是简单地响应输入的变化
- 字级的组合电路和HCL整数表达式
(1)HCL中,所有字级的信号都声明为int,不指定字的大小。
(2)算数/逻辑单元(ALU):三个输入分别为标号为A和B的两个数据输入,和一个控制输入。
(3)集合关系:判断集合关系的通用格式是iexpr in {iexpr1,iexpr2,....iexprk}其中被测试和待匹配的值均为整数表达式。 - 存储器和时钟
(1)组合电路简单的响应输入信号,产生等于输入的某个函数的输出,并存在状态在这个状态上进行计时,如此产生了时序电路。
(2)随机访问存储器:存储多个字,用地址来选择应该读写哪个字。
(3)时钟寄存器:存储单个位或字,时钟信号控制寄存器加载输入值。
(4)硬件寄存器工作时,每当每个时钟到达上升沿时,值才会从寄存器的输入传送到输出。
(5)寄存器文件读数据是一个地址为输入,数据为输出的组合逻辑块,写入字是由时钟信号控制的。 - Y86的顺序实现
(1)将处理组织成阶段
-取指:从存储器读取指令字节,地址为程序计数器(PC)的值。指令指示符字节两个四位部分,称为icode(指令代码)和ifun(指令功能)。vaIP(下一条指令的地址)=PC+已取出指令的长度。
-译码:从寄存器文件读入最多两个操作数,得到valA和/或valB。
-执行:算数逻辑单元(ALU)根据ifun的值执行指令指明的操作,计算存储器引用的有效地址,或者增加或减少栈指针。得到的值称为valE。也可根据条件码执行跳转。
-访存:将数据写入存储器,或者从存储器读出数据。读出的值为valM。
-写回:最多可以写两个结果到寄存器文件。
-更新PC:将PC设置成下一条指令的地址。
(2)SEQ硬件结构
-取指:将程序计数器寄存器作为地址,指令存储器读取指令的字节。PC增加器计算valP,即增加了的程序计数器。
-译码:寄存器文件有两个读端口A和B,从这两个端口同时读寄存器的值valA和valB。
-执行:根据指令类型将算数/逻辑单元(ALU)用于不同的目的。条件码寄存器有三个条件码位,ALU负责计算条件码的新值,当执行跳转指令时会根据条件码和跳转类型来计算分支信号Cnd。
-访存:数据存储器读出或写入一个存储器字。指令和数据存储器访问的是相同的存储器位置,但用于不同的目的。
-写回:寄存器文件有两个写端口,E用来写ALU计算出来的值,M用来写从数据存储器中读出来的值。
(3)SEQ时序
``
-SEQ的实现包括组合逻辑和两种存储器设备:时钟存储器(程序计数器和条件码寄存器),随机访问存储器(寄存器文件、指令存储器和数据存储器)。
-Y86指令集的计算原则:处理器从来不需要为了完成一条指令的执行而去读由该指令更新了的状态。
-四个硬件单元:程序计数器、条件码寄存器、数据存储器、寄存器文件
(4)SEQ阶段的实现
-指阶段:包括指令存储器硬件单元。
-译码和写回阶段:寄存器文件,支持同时进行两个读和两个写,每个端口有一个地址连接(寄存器ID)和一个数据连接(32根线路),既可以作为寄存器文件的输出字,又可以作为他的输入字。
-执行阶段:算数逻辑单元(ALU),输出为valE信号。
-访存阶段:读或者写程序数据,两个控制块产生存储器地址和存储器输入数据的值。另外两个块产生控制信号表明应该执行读还是写操作。当执行读操作时,数据存储器产生valM。
-更新PC阶段:产生程序计数器的新值,依据指令的类型和是否要选择分支,新的PC可能是valC、valM或者valP。
第七周
- 静态RAM(SRAM):
-用来作为高速缓存存储器,相对访问时间短,存取快.
-每个位存储在一个双稳态的存储器单元里。
双稳态:电路可以无限期的保持在两个不同的电压配置或者状态之一。只要供电,就会保持不变。即使有干扰,例如电子噪音来扰乱电压,当干扰消除后,电路就会恢复到稳定值。 - 动态RAM(DRAM):
-用来作为主存以及图形系统的帧缓冲区。
-将每个位存储为对一个电容的充电,当电容的电压被扰乱之后,他就永远都不会再恢复了。暴露在光线下会导致电容电压改变。 - 存储器模块
双列直插存储器模块(DIMM):168个引脚,以64位为块传入/传出数据到存储控制器。
单列直插存储器模块(SIMM):72个引脚,以32位为块传入/传出数据到存储控制器。 - 非易失性存储器
PROM(可编程ROM):只能被编程一次
EPROM(可擦写可编程ROM):可以达到1000次
EEPROM(电子可擦除PROM):可以达到10^5次
FLASH(闪存):一类非易失性存储器,一种重要的存储技术
固件:存储在ROM设备中的程序 - 访问主存
总线:数据流通过称为总线的共享电子电路在处理器和DRAM之间传送。是一组并行的导线,能携带地址、数据和控制信号。
总线事务:CPU和主存之间的数据传送的过程。读事务,从主存传数据到CPU;写事务,从CPU传数据到主存。
I/O桥:将系统总线的电子信号翻译成存储器总线的电子信号。系统总线连接CPU和I/O桥,控制总线连接I/O桥和主存。 - 磁盘存储
(1)磁盘构造:磁盘是由多个盘片构成
(2)磁盘容量的决定因素:
-记录密度:磁道一英寸的段可以放入的位数。
-磁道密度:从盘片中心出发半径上一英寸的段内可以有的磁道数。
-面密度:记录密度与磁道密度的乘积。
-磁盘容量计算公式:
(3)磁盘操作:
寻道时间(Tseek):移动传动臂到目标扇区所需的时间
通常3-9ms
旋转时间(Trotation):驱动器等待目标扇区的第一个位旋转到读写头下
传送时间(Ttransfer):驱动器开始读写该扇区内容的时间
传送时间依赖于:旋转速度和每条磁道的扇区数目
(4)逻辑磁盘块
-读取一个磁盘扇区的数据到主存-发送命令到磁盘控制器-读取某个逻辑块号
-内存可以看成字节数组、磁盘可以看成块数组
(5)总线
-总线连接了CPU、主存和I/O设备
-第三方I/O设备:USB、适配器、主机总线适配器
(6)访问磁盘
-CPU通过将命令、逻辑块号和目的存储器地址写到与磁盘相关联的存储器映射地址,发起一个磁盘读磁盘控制器读扇区,并执行到主存的DMA传送
-DMA(直接存储器访问):设备可以自己执行读或者写总线事务,而不需要CPU干涉的过程。当DMA传送完成时,磁盘控制器用中断的方式通知CPU
(7)固态硬盘:固态硬盘是一种基于闪存的存储技术。一个硬盘包由一个或者多个闪存芯片和内存翻译层组成,闪存芯片替代旋转磁盘中的机械驱动器,而闪存翻译层将对逻辑块的请求翻译成对底层物理设备的访问
(8)存储技术趋势
-不同的存储技术有不同的价格和性能折中。
-不同存储技术的价格和性能属性以截然不同的速率变化着
-DRAM和磁盘的性能滞后于CPU的性能。 - 局部性
-局部性原理:一个编写良好的计算机程序倾向于引用邻近于其他最近引用过的数据项,或者最近引用过的数据项本身。有良好局部性的程序比局部性差的程序运行的更快,在硬件层引入高速缓存存储器就体现了局部性原理。 - 对程序数据引用的局部性
时间局部性(temporal locality):被引用过一次的存储器位置在未来会被多次引用(通常在循环中)。
空间局部性(spatial locality):如果一个存储器的位置被引用,那么将来他附近的位置也会被引用。 - 取指令的局部性
-程序指令是存放在存储器中的,CPU读取这些指令的过程中评价一个程序关于取指令的局部性。
-代码区别与程序数据的一个重要属性就是在运行时指令是不能被修改的。 - 存储器层次结构
-缓存命中
-缓存不命中
-替换策略:决定替换哪个块
-随机替换策略:随机选择一个牺牲块
-最近最少被使用替换策略(LRU):选择最后被访问的时间距现在最远的块
总结与反思
不知不觉学期已过半,对这门课的情绪一直在变化。还记得第一周,还没从手忙脚乱的电工实习中缓过劲就忙碌于每周发布的各种课程任务,所以对这门课、还有老师特殊的教学方式产生不小的抵触。每周做任务很煎熬然而必须要做。但是随着一周又一周过去,我渐渐习惯了这种每周都花固定时间来学习的生活。实话说大学以来我的学习能力下降了太多太多,积极性主动性什么的更是几乎消磨殆尽,而这种“使自主”学习方式,让我每天都想着还要学习还要学习,这种态度的转变我觉得是最大的收获。
在实际学习中,娄老师提供了很多新式的平台方式,实验楼自主实验、博客借鉴、小组论坛讨论、合作完成家庭作业等,除去学校网速限制以外我从中受益很多。以前学习遇到问题可能直接就放弃了,等老师课上讲或者问同学,甚至直接跳过。而现在,总是会先自己想想如何解决,然后发到论坛中,和老师同学分享自己的思路,不同的思维碰撞之后得到正确的解答,这样对问题的记忆极其深刻永远不会忘。好的学习方法对学习效果有太大的提升。
反思自己,我觉得我最大的问题还是自制力差,容易分心,遇到问题容易烦躁然后思维就转移了不专注了。现在跟着老师的新方式学习有些改观,加上自己的克制比如去学习不带手机,可以说比之前好很多。我觉得连续学习两小时中第二个小时要比第一个小时效率高很多,在以后的学习中要继续克制继续克制,多利用第二个小时。
课程建议
老师这种教学改革刚开始感觉很煎熬,但一旦习惯了才发现这样才是真正的事半功倍。如果不是这种每周任务制,大部分人到了期末都是恶补,不仅熬夜耗时间耗精力重点是还学不到东西。而现在这种方式大家的学习积极性都很高,主动抢题主动查实验,做的任务多得分就高,公平又高效。希望老师您讲课的时候重点的地方可以说的稍微慢一点。