20145222 《信息安全系统设计基础》期中总结

一、知识点总结

学习Linux时常用命令汇总

通过Ctrl+f键可在该网页搜索到你想要的命令。

Linux中命令格式为:command [options] [arguments] //中括号代表是可选的,即有些命令不需要选项也不需要参数

常用命令

man命令
  • man命令(重要的三条):
    1. 是普通的Linux命令

    2. 是系统调用,操作系统的提供的服务接口

    3. 是库函数, C语言中的函数

      • man -k:等价于apropos。使用man -k找到命令后,可以用man -f cmd查看命令的基本功能。
      • man -k sort | grep 3:可以更好的找到qsort。更加精确。

其实我之前不太清楚man命令的功能是什么,多man了几个命令后才明白:当你需要查看某个命令的参数时不必到处上网查找,只要man一下即可。

cheat命令
  • cheat命令:在GNU通用公共许可证下,为Linux命令行用户发行的交互式备忘单应用程序。它提供显示Linux命令使用案例,包括该命令所有的选项和简短但尚可理解的功能。告诉你一个命令如何使用。通过使用实例告诉你一个命令如何使用。
    用法:cheat+命令名。
其他常用命令
  • ls:显示是当前目录的内容。
  • ls -a .:显示当前目录中的所有内容,包括隐藏文件和目录。
find命令
  • find命令:查找一个文件在系统中的什么位置。
    find的使用格式如下:
    $ find <指定目录> <指定条件> <指定动作>
      - <指定目录>: 所要搜索的目录及其所有子目录。默认为当前目录。
      - <指定条件>: 所要搜索的文件的特征。
      - <指定动作>: 对搜索结果进行特定的处理。
    举例:
    $ find . -type f -mmin -10
      搜索当前目录中,所有过去10分钟中更新过的普通文件。如果不加-type f参数,则搜索普通文件+特殊文件+目录
locate命令
  • locate:神速版本的find
    locate命令是"find -name"的另一种写法,但更快,原因在于它不搜索具体目录,而是搜索一个数据库(/var/lib/locatedb),这个数据库中含有本地所有文件信息。在使用locate之前,先使用updatedb命令,手动更新数据库。
    locate命令的使用实例:
      $ locate /etc/sh
      搜索etc目录下所有以sh开头的文件。
      $ locate ~/m
      搜索用户主目录下,所有以m开头的文件。
      $ locate -i ~/m
      搜索用户主目录下,所有以m开头的文件,并且忽略大小写。
whereis和which命令
  • whereis which:告诉你使用的命令工具装在什么地方。which+命令或文档文件where+命令或文档文件更加精确。
区别:
which (寻找执行档) :这个指令是根据PATH这个环境变量所规范的路径,去搜寻执行档的档名,所以,重点是找出执行档而已,which 后面接的是完整档名   
whereis (寻找特定档案):搜寻linux数据库档案中所记录的东西,和locate的主要区别在于后面的参数   
locate:搜寻linux数据库档案中所记录的东西,后面直接跟档案的部分名称就行   
find:直接搜索整个硬盘区别
grep命令
  • grep命令:对文件全文检索,比如你接手一个C语言项目,里面有上百个C源文件,想找找main函数在那个文件中,你可以通过grep -n main *.c,快速找到main在哪个C文件中并指出在第几行。

这条语句可以用来查找关键字,全文搜索,并且可以直接查找文件内的内容。其中:
n:为显示行号
r:为递归查找

例如,如果想查找某个宏,我们已知宏保存在include文件夹中,所以可以使用下列语句:
grep -nr XXX /usr/include(XXX为所要找的宏)

cat命令

命令说明: 查看文件内容,也可以给文件追加内容到结尾
语法:cat [-AbEnTv]

参数:
-A :相当于-vET的整合参数,可以列出一些特殊字符,而不是空白而已 -b :列出行号,仅对非空行号显示,空白行不标记行号
-E :将结尾的断行字符$显示出来
-n :打印出行号,连同空白行也有行号,与-b参数不同
-T :将[tab]按键以^I 显示出来
-v :列出一些看不出的特殊字符

touch

命令功能:
touch命令参数可更改文档或目录的日期时间,包括存取时间和更改时间。
命令格式:
touch [选项]... 文件...
命令参数:

-a 或--time=atime或--time=access或--time=use  只更改存取时间。
-c 或--no-create  不建立任何文档。
-d  使用指定的日期时间,而非现在的时间。
-f  此参数将忽略不予处理,仅负责解决BSD版本touch指令的兼容性问题。
-m 或--time=mtime或--time=modify  只更改变动时间。
-r  把指定文档或目录的日期时间,统统设成和参考文档或目录的日期时间相同。
-t  使用指定的日期时间,而非现在的时间。

