20145337 《信息安全系统设计基础》第8周期中学习总结
Linux常用命令
1.man -k
- 帮助文档包括:
1是普通的Linux命令 2是系统调用,操作系统的提供的服务接口 3是库函数, C语言中的函数 5是指文件的格式,比如passwd, 就会说明这个文件中各个字段的含义 6是给游戏留的,由各个游戏自己定义 7是附件还有一些变量,比如向environ这种全局变量在这里就有说明 8是系统管理用的命令,这些命令只能由root使用,如ifconfig
- 多关键字查找:
man -k key1 | grep key2 | grep key3 | ...
2.cheat
cheat+命令
提供使用案例
3.grep
- 实现全文检索
- 例:查找main函数
grep -n main *.c
- grep支持正则表达式
grep -nr xxx /usr/include
查找某个宏
编译程序
vim
- 使用vim+文件名 进入vim界面
- 在命令行模式中输入
:e 文件路径
打开相应文件 - 插入:
i 在当前光标处进行编辑 I 在行首插入 A 在行末插入 a 在光标后插入编辑
- 保存:
:q! 强制退出,不保存 :q 退出 :wq! 强制保存并退出 :w <文件路径> 另存为 :saveas 文件路径 另存为 :x 保存并退出 :wq 保存并退出
- 删除
x 删除游标所在的字符 dd 删除整行
- 行间跳转
nG(n Shift+g) 光标移动到第n行
- 复制与粘贴
nyy 复制光标所在及其后的整行共n行 p 代表粘贴至光标后
- 功能设定
:set autoindent(ai) 设置自动缩进 :set cindent(cin) 设置C语言风格缩进 :set nu 以显示行号
gcc
- 常用选项
-c 只编译不链接,生成目标文件.o -S 只编译不汇编,生成汇编代码 -E 只进行预编译,不做其他处理 -g 在可执行程序中包含标准调试信息
- 编译过程:
- 原文件->预处理->编译->汇编->连接->可执行文件
- 预处理:gcc –E xxx.c –o xxx.i
- gcc –E调用cpp 生成中间文件
- 编 译:gcc –S xxx.i –o xxx.s
- gcc –S调用ccl翻译成汇编文件
- 汇 编:gcc –c xxx.s –o xxx.o
- gcc -c调用as翻译成可重定位目标文件
- 链 接:gcc xxx.o –o xxx
- gcc -o调用ld**创建可执行目标文件
- 运行可执行文件 ./xxx
在命令行上运行这个可执行目标文件需要输入它的名字(-o后若不指定生成文件名,则默认为a.out)
GDB调试
- 基本命令
- 进入GDB
gcc -g xxx.c -o xxx gdb xxx
- 查看源码
- `(gdb) l 进行行号提示
(gdb) b n 在第n行设置断点
(gdb) r 运行代码,运行至断点处
(gdb) n 单步运行
(gdb) c 使程序继续往下运行,直到再次遇到断点或程序结束
(gdb) q 退出GDB
(gdb) watch n 在"n"设置了观察点,观察变量的变化情况`
- 四种断点
- 函数断点
- b 函数名 条件表达式
- 行断点
- b 行数或函数名 条件表达式
- 条件断点
- b 行数或函数名 if表达式
- 临时断点
- tbreak 行数或函数名 条件表达式
makefile
-
用途:实现自动化编译
-
格式:
-
target(目标文件) : prerequisites(要生成那个target所需要的文件或是目标)
command(任意的Shell命令,就是make需要执行的命令) -
这是一个文件的依赖关系,也就是说,target这一个或多个的目标文件依赖于prerequisites中的文件,其生成规则定义在command中。
-
Makefile中的宏,也称作变量,有两种定义方式
- 递归展开方式 VAR=var
- 简单方式 VAR:=var
- 使用变量的格式为
$(VAR)`
教材
习题
知识点总结
信息的表示和处理
- 缓冲区溢出漏洞:人为的溢出是有一定企图的,攻击者写一个超过缓冲区长度的字符串,植入到缓冲区这时可能会出现两种结果:一是过长的字符串覆盖了相邻的存储单元,引起程序运行失败,严重的可导致系统崩溃;另一个结果就是利用这种漏洞可以执行任意指令,甚至可以取得系统root特级权限。
- 最低有效字节在最前面的方式称为小端法,最高有效字节在最前面的方式称为大端法。字节顺序是网络编程的基础,小端是“高对高、低对低”,大端与之相反。
- 逻辑运算符和对应的位运算之间的重要区别是,如果对第一个参数求值就能确定表达式的结果,那么就不会对第二个参数求值,避免运算结果的错误。
- 逻辑右移和算术右移。逻辑右移在左端补k个0,得到的结果是[0,…,0,xn-1,xn-2,…,xk]。算术右移是在左端补k个最高有效位的值,得到的结果是[xn-1,…,xn-1,xn-1,xn-2,…,xk]。
浮点数
- 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。
局部性
- 局部性原理:一个编写良好的计算机程序倾向于引用邻近于其他最近引用过的数据项,或者最近引用过的数据项本身。有良好局部性的程序比局部性差的程序运行的更快,在硬件层引入高速缓存存储器就体现了局部性原理。
- 重复引用同一个变量的程序有良好的时间局部性
- 对于具有步长为k的引用模式的程序,步长越小,空间局部性越好。
- 对于取指令来说,循环具有良好的时间和空间局部性。循环体越小,迭代次数越多局部性越好。
收获及不足
- 通过这8周来对这本书的学习,掌握的知识更加扎实,原来学习汇编、操作系统、计算机如何工作等模棱两可的地方更加清楚,最主要的是灵活掌握学习进度,养成了自学的好习惯,通过对知识提纲挈领,一目了然
- 不足还有很多,还是不够积极,做错的题目没有回头去思考其真正原因。考试中查找的过程较多,通过自己思考举一反三的时候少
课程建议和意见
- 觉得没什么意见