信息安全系统设计基础 期中总结
知识点总结
第一周
l Man命令:man
是manul的缩写,我们可以通过man man来查看man
的帮助,如下图: man
有一个-k
选项用起来非常好,这个选项让你学习命令,编程时有了一个搜索引擎,可以举一反三。 我们通过一个例子来说明,比如数据结构中学过排序(sort),我不知道C语言中有没有完成这个功能的函数,可以通过“man -k sort”来搜索,因为是找C库函数,我们关注带3的,qsort好像是个好选项。
l Cheat命令:cheat是作弊,小抄的意思。cheat命令是在GNU通用公共许可证下,为Linux命令行用户发行的交互式备忘单应用程序。它提供显示Linux命令使用案例,包括该命令所有的选项和简短但尚可理解的功能。
l find查找一个文件在系统中的什么位置,locate是神速版本的find(Windows下有个Everything工具和locate类似).grep 可以对文件全文检索,支持正则表达式,正则表达式也是一个重要的元知识whereis,which告诉你使用的命令工具装在什么地方。
Linux基础:1)重要快捷键:
l [tab]补全命令,补全目录,补全命令参数等等
l [Ctrl+c]强行终止当前程序,不退出终端
l [Ctrl+d] 键盘输入结束或退出终端
l [Ctrl+s] 暂定当前程序,暂停后按下任意键恢复运行
l [Ctrl+z] 将当前程序放到后台运行,恢复到前台为命令fg
l [Ctrl+a] 将光标移至输入行头,相当于Home键
l [Ctrl+e] 将光标移至输入行末,相当于End键
l [Ctrl+k] 删除从光标所在位置到行末
l [Alt+Backspace] 向前删除一个单词
l [Shift+PgUp] 将终端显示向上滚动
l [Shift+PgDn] 将终端显示向下滚动
2) 历史输入命令
l ↑可以恢复你输入过的指令
3) 通配符
l 通配符是一种特殊语句,主要有星号(*)和问号(?),用来对对字符串进行模糊匹配(比如文件名,参数名)。当查找文件夹时,可以使用它来代替一个或多个真正字符;当不知道真正字符或者懒得输入完整名字时,常常使用通配符代替一个或多个真正的字符。
l grep命令的常用参数:
参数 说明
-b 将二进制文件作为文本来进行匹配
-c 统计以模式匹配的数目
-i 忽略大小写
-n 显示匹配文本所在行的行号
-v 反选,输出不匹配行的内容
-r 递归匹配查找
-A n n为正整数,表示after的意思,除了列出匹配行之外,还列出后面的n行
-B n n为正整数,表示before的意思,除了列出匹配行之外,还列出前面的n行
--color=auto 将输出中的匹配项设置为自动颜色显示
第二周
l Vim编辑器:
1.普通模式
Vim的普通模式用的编辑器命令,比如移动光标,删除文本等等。这也是Vim启动后的默认模式,而不是大多数编辑器的插入模式。
普通模式命令往往需要一个操作符结尾。
普通模式进入插入模式的方法:a键(append/追加)键或者i(insert/插入)键。
2.插入模式
在这个模式中,大多数按键都会向文本缓冲中插入文本。大多数新用户希望文本编辑器编辑过程中一直保持这个模式。
插入模式中回到普通模式:ESC键。
3.可视模式
与普通模式类似,但移动命令会扩大高亮的文本区域。高亮区域可以是字符、行或者是一块文本。当执行一个非移动命令时,命令会被执行到这块高亮的区域上。
4.选择模式
这个模式中,可以用鼠标或者光标键高亮选择文本。
如果输入任何字符,Vim会用这个字符替换选择的高亮文本块,并且自动进入插入模式。
5.命令行模式
在命令行模式中可以输入会被解释成并执行的文本。例如执行命令(:键),搜索(/和?键)或者过滤命令(!键)。
在命令执行之后,Vim返回到命令行模式之前的模式,通常是普通模式。
6.Ex模式(Ex mode)
这和命令行模式比较相似,在使用:visual命令离开Ex模式前,可以一次执行多条命令。
l 编译器GCC
1.安装gcc的头文件、库文件
sudo apt-
getinstall build-essential
安装到usr/lib中,到usr/bin中(可执行文件),到usr/include中(头文件)
2.GCC选项列表
(1)常用选项
-
c 只编译不链接,生成目标文件.o
-
S 只编译不汇编,生成汇编代码
-
E 只进行预编译,不做其他处理
-
g 在可执行程序中包含标准调试信息
-
o file 将file文件指定为输出文件
-
v 打印出编译器内部编译各过程的命令行信息和编译器的版本
-
I dir 在头文件的搜索路径列表中添加dir目录
(2)库选项
-
static 进行静态编译,即链接静态库,禁止使用动态库
-
shared 1.可以生成动态库文件
2.
进行动态编译,尽可能的链接动态库,没有动态库时才会链接同名静态库
-
L dir 在库文件的搜索路径列表中添加dir目录
-
lname 链接称为libname.a或者libname.so的库文件。
如果两个库文件都存在,根据编译方式是static还是shared进行链接
-
fPIC 生成使用相对地址的位置无关的目标代码,
(-fpic)
然后通常使用gcc的-static选项从该pic目标文件生成动态库文件。
3.编译过程
预处理:gcc –
Ehello.
c–o hello.i; gcc –
E调用cpp 生成中间文件
编 译:gcc –
Shello.i –o hello.s; gcc –
S调用ccl 翻译成汇编文件
汇 编:gcc –
chello.s –o hello.o; gcc -
c
调用
as
翻译成可重定位目标文件
链 接:gcc hello.o –o hello ; gcc -o 调用ld** 创建可执行目标文件
-o后面是接的你给生成的文件指定的名字,如果不指定,则默认为a.out
在命令行上运行这个可执行目标文件需要输入它的名字:
./
a.out
为什么?
Window下,搜索一个东西会从当前目录下,找不到去PATH环境变量中找;Linux下只从PATH环境变量中找,所以即使当 前目录有,也要指出来; "."表示当前目录,“./libvector.a” 表示用当前目录下的libvector.a库文件。 凡是不带前缀的,都是PATH中有,但不安全。
所以其实这行代码只是在输入它的名字, ./ 表示当前目录
外壳调用操作系统中一个叫加载器的函数,拷贝可执行文件p中的代码和数据到存储器,然后将控制转移到这个程序的开头。
技巧:前三步,GCC的参数连起来是“ESc”,相应输入的文件的后缀是“iso”
l 调试工具gdb
使用GCC编译时要加“-g”参数
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 [
行数或函数名]
<条件表达式>
l Make和Makefile
make工具最主要也是最基本的功能就是根据makefile文件中描述的源程序至今的相互关系来完成自动编译、维护多个源文件工程。
而makefile文件需要按某种语法进行编写,文件中需要说明如何编译各个源文件并链接生成可执行文件,要求定义源文件之间的依赖关系。
最终实现——自动化编译
进入Makefile?
$ vim
Makefile
1.Makefile 基本规则
Makefile的一般写法:
一个Makefile文件主要含有一系列的规则,每条规则包含以下内容:
- 需要由make工具创建的目标体,通常是可执行文件和目标文件,也可以是要执行的动作,如‘clean’;
- 要创建的目标体所依赖的文件,通常是编译目标文件所需要的其他文件。
- 创建每个目标体时需要运行的命令,这一行必须以制表符TAB开头
第三周
l 第二章 信息的表示和处理
字
字长决定虚拟地址空间的最大大小。
字长为w,虚拟地址的范围为1-(2^w-1)
w=32或64:也就是我们通常所说的电脑是32位还是64位。也可以理解为CPU一次处理数据的位数。
布尔代数
常用运算符号:
与: &
或: |
非: ~
异或:^
逻辑运算
逻辑运算符
与:&&
或:||
非:!
左移<<
x<>
右移分为逻辑右移和算术右移。
逻辑右移:
在左端补k个0,多用于无符号数移位运算
- 算术右移:
在左端补k个最高有效位的值,多用于有符号数移位运算。
第四周
l 第三章 程序的机器级表示
机器级编程的两种抽象
(1)指令集结构ISA
是机器级程序的格式和行为,定义了处理器状态、指令的格式,以及每条指令对状态的影响。
(2)机器级程序使用的存储器地址是虚拟地址
看上去是一个非常大的字节数组,实际上是将多个硬件存储器和操作系统软件组合起来。
操作数的三种类型
- 立即数
- 寄存器
- 存储器
2.结果存放的两种可能
- 寄存器中
- 存储器中
3.寻址方式
(1)立即数寻址方式
格式:$后加用标准c表示法表示的整数,如$0xAFF
(2)寄存器寻址方式
如%eax,与汇编中学过的AX寄存器类比。
(3)存储器寻址方式
- · 直接寻址方式
- · 寄存器间接寻址方式
- · 寄存器相对寻址方式
- · 基址变址寻址方式
- · 相对基址变址寻址方式
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翻译。
栈帧结构
栈用来传递参数、存储返回信息、保存寄存器,以及本地存储。
1.栈帧
为单个过程分配的那部分栈称为栈帧,通用结构见149页
所以本质上栈帧还是栈。
2.两个指针
最顶端的栈帧以两个指针界定:
寄存器%ebp-帧指针
寄存器%esp-栈指针
栈指针可移动,所以信息访问多相对于帧指针。
3.调用的过程
课本150页过程P调用过程Q的示例。
调用者的帧应该在被调用者的下面,并且调用者返回地址是它的栈帧末尾,这样可以保证被调用者执行完毕全都出栈后,程序能够继续向下执行。
关于被调用者Q用栈的几个用处:
1.保存不能存放在寄存器中的局部变量。
当要对一个局部变量使用地址操作符&的时候,就必须要为它生成一个地址,所以要入栈。这个用法!以前没见过!
2.存放它调用的其他过程的参数。
第五周
第四章处理器体系结构
Y86指令
Y86指令集基本上是IA32指令集的一个子集,只包括四字节整数操作,寻址方式比较少,操作也较少。
汇编码表示和字节编码参见课本232页。
指令的字节级编码
每条指令需要1-6个字节不等,每条指令的第一个字节表明指令的类型。
1.第一个字节
这个字节分为两个部分,每个部分4位:
- 高四位:代码部分,值域为0~0xB
- 第四位:功能部分,功能值只有在一组相关指令共用一个代码时才有用。
Y86异常
1.状态码Stat的可能取值
Stat描述程序执行的总体状态
1.AOK
正常操作
2.HLT
处理器执行halt指令
3.ADR
遇到非法地址
4.INS
遇到非法指令
2.出现异常时?
Y86——处理器停止运行指令。
.Y86和IA32的区别
1.Y86
有时需要两条指令来完成IA32一条指令就能完成的事
2.Y86
没有伸缩寻址模式
将处理组织成阶段
(一)六个基本阶段:
- 取指
- 译码
- 执行
- 访存
- 写回
- 更新PC
第六周
第六章存储器层次结构
随机访问存储器(RAM)
RAM分类:
- 静态的SRAM-更快,更贵,作为高速缓存存储器,CPU片上或片下
- 动态的DARM-作为主存以及图形系统的帧缓冲区
1.传统的DRAM
(1)超单元
- 芯片中的单元位被分为d个超单元,每个超单元有w个DRAM单元组成,一个dxw的DRAM总共存储了dw位信息。
- 超单元被组织成一个r行c列的长方形,即rc=d。
- 每个超单元有形如(i, j)的地址,i表示行,j表示列。
(2)信息的流入流出
信息通过引脚流入流出芯片,每个引脚携带一个1位的信号。
(3)存储控制器
这个电路可以一次传入或传出w位。
增强的DRAM
- 快页模式-FPM DRAM:允许对同一行连续的访问可以直接从行缓冲区得到服务。(原本的DRAM对同一行的四条指令时,每条指令取完后都会丢弃,然后重新读取。)
- 扩展数据输出-EDO DRAM:允许单独的CAS信号在时间上靠的更紧密一点。
- 同步-SDRAM:用与驱动存储控制器相同的外部时钟信号的上升沿来代替许多这样的控制信号-比异步的更快。
- 双倍数据速率同步-DDR SDRAM:通过使用两个时钟沿作为控制信号,从而使DRAM的速度翻倍。分类:DDR(2位),DDR2(4位),DDR3(8位)
- RDRAM
- 视频-VRAM:用在图形系统的帧缓存区中,思想类似FPM DRAM
- 非易失性存储器——ROM
RAM断电丢失数据,是易失的;
ROM是非易失的,统称为只读存储器
(1)分类
- PROM-可编程ROM,只能被编程一次
- EPROM-可擦写可编程ROM,能够被擦除和编写的次数的数量级大概为1000次
- EEPROM,电子
可擦除PROM,能够被编程的次数的数量级在10的五次方。
- (2)闪存FLASH
基于EEPROM,为大量的电子设备提供快速而持久的非易失性存储。
存在于:数码相机、手机、音乐播放器、PDA、笔记本、台式机、服务器计算机系统
(3)固件
存储在ROM设备中的程序通常被称为固件,当一个计算机系统通电以后,他会运行存储在ROM中的固件。
5.访问主存
(1)总线
总线是一组并行的导线,能携带地址、数据和控制信号。
总线分类:
a.系统总线——连接CPU和I/O桥
b.存储器总线——连接I/O桥和主存
c.I/O总线(具体见6.1.2.4)
I/O桥将系统总线的电子信号翻译成存储器总线的电子信号,也将系统总线和存储器总线连接到I/O总线。
.磁盘容量——一个磁盘上可以记录的最大位数
(1)影响因素:
- 记录密度-位/英寸
- 磁道密度-道/英寸
- 面密度-位/平方英寸
提高面密度即可提高容量。
计算公式:
3.磁盘操作
磁盘以扇区大小的块来读写数据。
访问时间的分类:
(1)寻道时间
2)旋转时间
3)传送时间
局部性原理:
一个编写良好的计算机程序,常常倾向于引用临近于其他最近引用过的数据项的数据项,或者最近引用过的数据项本身。
分类:
- 时间局部性
- 空间局部性
缓存
高速缓存:是一个小而快速的存储设备,它作为存储在更大、更慢的设备中的数据对象的缓冲区域。
缓存:使用高速缓存的过程称为缓存。
数据总是以块大小为传送单元在第k层与第k+1层之间来回拷贝。任一对相邻的层次之间块大小是固定的,但是其他的层次对之间可以有不同的块大小。
一般来说:层越低,块越大。
缓存命中
缓存不命中
.缓存不命中的种类
(1)强制性不命中/冷不命中
2
)冲突不命中
3)容量不命中
编写高速缓存友好的代码
1.基本方法:
- 让最常见的情况运行的快
- 在每个循环内部缓存不命中数量最小
2.重要问题:
- 对局部变量的反复引用是好的(时间局部性)
- 步长为1的引用模式是好的(空间局部性)
收获总结
半个学期的学习,最大的收获应该算是心态上的改变。想想过去的两年,学习上真的是混过来的,每个期末考前突击,然后拿个及格分心满意足,什么都没学到。这个学期刚开学还想继续之前的状态,平时基本不花时间在学习上,但是又要完成老师布置的任务,每到周末都会压力很大。之后尽量跟上老师的要求,每天花点时间学习,这样做了一段时间,发现每天过的不会很空虚,也不会压力很大。现在觉得确实每天应该把学习放在第一位。
说到收获的知识,一开始几周还是没有不折不扣的完成学习任务,之后的也没有学的特别清楚,这次的知识总结基本上是把闫佳歆同学的博客学习了一遍。之后会把前面没有做好的实验补上,也多多复习之前的知识。
自己的不足
我觉得自己的不足还是懒,懒得看书、懒得动手、懒得动脑子。就像老师说的,我遇到不会的字都不去查字典,因为我懒得查。可是这样的心态对待学习,那就等于学不到东西。在学习上真是付出了多少,就得到多少。说到改进,现在已经能越来越把心思用在学习上了,经过几周的学习,发现如果静下心,还是能把书看进去,如果自己多研究一下,实验还是能做得出来的。平时不学习,也只不过是把时间浪费在了其他地方,以此逃避学习,这样的逃避没有任何益处,与其这样不如把时间用在学习上。还有就是我遇到问题,不能解决的总是喜欢不了了之,以后会多向老师同学请教。
课程建议和意见
课程中我最喜欢的机制就是每周成绩的公布,这样能知道自己的学习情况,对教学质量的提高也有帮助。我不喜欢的地方就是我们自学的比重那么大,我更适合听讲来学习,希望之后的课程中老师能把内容讲的全面、详细一些。
参考资料:
闫佳歆同学博客 http://www.cnblogs.com/20135202yjx/
实验楼实验指导: https://www.shiyanlou.com/courses/413