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

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

知识点梳理

第0周博客链接及主要内容

第一周博客链接及主要内容

man命令

  • man密令是Linux下的帮助指令,通过man指令可以查看Linux中的指令帮助、配置文件帮助和编程帮助等信息。
  • 常用选项:
    -a:在所有的man帮助手册中搜索
    -k:根据关键字搜索联机帮助,是一种模糊搜索
    -f:关键字精确搜索,等价于whatis指令,显示给定关键字的简短描述信息
    -P:指定内容时使用分页程序
    -M:指定man手册搜索的路径
  • 参数:
    数字:指定从哪本man手册中搜索帮助
    关键字:指定要搜索帮助的关键字

cheat命令

  • 在linux上,man命令几乎是万能的,但它却不是最高效的。由于它给出的帮助信息很长,在短时间内不好理解,所以在这种情况下,用cheat命令更方便,cheat命令简单来说,就是告诉你一个命令如何使用。它没有提供其他额外多余的信息,只通过使用实例告诉你一个命令如何使用。
  • Ubuntu上没有自带cheat命令,大家可以参照娄老师提供的文章进行安装配置。

find命令

  • find 实际搜寻硬盘查询文件名称
    通常情况下find命令并不是很常用,大家都优先使用whereis和locate命令来查找,因为whereis和locate命令都是利用数据库来查找文件所在,并没有实际查询硬盘,所以速度很快,节省时间。但是我们的find命令依然很强大,它的查找条件相当多,对于用其他命令查找不到的文件,就可以考虑使用find命令在硬盘上遍历查找,虽然速度慢效率低。

  • find(用于在文件树中查找文件,并进行相应操作)

  • 格式:

  1. find [PATH] [option] [action]
    [PATH] : 所要搜索遍历的目录,默认为当前目录
  2. [option] : 所要搜索文件的条件特征
  3. [action] : 对搜索结果进行特殊处理
  • 与时间有关的参数
    -amin n :查找n分钟内被访问过的文件
    -cmin n : 查找n分钟内被修改过文件状态的所有文件
    -mmin n : 查找n分钟内被修改过文件内容的所有文件
    -atime n : 将n天内存取过的的文件列出来
    -ctime n : 将n天内改变、新增的文件或者目录列出来
    -mtime n : 将n天内修改过的文件或者目录列出来
    -newer file :把比file还要新的文件列出来 (可用来分辨两个文件之间的新旧关系)

除此之外,以-mtime为例:(类比使用其他与时间有关的参数)
-mtime n :列出n天前的那一天被更改过的文件
-mtime +n :列出n天之前(不包含n天本身)被更改过的文件
-mtime -n :列出n天之内(包含n天本身)被更改过的文件
-mtime 0 : 0代表当前时间,即列出从现在开始到24小时

  • 与用户或用户组名有关的参数
    -uid [n] :寻找拥有者ID为n的文件
    -gid [n] :寻找用户组ID为n的文件
    -group [name] :寻找群组名为"name"的文件
    -user [name] : 寻找用户名为"name"的文件
    -nouser : 寻找文件所有者不存在 /etc/passwd 的人(可以查找不太正常的文件)
    如果你的某个账户删除了,该账户曾经建立的文件就成了无主的非正常文件这时候可以利用 -nouser 来找出该类型的文件
  • 与文件权限及名称有关的参数
    (1)-name [filename] :查找文件名filename的文件
    从以上的例子中我们可以看出,find命令需要一个路径名作为查找范围,find会深入到这个路径的每一个子目录中去寻找,打印文件的绝对路径。
    如果指定路径为“/”,就查找整个文件系统。-name选项指定了文件名,-printf表示将结果输出到屏幕上,-type选项用来定位特殊文件类型。
    (2)-size [+ -]SIZE : 查找比"SIZE"还要大(+)或小(-)的文件
    (SIZE的规格有:① c :代表byte ②k :代表1024 bytes) ;
    要找比50k还要大的文件时就用" -size +50k"
    (3)-type [TYPE] :查找文件类型为TYPE的文件

