20145219 《信息安全系统设计基础》期中总结
20145219 《信息安全系统设计基础》期中总结
教材学习内容总结
Linux命令
-
man -k
1、查找含有关键字的内容
2、与管道命令结合使用:
man -k k1 | grep k2 | grep k3 ...
3、查看某命令在指定区段内的解释:
man 区段号 命令
8个区段:
1 Linux中的一般命令 2 系统调用 3 库函数,涵盖了C语言的标准函数库 4 特殊文件(通常是/dev中的设备)和驱动程序 5 文件格式和约定 6 游戏和屏保 7 杂项 8 系统管理命令和守护进程
-
cheat
1、以举例的方式告诉我们某个命令或者函数的用法。
-
grep -nr XXX /usr/include
1、查找某个宏。
2、参数
-n:在显示符合范本样式的那一列之前,标示出该列的列数编号。 -r:为递归查找
-
其它
- find 一般查找
- locate 急速查找
- whereis 查找文件所在文件夹
- which 查找可执行文件所在文件夹
- who 查看用户
- su 创建用户
- groups 创建用户组
- sudo deluser 删除用户
- ls 列出并显示当前目录下的文件
- cd <文件路径> 进入文件
- touch 创建空白文件
- mkdir 创建一个空目录
- cp <文件名> <目标路径> 复制一个文件或目录到指定目录
- rm 删除一个文件或目录
- mv <源目录文件> <目的目录> 移动文件(剪切);mv <旧的文件名> <新的文件名> 重命名
- cat为正序显示,tac倒序显示
-
常用快捷键
按键 作用 Ctrl+c 强行终止当前程序 Ctrl+d 键盘输入结束或退出终端 Ctrl+s 暂定当前程序,暂停后按下任意键恢复运行 Ctrl+z 将当前程序放到后台运行,恢复到前台为命令fg Ctrl+a 将光标移至输入行头,相当于Home键 Ctrl+e 将光标移至输入行末,相当于End键 Ctrl+k 删除从光标所在位置到行末 Alt+Backspace 向前删除一个单词 Shift+PgUp 将终端显示向上滚动 Shift+PgDn 将终端显示向下滚动 Tab 进行命令补全 方向上键 恢复你之前输入过的命令
-
通配符
字符 含义 * 匹配 0 或多个字符 ? 匹配任意一个字符 [list] 匹配 list 中的任意单一字符 [!list] 匹配 除list 中的任意单一字符以外的字符 [c1-c2] 匹配 c1-c2 中的任意单一字符 如:[0-9] [a-z] {string1,string2,...} 匹配 sring1 或 string2 (或更多)其一字符串 {c1..c2} 匹配 c1-c2 中全部字符 如{1..10}
编译程序
-
vi
1、六种模式
- 普通模式
- 插入模式:按i键进入,按esc键退出
- 可视模式
- 选择模式
- 命令行模式:从普通模式输入:进入命令行模式
- Ex模式
2、游标移动
按键 说明 h 左 l 右(小写L) j 下 k 上 w 移动到下一个单词 b 移动到上一个单词
3、插入
命令 说明 i 在当前光标处进行编辑 I 在行首插入 A 在行末插入 a 在光标后插入编辑 o 在当前行后插入一个新行 O 在当前行前插入一个新行 cw 替换从光标所在位置后到一个单词结尾的字符
4、退出
命令 说明 :q! 强制退出,不保存 :q 退出 :wq! 强制保存并退出 :w <文件路径> 另存为 :saveas 文件路径 另存为 :x 保存并退出 :wq 保存并退出
5、删除
命令 说明 x 删除游标所在的字符 X 删除游标所在前一个字符 Delete 同x dd 删除整行 dw 删除一个单词(不适用中文) d$或D 删除至行尾 d^ 删除至行首 dG 删除到文档结尾处 d1G 删至文档首部
6、行间跳转
命令 说明 nG(n Shift+g) 游标移动到第 n 行(如果默认没有显示行号,请先进入命令模式,输入:set nu以显示行号) gg 游标移动到到第一行 G(Shift+g) 到最后一行
7、行内跳转
命令 说明 w 到下一个单词的开头 e 到下一个单词的结尾 b 到前一个单词的开头 ge 到前一个单词的结尾 0或^ 到行头 $ 到行尾 f<字母> 向后搜索<字母>并跳转到第一个匹配的位置(非常实用) F<字母> 向前搜索<字母>并跳转到第一个匹配的位置 t<字母> 向后搜索<字母>并跳转到第一个匹配位置之前的一个字母(不常用) T<字母> 向前搜索<字母>并跳转到第一个匹配位置之后的一个字母(不常用)
8、复制、粘贴、剪切
命令 说明 yy 复制游标所在的整行(3yy表示复制3行) y^ 复制至行首,或y0。不含光标所在处字符。 y$ 复制至行尾。含光所在处字符。 yw 复制一个单词。 y2w 复制两个单词。 yG 复制至文本末。 y1G 复制至文本开头。 p(小写) 粘贴至光标后(下) P(大写) 粘贴至光标前(上) dd 删除命令就是剪切
9、替换和撤销
命令 说明 r+<待替换字母> 将游标所在字母替换为指定字母 R 连续替换,直到按下Esc cc 替换整行,即删除游标所在行,并进入插入模式 cw 替换一个单词,即删除一个单词,并进入插入模式 C(大写) 替换游标以后至行末 ~ 反转游标所在字母大小写 u{n} 撤销一次或n次操作 U(大写) 撤销当前行的所有修改 Ctrl+r redo,即撤销undo的操作
10、缩进
命令 说明 >> 整行将向右缩进 << 整行向左回退 :ce(center) 使本行内容居中 :ri(right) 使本行文本靠右 :le(left) 使本行内容靠左
11、查找
命令 说明 /icmp 查找字符串icmp n 查找下一个icmp ?tcp 向上查找字符串tcp N 查找上一个出现的tcp \* 寻找游标所在处的单词 \#同上 但 \* 是向前(上)找,\#则是向后(下)找 g\*同\* 但部分符合该单词即可 g\#同\# 但部分符合该单词即可
-
gcc
1、编译过程:原文件->预处理->编译->汇编->连接->可执行文件
预处理:gcc –E xxx.c –o xxx.i 编 译:gcc –S xxx.i –o xxx.s 汇 编:gcc –c xxx.s –o xxx.o 链 接:gcc xxx.o –o xxx 运行可执行文件 ./xxx 一步编译:gcc xxx.c -o xxx
-
gdb
1、进入GDB
gcc -g xxx.c -o xxx gdb xxx
2、gdb调试
(gdb) l 进行行号提示 (gdb) b n 在第n行设置断点 (gdb) r 运行代码,运行至断点处 (gdb) n 单步运行 (gdb) c 使程序继续往下运行,直到再次遇到断点或程序结束 (gdb) q 退出GDB (gdb) watch n 在"n"设置了观察点,观察变量的变化情况
3、四种断点
函数断点:b 函数名 条件表达式 行断点:b 行数或函数名 条件表达式 条件断点:b 行数或函数名 if表达式 临时断点:tbreak 行数或函数名 条件表达式
-
make
1、用途:实现自动化编译
2、Makefile的一般写法:
test(目标文件): prog.o code.o(依赖文件列表) tab(至少一个tab的位置) gcc prog.o code.o -o test(命令) .......
教材内容
-
ch01:计算机系统漫游
1、信息=位+上下文
系统中所有信息的都是由一串位表示的,区分不同数据对象的唯一方法是它的上下文。
2、存储系统核心思想———缓存
3、操作系统核心抽象:文件、虚存、进程、虚拟机
4、查看源文件用od 命令 :
od -tc -tx1 hello.c
-
ch02:信息的表示和处理
1、三种数字:无符号数、有符号数(2进制补码)、浮点数
进制转换:拿二进制作中间结果
2、信息存储
gcc -m32
可以在64位机上(比如实验楼的环境)生成32位的代码字节顺序:是网络编程的基础
两种字节顺序:
- 小端是“高对高、低对低”
- 大端是“高对低、低对高”
区别:逻辑运算(结果是1或0)和位运算(结果是位向量)
只要一个与非门,就可以完成所有的逻辑运算。
掩码是位运算的重要应用,对特定位可以置一,可以清零
3、整数表示与运算
C语言中有符号数和无符号数的转换规则,位向量不变——信息就是位+上下文。
0扩展和符号扩展:
- 零扩展:要将一个无符号数转换为一个更大的数据类型,只需简单的最高位前加0。
- 符号扩展:将一个补码数字转换为一个更大的数据类型,在表示中添加最高有效位值的副本。
截断数字:截断一个数字可能会改变其值,这也是值溢出的一种形式。
计算机执行的“整数运算”实际上是一种模运算。
表示数字的有限字长限制了可能的值的取值范围。
无论运算数是以无符号形式还是补码形式表示,都有完全一样或者非常类似的位级行为。
4、浮点数——IEEE浮点表示
IEEE浮点标准用
V = (-1)^s × M × 2^E
的形式来表示一个数三个参数:
- 符号:s决定这个数是负数(s=1)还是正数(s=0),而对于数值0的符号位解释作为特殊情况处理。
- 尾数:M是一个二进制小数,它的范围是1~2-ε,或者是0~1-。
- 阶码:E的作用是对浮点数加权,这个权重是2的E次幂(可能是负数)。
将浮点数的位表示划分为三个字段,分别对这些值进行编码:
- 一个单独的符号位s直接编码符号s。
- k位的阶码字段exp = ek-1…e1e0编码阶码E。
- n位小数字段frac = fn-1…f1 f0编码尾数M,但是编码出来的值也依赖于阶码字段的值是否等于0。
5、补码:是利用寄存器的长度是固定的特性简化数学运算,只要一个加法器就可以实现所有的数学运算。
-
ch03:程序的机器级表示
1、ISA指令集体系结构
机器级程序的格式和行为,它定义了处理器状态、指令的格式以及每条指令对状态的影响。
- 程序计数器(通常称为PC,用%eip表示),指示将要执行的下一条指令在存储器中的地址。
- 整数寄存器文件:存储地(对应于C语言的指针)或整数数据。
- 条件码寄存器:保存着最近执行的算数或逻辑指令的状态信息,用来实现控制或者数据流中的条件变化。
- 浮点寄存器:用来存放浮点数据。
2、用objdump -d xxx.o -o xxx.s 反汇编
3、leal,从存储器读数据到寄存器,而从存储器引用的过程实际上是将有效地址写入到目的操作数。目的操作数必须是一个寄存器。
4、栈帧
栈帧结构
- 为单个过程分配的栈叫做栈帧,寄存器%ebp为帧指针,而寄存器指针%esp为栈指针,程序执行时栈指针移动,大多数信息的访问都是相对于帧指针。
- 栈向低地址方向增长,而栈指针%esp指向栈顶元素。
转移控制
- call:目标是指明被调用过程起始的指令地址,效果是将返回地址入栈,并跳转到被调用过程的起始处。
- ret:从栈中弹出地址,并跳转到这个位置。
- 函数返回值存在%eax中
-
ch04:处理器体系结构
1、Y86指令集体系结构
程序员可见的状态(Y86程序中的每条指令都会读取或修改处理器状态的某些部分)
- 8个程序寄存器:%eax,%ecx,%edx,%ebx,%esi,%edi,%esp和%ebp。
- 条件码:ZF(零)、SF(符号)、OF(有符号溢出)
- 程序计数器(PC):存放当前正在执行的指令的地址
- 存储器:很大的字节数组,保存着程序和数据。Y86系统用虚拟地址来引用存储器的位置,硬件和操作系统软件联合起来将虚拟地址翻译成实际或者物理地址。
- 状态码(stat):表明程序执行的总体状态。(异常处理)
2、指令编码规则
高4位为代码部分,低四位为功能部分
状态码:描述程序执行的总体状态。
值 名字 含义 1 AOK 正常操作 2 HLT 处理器执行halt指令(指令停止) 3 ADR 遇到非法地址 4 INS 遇到非法指令
3、逻辑设计和硬件控制语言HCL
实现一个数字系统:
- 计算对位进行操作的函数的组合逻辑
- 存储位的存储器元素
- 控制存储器元素更新的时钟信号
-
ch06:存储器层次结构
1、三种常见存储技术:RAM/ROM/磁盘
2、随机访问存储器(RAM)
- 静态RAM(SRAM)
- 动态RAM(DRAM)
2、非易失性存储器(ROM)
- 可编程ROM(PROM):只能被编程一次。PROM每个存储单元有一种熔丝,只能用高电流熔断一次。
- 可擦写可编程ROM(EPROM):紫外线光照射过窗口,EPROM就被清除为0,被擦除和重编程的次数为1000次。
- 电子可擦除ROM(EEPROM):不需要一个物理上独立的编程设备,因此可以直接在印制电路卡上编程,能够编程的次数为10^5。
- 闪存:基于EEPROM,为大量的电子设备提供快速而持久的非易失性存储。
3、磁盘
- 磁盘结构:盘片、磁道、扇区、间隙、柱面
- 磁盘容量:记录密度、磁道密度、面密度
- 访问时间:寻道时间+旋转时间+传送时间
- 访问磁盘:CPU使用一种称为存储器映射I/O的技术向I/O设备发出命令,地址空间中为I/O设备通信保留的地址称为I/O端口。
4、数据总线、控制总线、地址总线
系统总线、存储总线、I/O总线
5、读写事务:
- 读事务,从主存传数据到CPU;
- 写事务,从CPU传数据到主存。
6、局部性原理:一个编写良好的计算机程序倾向于引用邻近于其他最近引用过的数据项,或者最近引用过的数据项本身。有良好局部性的程序比局部性差的程序运行的更快,在硬件层引入高速缓存存储器就体现了局部性原理。
7、对程序数据引用的局部性
- 时间局部性(temporal locality):被引用过一次的存储器位置在未来会被多次引用(通常在循环中)。
- 空间局部性(spatial locality):如果一个存储器的位置被引用,那么将来他附近的位置也会被引用。
9、取指令的局部性
- 程序指令是存放在存储器中的,CPU读取这些指令的过程中评价一个程序关于取指令的局部性。
- 代码区别与程序数据的一个重要属性就是在运行时指令是不能被修改的。
10、良好的局部性程序:
- 重复引用同一个变量的程序有良好的时间局部性
- 对于具有步长为k的引用模式的程序,步长越小,空间局部性越好。
- 对于取指令来说,循环具有良好的时间和空间局部性。循环体越小,迭代次数越多局部性越好。
11、存储器层次结构中心思想:每层存储设备都是下一层的“缓存”
12、缓存命中:当程序需要第k+1层的某个数据对象d时,首先在当前存储的第k层的一个块中查找d,如果d刚好在第k层中,则称为缓存命中。命中率:1-不命中率
缓存不命中:如果k层中没有缓存数据d,则称为缓存不命中,此时要从k+1层取出包含d的块,可能会覆盖(替换/驱逐)现在的一个块(牺牲块)。决定该替换哪个快是缓存的替换策略来控制的。不命中率:不命中数量/引用数量
13、缓存不命中的种类
- 强制性不命中/冷不命中:第k层缓存是空的(冷缓存),只是短暂的状态,不会在反复访问存储器使得缓存暖身之后的稳定状态出现。
- 冲突不命中:第k+1层的第i块,必须放置在第k层的块(i mod 4)中,这种限制性的放置策略引起冲突不命中。
14、高速缓存存储器结构
高速缓存的结构用元组(S,E,B,m)来描述,高速缓存的大小
C = S * E * B
- s个组索引位:一个无符号整数,说明字必须存储在哪个组中。
- t个标记位:组中的哪一行包含这个字。
- b个块偏移位:在B个字节的数据块中的字偏移。
-
ch07:链接
1、链接器的两个任务
- 符号解析
- 重定位
2、目标文件的三种形式
- 可重定位目标文件
- 可执行目标文件
- 共享目标文件
3、目标文件格式
- a.out 可执行文件
- COFF 一般目标文件格式
- PE 可移植可执行文件格式
- ELF 可执行可连接文件格式
4、readelf命令:用于显示一个/多个elf格式目标文件的信息
5、全局符号
- 强符号:函数和已经初始化的全局变量
- 弱符号:未初始化的全局变量
规则:
- 不允许有多个强符号
- 若有一个强符号和多个弱符号,选强符号
- 若有多个弱符号,任选一个
6、处理目标文件的工具
- AR 创建静态库,插入、删除、列出和提取成员
- STRINGS 列出一个目标文件中所有可打印的字符串
- STRIP 从目标文件中删除符号表中定义的符号
- NM 列出一个目标文件中节的名字和大小
- READELF 显示一个目标文件的完整结构
- OBJDUMP 二进制工具之母,可以显示一个目标文件中所有的信息
考题总结(同时参考13、14级考试题)
man
- man 判断:Linux Bash中, 可以使用man printf查看C语言中printf函数的帮助文档。 (x)【man 3 printf】
- man 判断:Linux Bash中, man printf和man 1 printf 功能等价。(√)
- man -k 填空: 数据结构中有二分查找算法,C标准库中有这个功能的函数,这个函数是(bsearch)
- 在vim中,查看printf man pages(帮助文档)的命令是?【3K】
- 在vim中,查看scanf man pages(帮助文档)的命令是?【K】
- man -k 填空: 数据结构中有线性查找算法,C标准库中没有这个功能的函数,但Linux中有,这个函数是(lfind或lsearch)【man -k line |grep search 即可找到】
- man -k 填空:Linux中显示文件(file )属性(status)的命令是( stat )【man -k file |grep status 即可找到】
- man -k 填空:Linux中查找配置(configure)网卡(interface)的命令是(man –k configure | grep interface )
cheat
- cheat 填空:Linux Bash中,(cheat find )命令可以查年find命令的使用示例。
- cheat 填空:实现“Display files,Sorted by size”功能的ls命令是 ( ls –S )【cheat ls即可寻找到答案】
- cheat 填空:To list the content of /path/to/foo.tgz archive using tar ( tar -jtvf /path/to/foo.tgz )【cheat tar即可寻找到答案】
grep
- 填空:Linux Bash中,使用grep查找当前目录下*.c中main函数在那个文件中的命令是( grep main *.c )
- grep 填空:查找宏 STDOUT_FILENO 的值的命令是(grep -nr STDOUT_FILENO /usr/include)
gcc
- CH01填空:GCC编译程序的过程分为(预处理、编译、汇编、链接)四个阶段。
- CH07 判断:gcc –c hello.c 产生的hello.o是可重定位目标文件。(ok)
- CH02 填空:GCC中INFINITY表示(无穷大)。
- ch07 填空:gcc -f PIC xxx.c 中的PIC的意思是(位置无关的代码 or Position-Independent Code)
- CH03 填空:在64位机器上,要用gcc编译出32位机器码,需要使用(-m32) 选项
gdb
- gdb 填空:gdb中使用命令( break main 或 b main ) 设置main函数断点。
- gdb 填空:gdb中使用命令( until ) 可以跳出循环语句。
- gdb 判断: gdb中next和step都可以单步跟踪,根据自顶向下原则应该优先选用next. ( ok )
- CH03 填空:GDB中以16进制形式打印%eax中内容的命令是(print /x $eax)
编译、调试程序练习题(使用13级练习题做示例,因为14级练习题没有程序代码图,但两者套路一样只是变了一些函数)
-
编译和运行以上代码的命令(2分)
gcc *.c -o main ./main
-
使用GDB调试以上代码:编译代码的命令是?main.c中如何给main函数设置断点?如何在第六行设置断点?
gcc -g *.c -o main b main b 6
-
除了main.c外,其他4个模块(add.c sub.c mul.c div.c)的源代码不想给别人,如何制作一个mymath.a静态库?main.c如何使用mymath.a?(3分)
gcc -c add.c sub.c mul.c div.c ar rcvs libmymath.a add.o sub.o mul.o div.o gcc main.c -o main -L. -lmymath (or gcc main.c ./libmymath.a -o main)
-
除了main.c外,其他4个模块(add.c sub.c mul.c div.c)的源代码不想给别人,如何制作一个mymath.so共享库?main.c如何使用mymath.so?(4分)
gcc -fPIC -c add.c sub.c mul.c div.c gcc -shared -o libmymath.so add.o sub.o mul.o div.o gcc -o main main.c -L. -lmymath libmymath.so 要拷贝到/lib or /usr/lib
-
写出编译上面代码的makefile,编译出来的目标文件为
testmymath, 只用显式规则就可以.(4分)testmymath: main.o add.o sub.o mul.o div.o gcc main.o add.o sub.o mul.o div.o -o testmymath main.o: main.c head.h gcc -c main.c add.o: add.c head.h gcc -c add.c sub.o: sub.c head.h gcc -c sub.c mul.o: mul.c head.h gcc -c mul.c div.o: div.c head.h gcc -c div.c
其他(感悟、思考等,可选)
收获
本次期中总结,让我有机会回顾之前半学期学习的知识,再一次加深已熟练运用知识的同时,我也弥补了一些以前学习所遗留的漏洞。例如,之前学习制作静态库、共享库的时候只是粗略的看了一遍,不太了解其中的原理,这一次仔细理解了一下两者的使用、区别、制作等相关知识,有了新的收获。除此之外,复习考试题目也纠正了之前在知识理解上的某些错误。
不足
人无完人,必然存在不足,但是要有自知之明并勇于改正,让自己变得更好。此次复习,我发现以前的学习过程中的一些问题:1、对一些相对较学术性的话语理解不足,有时读了几遍都读不懂就强迫自己记下来结论,这就导致我很容易忘记这部分不理解的知识;2、有一些遗留问题没有及时解决,就一天一天的拖了下来。以后要及时弥补遗留问题,不再拖拉。
课程建议和意见
1、前期(第1、2、3周)每周的任务量相对太大。例如第一周,学习Linux命令,实验楼的《Linux基础入门》课程一共有17节,全部学习并练习有很大的压力,基本就是学着后边儿忘着前边儿,全学完也记不住什么东西。老师说这个可以以后不断熟练,但既然不急着一次掌握所有内容,为什么不把这部分内容分成多次,每周少布置一点儿书本上的内容再学《Linux基础入门》的3、5节课程并要求掌握呢?我觉得这样同学们对于这些命令的掌握会更好。
2、每周基本都是一章的学习量,但是并不是每一章的任务量都是均衡的,有些章节简单易懂,有些章节就是写的很晦涩难懂,如果难的内容恰巧都集中在一周,那简直就是急死人了!希望老师每周的任务量布置能更科学一些。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第零周 | 0/0 | 1/1 | 15/15 | 安装虚拟机 |
第一周 | 0/0 | 1/2 | 25/40 | 学习Linux命令 |
第二周 | 62/62 | 1/3 | 25/65 | 学习C编程 |
第三周 | 176/238 | 1/4 | 20/85 | 学习数的表示和计算 |
第五周 | 57/295 | 1/5 | 20/105 | 学习汇编语言,了解逆向思想 |
第六周 | 150/445 | 1/6 | 25/130 | 学习Y86处理器和HCL硬件描述语言 |
第七周 | 115/560 | 1/7 | 20/150 | 学习存储器相关知识 |
第八周 | 0/560 | 2/9 | 30/180 | 期中总结 |