20145240 《信息安全系统设计基础》期中总结
自己新学到的知识点总结
Linux命令
1.man命令
- man -k:
常用来搜索,结合管道使用。例句如下:
man -k k1 | grep k2 | grep 2
搜索同时含有k1和k2,且属于系统调用。
最后的数字意味着帮助手册中的区段,man手册共有8个区段,最常用的是123,含义如下: 1.Linux 2.系统调用 3.c语言
- eg:我们输入 man ls,它会在最左上角显示“LS(1)”,在这里,“LS”表示手册名称,而“(1)”表示该手册位于第一节章,同样,我们输入“man ifconfig”它会在最左上角显示“IFCONFIG(8)”。也可以这样输入命令:“man [章节号] 手册名称”。
2.find用法
-
find
的使用格式如下:$ find <指定目录> <指定条件> <指定动作> - <指定目录>: 所要搜索的目录及其所有子目录。默认为当前目录。 - <指定条件>: 所要搜索的文件的特征。 - <指定动作>: 对搜索结果进行特定的处理。
eg:$ find . -type f -mmin -10
搜索当前目录中,所有过去10分钟中更新过的普通文件。如果不加-type f参数,则搜索普通文件+特殊文件+目录
3.locate命令
locate
命令是find -name
的另一种写法,但更快,原因在于它不搜索具体目录,而是搜索一个数据库(/var/lib/locatedb),这个数据库中含有本地所有文件信息。
在使用locate之前,先使用updatedb命令,手动更新数据库。
locate命令的使用实例:
$ locate /etc/sh
搜索etc目录下所有以sh开头的文件。
$ locate ~/m
搜索用户主目录下,所有以m开头的文件。
$ locate -i ~/m
搜索用户主目录下,所有以m开头的文件,并且忽略大小写。
5.grep
这条语句可以用来查找关键字,全文搜索,并且可以直接查找文件内的内容。其中:
n:为显示行号
r:为递归查找
例如,如果想查找某个宏,我们已知宏保存在include文件夹中,所以可以使用下列语句:
grep -nr XXX /usr/include(XXX为所要找的宏)
6.which
which命令的作用是,在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。也就是说,使用which命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。
-
which命令的使用实例:
$ which grep
-
区别
which (寻找执行档) :这个指令是根据PATH这个环境变量所规范的路径,去搜寻执行档的档名,所以,重点是找出执行档而已,which 后面接的是完整档名 whereis (寻找特定档案):搜寻linux数据库档案中所记录的东西,和locate的主要区别在于后面的参数 locate:搜寻linux数据库档案中所记录的东西,后面直接跟档案的部分名称就行 find:直接搜索整个硬盘
7.cheat
cheat命令:告诉你一个命令如何使用。通过使用实例告诉你一个命令如何使用。
用法:cheat 命令名
8.touch
-
命令功能:
touch命令参数可更改文档或目录的日期时间,包括存取时间和更改时间。 -
命令格式:
touch [选项]... 文件...
-
命令参数:
-a 或--time=atime或--time=access或--time=use 只更改存取时间。 -c 或--no-create 不建立任何文档。 -d 使用指定的日期时间,而非现在的时间。 -f 此参数将忽略不予处理,仅负责解决BSD版本touch指令的兼容性问题。 -m 或--time=mtime或--time=modify 只更改变动时间。 -r 把指定文档或目录的日期时间,统统设成和参考文档或目录的日期时间相同。 -t 使用指定的日期时间,而非现在的时间。
正则表达式
-
‘多种字符’ 表达式:正则表达式中的一些表示方法,可以匹配 '多种字符 ' 其中的任意一个字表达符式。
规则:d 0~9 中的任意一个数字
w 任一字母或数字或下划线,即AZ、az、0~9、_中任一个
s 包括空格、制表符、换页符等空白字符中任意一个
. 匹配除换行符( )以外任意一个字符
[ ] 匹配其中任意字符,但每次匹配只匹配一个
[^ ] 匹配除其中的任意字符,每次匹配只匹配一个
vi、 gcc、gdb、make的使用
- vim编辑器:编写代码
-
gcc编译链接器:编译程序
预处理:gcc –E hello.c –o hello.i ;gcc –E调用cpp 产生预处理过的C原始程序 编 译: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 产生可执行文件 运行: ./hello
-
注意:
gcc的一般格式为:
gcc [选项] 要编译的文件 [选项] [目标文件]
其中,目标文件可默认,gcc默认生成可执行的文件,名为编译文件.out.
- gcc连接器将目标文件链接为一个可执行文件
- gcc编译模块化的程序
- 静态库
静态库是一系列的目标文件(.o文件)的归档文件((lib+name).a文 件);链接阶段,选择静态库,后缀名为“.a”;选择动态库,后缀名为“.so”。
静态链接库的生成: gcc -c 文件名.c ar rcsv libxxx.a xxx.o
静态库的使用: gcc -o 文件名 文件名.c -L. -lxxx //链接到静态库
注意:-L :在库文件的搜索路径列表中添加dir目录
-l : 在头文件的搜索路径列表中添加dir目录
- 共享库
共享库的生成
gcc -fPIC -c xxx.c
gcc -shared -o libxxx.so xxx.o
共享库的使用: gcc -o main main.c -L. -lxxx
注册共享库的方法
将库文件直接复制到/lib或者/usr/lib目录下: cp (lib+name).so /lib
- gdb调试器:调试代码
(1)使用流程
查看文件:l
设置断点:在b后加入相对应的行号。例b 6
查看断点情况:设置完断点后键入info b,在gdb中可以设置多个断点。bt 查询调用函数的情况。
运行代码:默认从首行开始运行代码,键入r;r+行号:从该行号开始运行 查看变量值:p 变量。例:p n
单步运行:n或s,s会进入函数,n不会进入函数
恢复程序运行:c
注意:程序的运行状态有“运行”、“暂停”、“停止“三种。
(2)断点的设置
函数:b 文件名.c:函数名
行:b 行数
条件:b 行数 if 表达式(b 8 if == 10)
临时:tb [文件名:]行号或函数名 <条件表达式>
make项目管理器
功能 :识别文件代码是否更新,减少编译工作量
- make项目管理器
功能 :识别文件代码是否更新,减少编译工作量
(1)makefile文件的编写规则
格式为:
目标体:依赖文件
[tab键]各目标体运行命令
目标体:由make创建,通常是目标文件或可执行文件
依赖文件:创建目标体所依赖的文件
运行命令:创建每个目标体时需要的运行命令,必须以tab键开头。
使用make的格式:make 目标体
(2)makefile变量的定义
递归展开方式:在引用该变量时进行替换(不能用于引用自己的情况),缺点:不能在变量后追加内容。
格式定义:VAR = var
非递归展开方式:在定义处展开,并只展开一次。优点:消除变量的嵌套引用。
格式定义:VAR := var
make中变量的使用格式: $(变量名)
变量名的命名:不包括“:”、“#”、“=”以及结尾空格的任何字符串;变量名大小写不敏感。
变量分类:用户自定义变量、预定义变量、自动变量及环境变量。
(3)makefile规则
隐含规则
模式规则
教材内容
第一章
1、信息就是位+上下文
2、计算机系统的核心是高速缓存的概念,一层存储器是低一层存储器的高速缓存。
3、操作系统中的抽象是进程、文件、虚拟存储器、虚拟机。
第二章
1、数字的三种表示 :无符号数、有符号数、浮点数
2、进制转化
eg:x=2^n转化为十六进制
将x写成x=2n的形式,令n=i+4j,x的十六进制表示为:开头为2i的值,后面补j个0。
3、字和字节顺序
字长:一个字长指明整数和指针数据的标称大小。字长决定最重要的系统参数就是虚拟地址空间的最大大小。对一个字长为w位的机器而言,虚拟地址的范围是0~2w-1,程序最多访问2w个字节。
对于跨越多字节的程序对象需建立两个规则:
小端法:高对高,低对低
大端法:从视觉上,是这次阅读的顺序,与小端法相反。
4、布尔代数
(1)位向量的运算:按位运算
(2)位向量的应用:表示有限集合
掩码表示的是设置为有效信号的集合。
(3)位级运算
|:或
&:与
~:取反
^:异或
掩码运算:掩码是一个位模式,表示从一个字中选出的位的集合。例如:位级运算x&0xFF生成一个有x的最低有效字节组成的值。
(4)逻辑运算
逻辑运算符:||(或)、&&(与)、!(非)
(5)移位运算 右移包括:逻辑右移、算数右移
逻辑右移:左端补k个0(常用于无符号数)
算数右移:左端补k个最高有效位的值(用于有符号数)
5、补码编码
补码形式是最常见的有符号数的计算机表示方式 将字的最高有效位解释为负权 B2T(W)函数为:B2T(x) = -x(w-1)2^(w-1)+∑xi2^i(求和从i=0到i=w-2)
6、有符号数和无符号数之间的转换
负数和正数相等的情况:u=2147483648 =-2147483648
(当输出分别为无符号形式和有符号形式时)
7、扩展数的位表示
零扩展:将无符号数转换为更大的数在表示的开头添加0
符号扩展:将一个补码数字转换为一个更大的数据类型
8、截断数字
截断数字:不用额外的位来扩展一个数值,而是减少表示一个数字的位数。
注意!!补码经过截断处理后的结果仍是补码,注意结果为负数时转化为十进制数
第三章
1、反汇编命令 objdump -d xxx.o
2、执行汇编命令:gcc –s xxx.c –o xxx.s
3、64位处理器得到32代码的命令:gcc –m32 –s xxx.c
4、三种操作数:立即数、寄存器、存储器
5、条件码 : CF:进位标志 ZF:零标志 SF:符号标志 OF:溢出标志
6、jump指令:直接跳转——后面跟标号作为跳转目标; 间接跳转——*后面跟一个操作数指示符
7、传送指令包括:数据传送指令和条件传送指令
8、call指令的效果是将返回地址入栈。并跳转到被调用过程的起始处。
9、ret指令返回到call指令后的那条指令
10、leave指令可以使栈做好返回的准备 等价于:
movl %ebp,%esp ; popl %ebp
第四章
1、指令体系结构:一个处理器支持的指令和指令的字节级编码
2、程序员可见状态:8个寄存器状态、程序计数器PC。
3、指令集的一个重要性质:字节编码必须有唯一的解释。
4、Y86异常:状态码1,AOK,程序正常; 状态码2,HLT,处理处执行halt指令; 状态码3,ADR,非法地址;状态码4,INS,非法指令。
5、创建Y86代码的唯一工具是汇编器 ;YIS:指令集模拟器 6、pushl指令会把栈指针减4,并且将一个寄存器值写入存储器中。
7、SEQ执行处理一条完整指令的步骤:取址、译码、执行、访存、写回、更新
8、nop指令:除了将PC加1,不进行任何处理; halt指令:将处理器状态设置为HLT,导致处理器停止运行。
9、取址阶段包括指令存储器硬件单元。
instrvalid:指示指令是否合法 needregids:指示是否包括一个寄存器指示符字节 need_valC:指示是否包括一个常数字 instrvalid和imemerror在访存阶段被用来产生状态码。
10、“cond”硬件单元会根据条件码和功能码来确定是否进行条件分支或者条件数据传送。
第六章
1、随机访问存储器分为:静态的SRAM、动态的DRAM
2、根据携带信号不同,总线可分为数据总线、地址总线、控制总线。
3、计算磁盘容量的公式
磁盘容量 = 字节数/扇区 X 平均磁盘数/磁道 X 磁道数/表面 X 表面数/盘片 X 盘片数/磁盘
4、访问时间=寻道时间+旋转时间+传送时间
5、最大旋转延迟=1/RPM X 60secs/1min (s)
;平均旋转时间是最大旋转时间的一半
6、平均传送时间= 1/RPM x 1/(平均扇区数/磁道) x 60s/1min
7、逻辑磁盘块三元组(盘面,磁道,扇区):唯一地标示了对应的物理扇区
8、CPU使用一种称为存储器映射I/O的技术来向I/O设备发出命令。
9、局部性包括时间局部性和空间局部性。
10、循环有好的时间和空间局部性
11、高速缓存:上一层做下一层的高速缓存
12、缓存不命中的种类
冷缓存(强制不命中冷不命中):一个空的缓存,对于有效位为0的情况 ; 容量不命中:当工作集的大小超过缓存的大小时;冲突不命中:限制性的放置策略会引起的一种不命中。
13、每个存储器地址有m位,形成M=2^m个不同的地址; 高速缓存组:S = 2^m个高速缓存组的数组 ; 高速缓存行:B = 2^m字节的数据块组成 ; 有效位:指明这个行是否包含有意义的信息; 标记位:唯一地标识存储在这个高速缓存行中的块,t = m -(b+s)
14、高速缓存参数的性能影响
缓存大小的影响;块大小的影响;相联度的影响;写策略的影响
第七章
1、c语言程序执行的过程涉及的工具:c预处理器(cpp)、编译器(cc1)、汇编器(as)、链接器程序(ld)
2、链接器的任务:符号解析、重定位
3、目标文件的三种形式:可重定位目标文件、可执行目标文件、共享目标文件
4、目标文件的格式:a.out、COFF、DE、ELF
5、链接器上下文的三种符号:全局符号、外部符号、本地符号
自己的收获
通过八周的学习,对linux的学习从一开始的迷茫到现在能去理解课本的具体内容,老师每周圈出的练习题对学习每个章节十分有用,自己也在努力做到能够解决每一道课后习题,只要用心学就会发现没有自己想象的那么难。而且我觉得越往后学习,就会越发现前面的知识的重要性,而且此次期中总结,给了我们一个机会,让我们系统的回顾一下前几周的学习内容,之前学习的地方当时可能不懂,而且老师没考到,或者不清楚具体在干什么,就这么过去了,但是我觉得这个周我将那些知识又重新在脑海里整理了一遍,会发现,原来有些内容的本质是什么,不再单纯的跟着实验指导,而是学会了思考每一步的意义,希望自己以后能主动做到这一点,将会对学习十分有帮助。
自己的不足
有的时候还是习惯将博客拖到周天,老师周一发送了学习任务甚至到周三周四才开始看,所以学习的时间很紧张,希望自己以后从周一开始就投身于本周任务的学习,而且沉淀一周的学习将会比短短一两天的学习更有效,前一天学的知识,可能当第二天自己再回顾的时候才能有更深的理解,这样对知识的记忆也将更牢固,有助于我们系统的理解整个课程。
建议
我认为前两周的任务量过大,实验楼中linux课程学习的实验有17节,需要一周学完,而且学完之后说实话我没有很好的理解,是后面几个周用到前面的知识的时候又回头重新学习了一遍,感觉效率有点低如果一次学习那么多。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 200/200 | 1/2 | 20/20 | |
第二周 | 300/500 | 1/3 | 18/38 | |
第三周 | 150/650 | 1/4 | 20/58 | |
第四周 | 200/850 | 1/5 | 22/80 | |
第五周 | 200/1050 | 1/6 | 24/104 | |
第六周 | 220/1270 | 1/7 | 25/129 | |
第七周 | 150/1300 | 1/8 | 20/149 | |
第八周 | 50/1350 | 2/10 | 21/170 |