常用命令行

  • apt-cache search:在使用apt-get install安装一个程序时先找找软件源的库里有没有这个程序,有才可以安装。apt-cache search ddd:查查有没有ddd这个程序。
    常用使用方法:
    1、apt-cache show package_name: 显示指定软件包的信息,包括版本号,安装状态和包依赖关系等.

      2、apt-cache search package_name:搜索软件包,可以按关键字查找软件包,通常用于查询的关键字会使用软件包的名字或软件包的一部分.
    

    3、apt-cache showpkg package_name:显示软件包的依赖关系信息.

    4、apt-cache stats:显示当前系统所使用的数据源的统计信息,用户可以使用该命令查看数据源的相关统计信息.

    5、apt-cache policy package_name:显示软件包的安装状态和版本信息.

    6、apt-cache depends package_name:显示指定软件包所依赖的软件包。当用户需要了解某个软件包依赖于其他哪些包时,可以使用apt-cache depends来查询包依赖关系.

    7、apt-cache rdepends package_name:查询指定软件包的反向依赖关系,即那些其他的软件包需要依赖你所指定的软件包做为安装和运行的必须条件.

    8、apt-cache dump:显示缓存中的每个软件包的简要描述信息.

    9、apt-cache unmet:显示不符合一致性的依赖关系.

关于代码的编写、编译到运行的命令行

  • mkdir+xxx(文件名):在当前目录下新建一个文件夹。

  • vim+xxx.c:建立一个文本文档,可在该文本文档下编写代码。

  • 预处理:gcc –E hello.c –o hello.i:gcc –E调用cpp 产生预处理过的C原始程序 (以hello.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.

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项目管理器

功能 :识别文件代码是否更新,减少编译工作量

  1. makefile文件的编写规则

格式为:

目标体:依赖文件

[tab键]各目标体运行命令

目标体:由make创建,通常是目标文件或可执行文件

依赖文件:创建目标体所依赖的文件

运行命令:创建每个目标体时需要的运行命令,必须以tab键开头。

使用make的格式:make 目标体

  1. makefile变量的定义

递归展开方式:在引用该变量时进行替换(不能用于引用自己的情况),缺点:不能在变量后追加内容。

格式定义:VAR = var

非递归展开方式:在定义处展开,并只展开一次。优点:消除变量的嵌套引用。

格式定义:VAR := var

make中变量的使用格式: $(变量名)

变量名的命名:不包括“:”、“#”、“=”以及结尾空格的任何字符串;变量名大小写不敏感。

变量分类:用户自定义变量、预定义变量、自动变量及环境变量。

教材内容

(一)《第一周学习总结》

(二)《第二周学习总结》

第一章

  1. 信息就是位+上下文
  2. 计算机系统的核心是高速缓存的概念,一层存储器是低一层存储器的高速缓存。
  3. 操作系统中的抽象是进程、文件、虚拟存储器、虚拟机。

第七章

1、c语言程序执行的过程涉及的工具:c预处理器(cpp)、编译器(cc1)、汇编器(as)、链接器程序(ld)
2、链接器的任务:符号解析、重定位
3、目标文件的三种形式:可重定位目标文件、可执行目标文件、共享目标文件
4、目标文件的格式:a.out、COFF、DE、ELF
5、链接器上下文的三种符号:全局符号、外部符号、本地符号

(三)《第三周学习总结》

第二章

  1. 数字的三种表示 :无符号数、有符号数、浮点数
  2. 进制转化
    (1)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)+∑xi2i(求和从i=0到i=w-2)

  1. 有符号数和无符号数之间的转换

负数和正数相等的情况:u=2147483648 =-2147483648
(当输出分别为无符号形式和有符号形式时)

  1. 扩展数的位表示
    零扩展:将无符号数转换为更大的数在表示的开头添加0
    符号扩展:将一个补码数字转换为一个更大的数据类型
  2. 截断数字
    截断数字:不用额外的位来扩展一个数值,而是减少表示一个数字的位数。

注意!!补码经过截断处理后的结果仍是补码,注意结果为负数时转化为十进制数
9. 使用无符号数的情况
(1)把字仅仅看做是位的集合,并没有任何数字意义时
(2)当实现模运算和多精度运算的数学包时,数字是由数的数组来表示的,无符号值也会非常有用。
10. 整数运算
(1)无符号加法
(2)补码加法
(3)补码的非
(4)无符号乘法
两个数x、y相乘且x、y的位数为w,则结果的位数为2w。
(5)补码乘法
同无符号乘法。 若为截断后的结果,则取结果的后w位作为计算结果。 注意:无符号运算和补码运算在“+”、“-”、“”在位级上有相同的结果。
(6)乘以常数
对于某个常数K的表达式xK生成代码,编译器会将K的二进制表示表达为一组0或1的交替的序列: [(0…0)(1…1)(0…0)…(1…1)] 可以用以下两种形式来计算这些乘积的结果:

