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

期中总结

一、常用命令总结

man -k:

常用来搜索,结合管道使用。例句如下:

man -k k1 | grep k2 | grep 2

搜索同时含有k1和k2,且属于系统调用。

最后的数字意味着帮助手册中的区段,man手册共有8个区段,最常用的是123,含义如下:

1.Linux
2.系统调用
3.c语言

但是当单独用man语句的时候,想查看其中的单独某个区段内的解释时,用法是这样的:

man 3 printf

即查找c语言中printf的用法。

grep -nr

这条语句可以用来查找关键字,全文搜索,并且可以直接查找文件内的内容。其中:

n:为显示行号
r:为递归查找

例如,如果想查找某个宏,我们已知宏保存在include文件夹中,所以可以使用下列语句:

grep -nr XXX /usr/include(XXX为所要找的宏)

cheat

cheat是非常好用的“打小抄”搜索工具,能够方便的告诉你你想要的内容。
示例:

cheat ls

二、常用工具

vim

vim是一种非常好用的编辑器,总共有六种基本模式,最常用的是普通模式、插入模式和命令行模式。需要熟悉这三种模式之间的切换方式:

普通→插入: i 或 a

插入→普通: Esc 或 Ctrl + [

普通→命令行: :

命令行→普通:Esc 或 Ctrl + [

gcc

常用选项

-c      只编译不链接,生成目标文件.

o-S      只编译不汇编,生成汇编代码

-E      只进行预编译,不做其他处理

-g      在可执行程序中包含标准调试信息-o file 将file文件指定为输出文件

-v      打印出编译器内部编译各过程的命令行信息和编译器的版本

-I dir  在头文件的搜索路径列表中添加dir目录

编译过程

预处理:gcc –E hello.c –o hello.i;  gcc –E调用cpp 生成中间文件

编 译: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**   创建可执行目标文件

gdb

GDB最基本的命令有:

gdb programm(启动GDB)
l   查看所载入的文件
b   设断点
info b  查看断点情况
run 开始运行程序
bt  打印函数调用堆栈
p   查看变量值
c   从当前断点继续运行到下一个断点
n   单步运行(不进入)
s   单步运行(进入)
quit 退出GDB

四种断点:

1.行断点

b [行数或函数名] <条件表达式>

2.函数断点

b [函数名] <条件表达式>

3.条件断点

b [行数或函数名] <if表达式>

4.临时断点

tbreak [行数或函数名] <条件表达式>

另外的调试工具:

cgdb,有单独的debug窗口,更方便查看

ddd,图形页面

Make和Makefile

这是实现自动化编译的好方法。

Makefile的一般写法:

一个Makefile文件主要含有一系列的规则,每条规则包含以下内容:

  • 需要由make工具创建的目标体,通常是可执行文件和目标文件,也可以是要执行的动作,如‘clean’;
  • 要创建的目标体所依赖的文件,通常是编译目标文件所需要的其他文件。
  • 创建每个目标体时需要运行的命令,这一行必须以制表符TAB开头

三、正则表达式

作用:

  • 验证是否匹配
  • 查找
  • 替换

规则:

  • \ 特殊符号,表示后面的字符本身
  • [ ] 匹配其中任意字符,但每次匹配只匹配一个
  • [^ ] 匹配除其中的任意字符,每次匹配只匹配一个
  • {n} 次数修饰,重复n次,具体如下:
    ?= {0,1}
    += {1, }
    *= {0, }
    {m,n}:至少为m,至多为n

    匹配方法:

  • ^ 从字符串开始的地方匹配
  • $ 从字符串结束的地方匹配
  • | 可以匹配左或者右
  • () 1.次数修饰中,可以表示当做整体;2.结果中,可以表示单独表示

贪婪:尽可能多的匹配

四、课本重要思想

第一章 计算机系统漫游

这一章介绍了一些基本的概念,是以后各章的总括,提到的内容都在之后的各章中拆开细讲,我认为这章最重要的就是一句话:

信息=位+上下文

计算机中的信息都是有二进制数字表达的,而因为这些二进制位所处的位置不同,是有符号数还是无符号数,是大端法还是小端法,由于具体的解释不同,造成的结果也不同。

之后的学习就是如何读写位,和上下文如何对应。

第二章 信息的表示和处理

这章里我觉得最容易混淆的是小端法和大端法。常用小端法,巧记方式是“高对高,低对低”,但是同时要注意字节在存放的时候的高低与我们惯常认知中的高低位的关系,以及一串数据中几位代表一个字节:

一个字节是8位,也就是两位十六进制数。

然后是整数中,有符号数和无符号数的表示,补码表示,位运算和逻辑运算,溢出、截断和扩展;

浮点数中,二进制小数,最重要的是IEEE小数:

IEEE浮点标准:

用V=(-1)^s X 2^E X M 来表示一个数:
符号:s决定这个数是正还是负。0的符号位特殊情况处理。
阶码:E对浮点数加权,权重是2的E次幂(可能为负数)
尾数:M是一个二进制小数,范围为1~2-ε或者0~1-ε(ε=1/2的n次幂)

编码规则:

单独符号位s编码符号s,占1位
k位的阶码字段exp编码阶码E
n位小数字段frac编码尾数M(同时需要依赖阶码字段的值是否为0)

两种精度

  • 单精度(float),k=8位,n=23位,一共32位;
  • 双精度(double),k=11位,n=52位,一共64位。

三种被编码情况

  • 规格化的
  • 非规格化的
  • 特殊值

还有舍入方式:

1.向偶舍入(默认方法)

即:将数字向上或向下舍入,是的结果的最低有效数字为偶数。
能用于二进制小数。

2.向零舍入

即:把整数向下舍入,负数向上舍入。

3.向下舍入

正数和负数都向下舍入。

4.向上舍入

正数和负数都向上舍入。

默认的(即向偶舍入)方法可以得到最接近的匹配,其余三种可用于计算上界和下界。

第三章 程序的机器级表示

这一章和之前学习过的汇编很像,需要注意的就是寻址方式和几个操作,mov,push,pop,leal,还有跳转指令、控制转移指令等等。

几个比较新的容易遗忘的知识点是:

翻译循环

汇编中可以用条件测试和跳转组合起来实现循环的效果,但是大多数汇编器中都要先将其他形式的循环转换成do-while格式。

1.do-while循环

通用形式:

do
body-statement
while(test-expr);
循环体body-statement至少执行一次。

可以翻译成:

loop:
body-statement
t = test-expr;
if(t)
goto loop;
即先执行循环体语句,再执行判断。

2.while循环

通用形式:

while (test-expr)
body-statement
GCC的方法是,使用条件分支,表示省略循环体的第一次执行:

if(!test-expr)
goto done;
do
body-statement
while(test-expr);
done:
接下来:

t = test-expr;
if(!t)
goto done:
loop:
body-statement
t = test-expr;
if(t)
goto loop;
done:
归根究底,还是要把循环改成do-while的样子,然后用goto翻译。

3.for循环

for循环可以轻易的改成while循环,所以再依照上面的方法改成do-while再翻译即可。

寄存器使用惯例

程序寄存器组是唯一能被所有过程共享的资源。

这个惯例是为了防止一个过程P调用另一个过程Q时寄存器中的值被覆盖。惯例如下:

%eax,%edx,%ecx 调用者保存寄存器(Q可覆盖,P的数据不会被破坏)
%ebx,%esi,%edi 被调用者保存寄存器(Q在覆盖这些值前必须压入栈并在返回前回复他们)
%ebp,%esp 惯例保持
%eax用来保存返回值

帧栈结构

这一部分最重要的参见函数调用帧栈的实践,可以参见孙小博同学的讲解中的调用部分,还有笔记本上的所写的帧栈调用过程。

其实这里最基本的是要知道,针对每一句汇编语句,它都干了些什么,寄存器里的值如何变化,栈帧如何变化,内存中的值如何变化,更要明白的是每一行的变化都代表着什么。

我现在欠缺的就是这一点,解读每一句是对存储器或者寄存器做了什么动作不难,但是要明白为什么这么做,这么做对应着高级编程语言中的什么,就显得生疏,需要多加练习。

第四章 处理器体系结构

这章里学习的是一个相对简单的处理器Y86,指令集比起IA32省略了很多。学习中我觉得一个比较不容易掌握,做题时需要反复查阅的是:

指令的字节级编码

每条指令需要1-6个字节不等,每条指令的第一个字节表明指令的类型

1.第一个字节

这个字节分为两个部分,每个部分4位:

  • 高四位:代码部分,值域为0~0xB
  • 第四位:功能部分,功能值只有在一组相关指令共用一个代码时才有用。

比如:课本第233页,Y86指令集的功能码:

整数操作里代码部分均为6,功能部分区分addl,subl,andl,xorl

分支指令里代码部分均为7

传送指令里代码部分均为2

这里要注意rrmovl归到了传送指令里,前面说过它们有相同的指令代码

8个程序寄存器中每个都有相应的0~7的寄存器标识符,程序寄存器存在CPU中的一个寄存器文件中,这个寄存器文件就是一个小的、以寄存器id作为地址的随机访问存储器。

当需要指明不应访问任何寄存器时,用ID值0xF表示

2.有的需要额外的字节
(1)附加的寄存器指示符字节

指定一个或两个寄存器,例如rA或者rB。

  • 没有寄存器操作数的指令,例如分支指令和call指令,就没有寄存器指示符字节。
  • 只需要一个寄存器操作数的指令(irmovl,pushl,popl)将另一个寄存器指示符设为0xF
(2)附加的4字节常数字

这个字的用处:

1.irmovl的立即数数据
2.rmmol和mrmovl的地址指示符的偏移量
3.分支指令和调用指令的目的地址

注意事项

1.分支指令和调用指令的目的地址是一个绝对地址
2.所有整数采用小端法编码

指令编码这一部分可以帮助我们理解机器码与汇编代码的对应关系,并且涉及到下一个我认为的难点:

Y86的顺序实现

这里的六个阶段和每个阶段进行的动作,得出的数据和对应的结果看起来似乎眼花缭乱,但是课本上已经给出了部分常用命令的具体过程,课后的作业题中也有过类似的作业,这要求我们的举一反三的能力。

至于HDL语言,在EDA课程中已经有过基础,看起来倒是比较轻松。

第六章存储器层次结构

涉及到ROM,RAM,磁盘的几个计算,总线等等。概念理解起来比较简单,计算只需要套公式,注意不要漏算盘面或者柱面就好。

这一章我觉得最重要的是局部性。

局部性原理:

一个编写良好的计算机程序,常常倾向于引用临近于其他最近引用过的数据项的数据项,或者最近引用过的数据项本身。

分类:

  • 时间局部性
  • 空间局部性

量化评价一个程序中局部性的简单原则:

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

还有存储器层次结构,这里最重要的思想是这句话:每层存储设备都是下一层的“缓存”

这样就涉及到了缓存命中和不命中的情况,还有替换策略:

1.缓存命中

当程序需要第k+1层的某个数据对象d时,首先在当前存储在第k层的一个块中查找d,如果d刚好缓存在第k层中,就称为缓存命中。

该程序直接从第k层读取d,比从第k+1层中读取d更快。

2.缓存不命中

即第k层中没有缓存数据对象d。

这时第k层缓存会从第k+1层缓存中取出包含d的那个块。如果第k层缓存已满,就可能会覆盖现存的一个块

覆盖——替换/驱逐

替换策略:

  • 随机替换策略-随机牺牲一个块
  • 最近最少被使用替换策略LRU-牺牲最后被访问的时间距离现在最远的块。

3.缓存不命中的种类

(1)强制性不命中/冷不命中

即第k层的缓存是空的(称为冷缓存),对任何数据对象的访问都不会命中。

(2)冲突不命中

由于一个放置策略:将第k+1层的某个块限制放置在第k层块的一个小的子集中,这就会导致缓存没有满,但是那个对应的块满了,就会不命中。

(3)容量不命中

当工作集的大小超过缓存的大小时,缓存会经历容量不命中,就是说缓存太小了,不能处理这个工作集。

然后是高速缓存存储器

高速缓存是一个高速缓存组的数组,它的结构可以用元组(S,E,B,m)来描述:

S:这个数组中有S=2^s个高速缓存组
E:每个组包含E个高速缓存行
B:每个行是由一个B=2^b字节的数据块组成的
m:每个存储器地址有m位,形成M=2^m个不同的地址

除此之外还有标记位和有效位:

有效位:每个行有一个有效位,指明这个行是否包含有意义的信息
标记位:t=m-(b+s)个,唯一的标识存储在这个高速缓存行中的块
组索引位:s
块偏移位:b
高速缓存的结构将m个地址划分成了t个标记位,s个组索引位和b个块偏移位。

六、收获

这半个学期以来,我觉得我最大的收获是对自主学习这种方式的逐步适应。学期初我拿到这本教材的时候是非常头疼的,在当时的我眼里,这本书又厚又不知所云,根本不知道该怎样着手学习。但是当我真正开始把心沉进去看这本书的时候,我就发现里面有很多思想很多知识是能够从过往的课程里得到验证的。

而对于那些不熟悉的,完全没有接触过的知识来说,初期的学习是极其痛苦的,总觉得要学的东西太多,自己知道的太少,时间不够用,精力拼不起,整个人都要累垮了还是不能学到多少知识。但是后来我知道了,这是因为我的学习方法不对,谁都不能一口气吃成个胖子,贪多嚼不烂,我过多的追求每一个知识点的深入只能导致哪个都不能学好,付出很多的时间反而做了无用功。

七、不足

学习的时候不觉得,但是考试和做家庭作业的时候就会觉得,自己的学习还是有些流于表面,太粗糙,很多东西看书的时候没有注意到,或者说以为不重要就忽略了,其实都是不应该的,有些时候还需要反复的去翻书。我觉得这主要还是因为我对习题的重视程度不够,很多题没有吃全吃透,不能做到举一反三。

时间: 2024-12-22 20:03:41

20145225 《信息安全系统设计基础》期中总结的相关文章

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

期中总结 一.常用命令 man -k;grep;cheat;find;locate;apt-get. 二.正则表达式 ①查找匹配.检索.替换 ② + 表示前面的字符必须出现至少一次(1次或多次)  ? 表示前面的字符最多出现一次(0次或1次)  * 星号代表前面的字符可以不出现,也可以出现一次或者多次(0次.或1次.或多次) 字符 描述 \ 将下一个字符标记为一个特殊字符.或一个原义字符.例如,“n”匹配字符“n”.“\n”匹配一个换行符.序列“\\”匹配“\”而“\(”则匹配“(”. ^ 匹配

20135218——信息安全系统设计基础期中总结

第八周学习及期中考试总结 一: 1:Linux命令      登录Linux后,我们就可以在#或$符后面去输入命令,有的时候命令后面还会跟着选项(options)或参数(arguments).       即Linux中命令格式为:command[options][arguments].但有些命令也不需要跟着选项或参数. 2 :man命令       1是普通的Linux命令(用户命令帮助)       2是系统调用,操作系统的提供的服务接口(系统调用帮助)       3是库函数, C语言中的

20135210——信息安全系统设计基础期中学习总结

学习任务 复习Linux命令,特别是man -k, cheat, grep -nr xxx /usr/include 复习vi, gcc, gdb,make的使用 复习教材内容ch01 ch02 ch03 ch04 ch06 ch07 复习前面的考题(答案解析见http://group.cnblogs.com/topic/73060.html) ,下次考试考每次考试错的最多的题目 期中总结发一篇Blog 知识点总结 man命令调用手册页 man <command_name> 手册通常被分为8个

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

Chapter 00 Linux基础 man命令调用手册页 man <command_name> 手册通常被分为8个区段,要查看相应区段的内容,就在 man 后面加上相应区段的数字即可: 1 一般命令 2 系统调用 3 库函数,涵盖了C标准函数库 4 特殊文件(通常是/dev中的设备)和驱动程序 5 文件格式和约定 6 游戏和屏保 7 杂项 8 系统管理命令和守护进程 man有一个-k 选项用起来非常好,这个选项让你学习命令.编程时有了一个搜索引擎,可以举一反三.结合后面学习的grep 命令和

信息安全系统设计基础期末总结-吕松鸿

每周读书笔记链接汇总 信息安全系统设计基础第一周学习总结http://www.cnblogs.com/lv-20135229/p/4824505.html 信息安全系统设计基础第二周学习总结http://www.cnblogs.com/lv-20135229/p/4842179.html 信息安全系统设计基础第三周学习总结http://www.cnblogs.com/lv-20135229/p/4854817.html 信息安全系统设计基础第四周学习总结http://www.cnblogs.co

20145336张子扬 《信息安全系统设计基础》期中总结

20145336张子扬 <信息安全系统设计基础>期中总结 教材学习内容总结 学习目标 复习 Linux常用命令 复习 教材1-7章 man命令 在 Linux 环境中,如果你遇到困难,可以使用man 命令,它是Manual page的缩写.要查看相应区段的内容,就在 man 后面加上相应区段的数字即可. -a:在所有man帮助手册中搜索 -k xxx(所查找内容) |grep x(标号) -f:关键字精确搜索,显示给定关键字的简短描述信息 -p:指定内容时使用分页程序 -M:指定man手册搜索

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

20145239 <信息安全系统设计基础>期中总结 知识点总结 常用的Linux命令 Linux中命令格式为:command [options] [arguments] []表示是可选的,即组成结构为:命令 [选项] [参数] man命令 man命令是Linux下的帮助指令,通过man指令可以查看Linux中的指令帮助.配置文件帮助和编程帮助等信息. 常用选项: -a:在所有的man帮助手册中搜索 -k:根据关键字搜索联机帮助,是一种模糊搜索 -f:关键字精确搜索,等价于whatis指令,显示

20145225 《信息安全系统设计基础》第1周学习总结

20145225 <信息安全系统设计基础>第1周学习总结 一.Ubuntu常用快捷键 CTRL+ALT+T:打开终端,天天使用终端,用鼠标打开太低效了: CTRL+SHIFT+T:新建标签页,编程时有重要应用: ALT+数字N:终端中切换到第N个标签页,编程时有重要应用: Tab:终端中命令补全,当输入某个命令的开头的一部分后,按下Tab键就可以得到提示或者帮助完成: 上下键盘:切换命令历史,刚输入一个很长的命令,按上键就可以恢复: CTRL+C:中断程序运行. 二.Linux核心命令 命令格

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

20145311 <信息安全系统设计基础>期中总结 以往考试生疏题总结 Linux中没有C盘,D盘,其文件系统的目录是由(FHS)标准规定好的.Linux Bash中,查找home目录中昨天创建的文件的命令是(find ~ -ctime 1).查找宏 STDOUT_FILENO 的值的命令是(grep -nr STDOUT_FILENO /usr/include) 宏一般在/usr/include文件夹中查找根目录下所有目录的find命令是(find / -type d) 生成静态库:gcc

20145322 《信息安全系统设计基础》课程总结

#20145322 <信息安全系统设计基础>课程总结 每周作业链接汇总 第零周 预习课程知识,安装环境 第一周 Linux 目录结构及一些基本的linux操作和命令 第二周 学习内容 熟悉Linux系统下的开发环境 熟悉vi的基本操作 熟悉gcc编译器的基本原理 熟练使用gcc编译器的常用选项 熟练使用gdb调试技术 熟悉makefile基本原理及语法规范 掌握静态库和动态库的生成与调用方法 理解C程序中模块的概仿,模块分解的"高内聚,低耦合"的原则 了解链接的概念 第三周