locate命令

  • locate命令其实是find -name的另一种写法,但是要比后者快得多,原因在于它不搜索具体目录,而是搜索一个数据库(/var/lib/locatedb),这个数据库中含有本地所有文件信息。Linux系统自动创建这个数据库,并且每天自动更新一次,所以使用locate命令查不到最新变动过的文件。为了避免这种情况,可以在使用locate之前,先使用updatedb命令,手动更新数据库。
  • 命令格式:locate [选择参数] [样式]
  • 命令参数:
  1. -e:将排除在寻找的范围之外
  2. -1:如果是1则启动安全模式,在安全模式下,使用者不会看到权限无法看到的档案。这会使速度减慢,因为 locate必须至实际的档案系统中取得档案的权限资料
  3. -f:将特定的档案系统排除在外,例如我们没有到必要把proc档案系统中的档案放在资料库中
  4. -q:安静模式,不会显示任何错误讯息
  5. -n:至多显示 n个输出
  6. -r:使用正规运算式 做寻找的条件
  7. -o:指定资料库存的名称
  8. -d:指定资料库的路径
  9. -h:显示辅助讯息
  10. -V:显示程式的版本讯息

grep命令

  • grep命令是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。
  • 命令格式:grep [options]
    [options]主要参数:
  1. -c:只输出匹配行的计数
  2. -I:不区分大小写(只适用于单字符)
  3. -h:查询多文件时不显示文件名
  4. -l:查询多文件时只输出包含匹配字符的文件名
  5. -n:显示匹配行及行号
  6. -s:不显示不存在或无匹配文本的错误信息
  7. -v:显示不包含匹配文本的所有行
    正则表达式主要参数:
  8. \:忽略正则表达式中特殊字符的原有含义
  9. ^:匹配正则表达式的开始行
  10. $:匹配正则表达式的结束行
  11. <:从匹配正则表达式的行开始
  12. >:到匹配正则表达式的行结束
  13. [ ]:单个字符,如[A]即A符合要求
  14. [ - ]:范围,如[A-Z],即A、B、C一直到Z都符合要求
  15. 。:所有的单个字符
  16. *:有字符,长度可以为0

whereis命令

  • whereis命令是定位可执行文件、源代码文件、帮助文件在文件系统中的位置。这些文件的属性应属于原始代码,二进制文件,或是帮助文件。whereis程序还具有搜索源代码、指定备用搜索路径和搜索不寻常项的能力。whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s)。如果省略参数,则返回所有信息。
  • 命令格式:whereis [-bmsu] [BMS 目录名 -f ] 文件名
  • 主要参数:
  1. -b:定位可执行文件
  2. -m:定位帮助文件
  3. -s:定位源代码文件
  4. -u:搜索默认路径下除可执行文件、源代码文件、帮助文件以外的其它文件
  5. -B:指定搜索可执行文件的路径
  6. -M:指定搜索帮助文件的路径
  7. -S:指定搜索源代码文件的路径

which命令

  • which指令会在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。which是根据使用者所配置的PATH变量内的目录去搜寻可运行档的,所以,不同的PATH配置内容所找到的命令是不一样的。
  • 命令格式:which 可执行文件名称
  • 命令参数:
  1. -n:指定文件名长度,指定的长度必须大于或等于所有文件中最长的文件名
  2. -p:与-n参数相同,但此处的包括了文件的路径
  3. -w:指定输出时栏位的宽度
  4. -V:显示版本信息

文件操作

  • 文件打包/解压:zip/unzip
  • df:查看磁盘的容量
  • du:查看目录的容量
  • touch:创建空白文件
  • mkdir:创建一个空目录
  • cp:复制一个文件或目录到指定目录
  • em:删除一个文件或目录
  • mv:
  • 移动文件(剪切):mv 源目录文件 目的目录
  • 文件重命名:mv 旧的文件名 新的文件名

第二周博客链接及主要内容

Vim常用命令总结

  • 插入:
    i:在当前光标处进行编辑
    a:在光标后插入编辑
  • 退出:
    q!:强制退出,不保存
    :q:退出
    :wq!:强制保存并退出
    :wq:保存并退出
    :w <文件路径>:另存为
  • 删除:
    x:删除游标所在的字符
    dd:删除整行
  • 行间跳转:
    nG(n Shift+g):光标移动到第n行
  • 复制与粘贴:
    nyy:复制光标所在及其后的整行共n行
    p:代表粘贴至光标后
  • 功能设定:
    :set autoindent(ai):设置自动缩进
    :set cindent(cin):设置C语言风格缩进
    :set nu:以显示行号
  • 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
  • makefile
    功能:识别文件代码是否更新,减少编译工作量
    格式为:
    目标体:依赖文件
    [tab键]各目标体运行命令
    目标体:由make创建,通常是目标文件或可执行文件
    依赖文件:创建目标体所依赖的文件
    运行命令:创建每个目标体时需要的运行命令,必须以tab键开头。
    使用make的格式:make 目标体

第三周博客链接及主要内容