A:(x<<n)+(x<<n-1)+……+(x<<m)
B:(x<<n+1)-(x<<m)
注意:对于n为最高位的情况,B:-(x<<m)
注意!!(x<<0)的结果是x,而不是0

(7)除以2的幂
设x/K,令K=2^n,
当x为正数时,计算 x>>n;
当x为负数时,将x加上偏置量,即加上2^n-1(即K-1),计算** (x+偏置量)>>n**。
11. 浮点数
(1)二进制小数
将十进制小数转换为二进制小数
首先,将十进制小数写成分数的形式,将分数的分子部分,写成二进制的形式;将分数的分母部分写成2^n的形式,将分子的二进制形式,从右往左数,数n位添加小数点。
小数点左移:除以2
小数点右移:乘以2
(2)IEEE浮点数表示
表示形式为:V = (-1)^s * M * 2^E
符号:s符号位。
尾数:M是一个二进制小数,它的范围是1 ~ 2-ε,或者是0 ~ 1-ε。
阶码:E的作用是对浮点数据加权,这个权重是2的E次幂(可能是负数)。
根据阶码的值,可分为一下三种情况:
情况一:规格化的值 (当阶码字段不全为0或全为1时)
E = e-Bias
Bias = 2^(k-1)-1
M = 1+f
情况二:非规格化的值 (当阶码字段全为0时)
E = 1-Bias
Bias = 2^(k-1)-1
M = f
情况三:特殊值 (当阶码字段全为1时)
当小数域全为0时, 当s=1时,为-∞;当s=0时,为+∞。
当小数域不全为0时,为NaN。

(四)《第四周学习总结》

(五)《第五周学习总结》

第三章

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、高速缓存参数的性能影响
缓存大小的影响;块大小的影响;相联度的影响;写策略的影响

二、自己的收获

  • 期中总结:学习Linux已经有十周了,结合《深入理解计算机系统》这本厚厚的书,选择匹配的章节来一步步循序渐进地学习《信息安全系统设计基础》这门课程。从安装虚拟机,在linux系统的终端学习使用简单的Linux命令,到后面开始看书,学习理论知识理解Linux系统的一些基本知识。在这些过程中,结合大一学的C语言基础敲代码,然后复习并熟悉掌握了用git上传并保存自己每一章节的代码。虽然这学期刚开始还不会使用git上传(上学期学习Java时没有掌握),但在老师的督促帮助下,在近期已经掌握。我觉得主要还是要多使用Linux的一些重要的命令,并且理解含义。多复习课本《深入理解计算机系统》掌握那些理论知识才是重要的,再结合实践操作会更加好。
  • 经过了半学期的学习,先且不论实际的元知识掌握了多少,我觉得自己的学习主动性增强了不少。虽然成绩一直处于待及格区域,但在老师的要求下——每周写两篇博客,我渐渐地开始主动去学习总结一些自己认为有用的东西,并把它写成博客,比如《Markdownd 一些基本语法》《第一周至第六周的考试错题汇总》《Linux 常用命令汇总》。不过希望自己能更加努力,认真学习并掌握课本知识早日脱离待及格区域。

三、自己的不足

  • 其实每一周的学习任务自己没有全部完成,也没有利用充足的时间来复习考试内容,举一个简单的例子,老师要求的git上传代码,每敲完一个代码,就git add .git commit一下,并且加上注释,我到最近才慢慢掌握这一套简单的流程。以前用git有点敷衍老师的检查,只是为了在每周的博客总结上加一个代码托管的链接。主要是自己心态浮躁,没有好好静下心来认真思考学习过程。态度敷衍,也是对自己的不负责,浪费时间。
  • 自己应该一步一个脚印跟上学习任务进度,踏踏实实总结复习每一周的学习内容。老师给的每周学习任务其实不是很多,经历过上学期Java学习总结博客,自己应该已经习惯这种学习方式,但由于自己的不认真对待,一直使学习处于“游离状态”。
  • 具体改正措施:
    1. 自我鼓励多写多发博客,写一些跟Linux学习有关的博客内容。
    2. 多找学霸学习,结合教材里的练习题来学习教材内容。
    3. 提高实验楼的有效学习时间。

课程建议和意见

  • 希望老师在每次考试完能及时的将考试卷子发下来,这样我们也能及时地去改正考卷上的错误。
  • 希望老师上课还可以多讲一些实用的“有趣”的技巧,老师之前让我们看的课本的部分,就是我们可以通过百度直接得到的部分,我们现在是了解这些知识,但绝不是深入透彻的理解,毕竟学一遍,而且是自学的,程度肯定是不一样的,所以还是想能多听一听老师讲的。我觉得纯粹的自学对于从小成长于应试教育的我们还是不太能将知识学的牢固,因为正确的指导能够节省大量时间,让我们能将时间更加有效的利用。
posted @ 2016-11-06 23:04  20145222黄亚奇  阅读(169)  评论(3编辑  收藏  举报