信息的表示

  1. 无符号数:基于传统的二进制表示法,表示大于或等于零的数字(我的理解是,无符号嘛,就是已经超越生死,无论正负,所以我比较喜欢无符号数,密码学编代码用的爽)
  2. 补码:表示有符号数,可为正可为负的数字
  3. 浮点数:表示实数的科学计数法的以二为基数的版本

信息存储

  • 字:
    每个计算机都有一个字长,指明整数和指针数据的标称大小。因为虚拟地址是以这样的一个字来编码的,所以字长最重要的系统参数就是虚拟地址空间的最大大小。
    对于一个字长为w位的机器而言,虚拟地址的范围为0~2w-1,程序最多访问2w字节。
    使用C99特性:当没有-m32或-m64参数时,一般情况下会生成跟操作系统位数一致的代码;gcc -m32可以在64位机上(比如实验楼的环境)生成32位的代码
  • 字节顺序:字节顺序是网络编程的基础,是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端、大端两种字节顺序。
  • 小端法:低字节数据存放在内存低地址处,高字节数据存放在内存高地址处。
  • 大端法:高字节数据存放在低地址处,低字节数据存放在高地址处。

布尔代数

  • 逻辑运算:
    所有逻辑运算都可以用与、或、非表达(最大式、最小式)而与或非可以用“与非”或“或非”表达,所以,只要一个与非门,就可以完成所有的逻辑运算
  • 逻辑运算符:逻辑与(&&);逻辑或(||);逻辑非(!)
  • 位运算:结果是位向量;按位与(&) 二进制每一位遇0为0;按位或(|) 二进制每一位遇1为1;按位异或(^) 00=0,01=1,10=1,11=0;按位取反(~) 二进制每一位取反
  • 掩码运算:掩码是位运算的重要应用,这里掩码是一个特定位模式,表示从一个字中选择一个位的集合。对特定位可以置一,可以清零。
  • 整数表示
    无符号数编码位向量二进制表示与之对应。
    补码编码

第四周博客链接及主要内容

第五周博客链接及主要内容

寻址方式历史

  • DOS时代的平坦模式:不区分用户空间和内核空间,很不安全。
  • 8086的分段模式
  • IA32的带保护模式的平坦模式

数据格式

  • 由于是从16位体系结构扩展成32位,intel用术语字(word)表示16位数据类型,因此32位为双字(double words),64位数为4字(quad words)。
    以下是比较容易模糊的数据类型大小:
    32位机上:float 4 long int 4 double 8 longlong 8 char* 4 unsigned long 4
    64位机上:float 4 long int 8 double 8 longlong 8 char* 8 unsigned long 8
    另外,GCC 用long double表示扩展精度(10字节),出于存储器性能考虑,会被存储为12字节

访问信息

  • 一个IA32 CPU包含一组8个存储32位值的寄存器,用以存整数数据和指针:eax,ecx,edx,ebx,esi,edi esp,ebp。大多数情况下前六个都用作通用寄存器,eax,ecx,edx的存储和恢复惯例不同于ebx,edi,esi(前三者为被调用者保存,后三者为调用者保存,详见3.7.3);最后两个用于存储指针,由于在过处理中非常重要,分别指向栈帧的顶部和底部,必须保持。

操作数指示符

  • 大多数指令有一到多个操作数,操作数有三种:
    立即数:即常数值
    寄存器:表示某个寄存器内容
    存储器引用:根据计算出来的地址(通常称有效地址)访问某个存储器位置
    因此寻址方式也有多种,如:立即数寻址、寄存器寻址、绝对寻址、间接寻址、变址寻址、伸缩化 的变址寻址……

数据传送指令

  • 几个重要数据传送指令:mov族(之所以称这为族是因为mov指令还有很多兄弟指令如movb、movw、movsb、movzb,这是我个人对它们的称呼,便于记忆mov其他几个比较低调的兄弟)、pop、push。同时,对于mov族,movb、movw自不必做过多解释,movsb、movzb分别为符号扩展、零扩展,它们只拷贝一个字节,源操作数均为单字节,并设置目的操作数中其余的位,效果如下:
    初始假设:%dh=8D %eax=98765432
    1 movb %dh,%al ;%eax=9876548D
    2 movsbl %dh,%eax ;%eax=FFFFFF8D(目的操作数高24位设为源字节最高位,在这里为很显然为1,所以前24位为全F)
    3 movzbl %dh,%eax ;%eax=0000008D(目的操作数高24位被设为0)

  • 对于pushl指令等价于:
    subl $4,%esp
    movl %ebp,(%esp) //注意这里的括号引起的差别

    popl指令等价于:
    movl (%esp),%eax
    addl $4,%esp

第六周博客链接及主要内容

看的见的手

  • 计算机是一个神秘的家伙,它的很多秘密我们都看不到,不过有了ISA的帮忙,我们就可以了解到很多计算机的秘密。比如hzy现在写博文的时候,CPU到底在干什么呢?
  • 理论上来讲,我们在编写一个程序的时候,我们是可以知道CPU的状态的。因为在你观察程序的汇编指令时,你可以知道当程序执行到某个地方,寄存器、存储器以及条件码寄存器等等的状态是如何的。说到底,无论是寄存器,存储器还是条件码寄存器等等,都是汇编指令可以访问的处理器状态。在设计和实现一个处理器的时候,只要我们能保证机器级程序(比如汇编程序)可以正常的访问程序猿可见状态(比如寄存器、存储器),那么就不太需要非得按照ISA真正的方式来表示我们的处理器状态。
  • 对于Y86来说,它的程序猿可见状态就是这几种:寄存器、存储器、条件码、PC、程序状态。
  • 在Y86当中,寄存器依旧是8个,每一个寄存器可以存储一个字,也就是一个32位二进制。条件码是一个一位二进制的寄存器,保存着最近的算术或逻辑运算所造成的影响的信息。PC则是程序计数器,记录当前正在执行的指令的地址。
  • 存储器则是一个很大的字节数组,Y86的程序可以使用虚拟地址(类似于数组的下标)来访问存储器,硬件和操作系统会将虚拟地址翻译为实际的地址。最后一个程序状态(stat),它则代表着程序的运行情况。
  • 这些都是可见的状态,或者说机器级程序可访问的CPU状态,我们在设计和实现一个处理器的时候,就是设计一系列指令去操作这些状态。

第七周博客链接及主要内容

局部性小结

重复引用同一个变量的程序有良好的时间局部性
对于具有步长为k的引用模式的程序,步长越小,空间局部性越好。
对于取指令来说,循环具有良好的时间和空间局部性。循环体越小,迭代次数越多局部性越好。

收获

  • 最大的收获莫过于,你永远需要一个plan B,强如AlphaGo这样的非人类都有失算的时候,何况我们这些计算当量只有几bit的寻常人。狡兔尚有三窟,我们多准备一个PLAN B永远不吃亏。
  • 在学习Linux的时候,因为某些偶然原因和必然因素,我学习了装双系统,想来也是为计算机应用水平测试打下了一定的基础。
  • 同时,加深了对c,汇编,硬件的认识。虽然还没有形成体系,但是这不妨碍我为以后编写更加高效的代码带下夯实的基础。
  • 从更高处望去,必然是不一样的景色。这,是我现在最深的领悟。

不足

  • 说来说去,永远是那永恒不变的话题————学习不够深入,知识点掌握的不够透彻。
  • 造成以上结果的原因是多方面的。第一个原因,学习的很多内容没有复习,只是学一遍,印象并不深刻,可能放下书之后就忘了所学的内容,没有做到反复阅读教材。第二个原因是心不够静,太急于求成,想一口吃成胖子,可惜我的消化能力不够。第三个原因为是天赋所限,真的是能力不济,纵绞尽脑汁,也无法得其真谛。爱因斯坦说,“天才就是1%的灵感加上99%的汗水;关键是那1%的灵感。”我仿佛听见了爱因斯坦的笑声。
  • 不说了,满满的都是不足。

课程建议和意见

  • 还记得那是一个阳光明媚的下午,所有同学的感受都是一样的,那就是————娄老师,有你在,天都好了。那周适逢国庆,娄老师紧跟时代潮流,开创了信息安全系统假期无作业的先例,不由得想起归有光所写的,“今已亭亭如盖矣。”师恩浩荡,现在想起,仍喜矣,泣矣。不奢求所有的法定节假日,但求一个元旦,不过貌似元旦课程就结束了。。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 120/200 1/2 16/16 学习Linux核心命令
第二周 100/200 1/3 30/46 学习vim,gcc以及gdb的基本操作
第三周 30/230 1/4 15/61 对信息的表示和处理有更深入的理解
第四周 30/260 1/5 22/83 双系统的探索
第五周 130/390 1/6 25/108 汇编的深入学习
第六周 60/450 1/7 25/133 熟悉了Y86模拟器
第七周 60/510 2/9 20/153 掌握局部性原理
第八周 0/510 2/11 16/169 期中总结

参考资料

posted @ 2016-11-06 18:59  20145211  Views(227)  Comments(2Edit  收藏  举报