期中总结

第一部分 教材外

一、linux常用命令

1、man

Manual pages 是在 UNIX 或类 UNIX 操作系统在线软件文档的一种普遍的形式。 内容包括计算机程序(包括库和系统调用),正式的标准和惯例,甚至是抽象的概念。用户可以通过执行 man 命令调用手册页。

man 手册的内容很多,涉及了 Linux 使用过程中的方方面面,为了便于查找,是做了分册(分区段)处理的,在Research UNIX、BSD、OS X 和 Linux 中,手册通常被分为8个区段:1.一般命令;2.系统调用;3.库函数(涵盖了c标准函数库);4.特殊文件和驱动程序;5.文件格式和约定;6.游戏和屏保;7.杂项;8.系统管理命令和守护进程。

要查看相应区段的内容,就在 man 后面加上相应区段的数字即可,如:$ man 3 printf (查看c标准函数库中的printf用法)

2、ls -l 查看文件权限

3.cheat

cheat命令可以告诉你想要知道的。

4.find

在指定目录下搜索指定文件名的文件:$ find /etc/ -name interfaces

与时间相关的命令参数:

  -stime 最后访问时间

  -ctime 创建时间

  -mtime 最后修改时间

  以-mtime参数举例:

    -mtime n: n 为数字,表示为在n天之前的”一天之内“修改过的文件

    -mtime +n: 列出在n天之前(不包含n天本身)被修改过的文件

    -mtime -n: 列出在n天之前(包含n天本身)被修改过的文件

    newer file: file为一个已存在的文件,列出比file还要新的文件名

5.grep

grep -nr xxx/usr/include 查找宏xxx的值

-r 参数表示递归搜索子目录中的文件,-n表示打印匹配项行号

6.zip

使用zip打包文件夹:

  $ zip -r -q -o shiyanlou.zip /home/shiyanlou(用zip打包shiyanlou文件夹中的home文件夹为实验楼.zip)

  -r参数表示递归打包包含子目录的全部内容,-q参数表示为安静模式,即不向屏幕输出信息,-o,表示输出文件,需在其后紧跟打包输出文件名。

用du命令查看压缩的文件的大小:

  $ du -h shiyanlou.zip

用unzip解压文件到当前文件夹:

  $ unzip shiyanlou.zip

二、vim

六种基本模式:普通模式,插入模式,可视模式,选择模式,命令行模式,EX模式

前三种常用模式的切换:vim启动进入普通模式,处于插入模式或命令行模式时只需要按Esc或者Ctrl+[即可进入普通模式。普通模式中按i(插入)或a(附加)键都可以进入插入模式,普通模式中按:进入命令行模式。命令行模式中输入wq回车后保存并退出vim。

三、gcc

GNU CC(简称为gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C++和Object C等语言编写的程序。gcc又是一个交叉平台编译器,它能够在当前CPU平台上为多种不同体系结构的硬件平台开发软件,因此尤其适合在嵌入式领域的开发编译。

1.gcc支持编译的一些源文件后缀名

后缀 源文件
.c C语言源文件
.C .cc .cxx C++源文件  
.m Object-C源文件
.i 经过预处理的C源文件
.ii 经过预处理的C++源文件
.s .S 汇编语言源文件
.h 头文件
.o 目标文件
.a 存档文件

 

 

 

 

 

 

 

 

2.gcc编译程序的流程

图片描述信息

四、gdb

1.基本命令

  gdb programm(启动GDB)

  b 设断点(要会设4种断点:行断点、函数断点、条件断点、临时断点)

  run 开始运行程序

  bt 打印函数调用堆栈

  p 查看变量值

  c 从当前断点继续运行到下一个断点

  n 单步运行

  s 单步运行

  quit 退出GDB

2.断点

  行断点 b [行数或函数名]  条件表达式

  函数断点 b [函数名]  条件表达式

  条件断点 b [行数或函数名]  if表达式 

  临时断点 tbreak [行数或函数名]  条件表达式 

五、动态库和静态库

静态库:xx.a    xx.lib

动态库:xx.so  xx.dll

1.静态库:

创建一个静态库:

  gcc -c addvec.c multvec.c

  ar rcs libvector.a addvec.o multvec.o

  gcc -c只编译,不连接成为可执行文件。 即:把.c文件编译成.o文件

  ar -r:在库中插入模块(替换) -c:创建一个库 -s:写入一个目录文件索引到库中

        即:把两个.o文件归档成静态库存档文件.a并且写入目录文件索引到库中

创建它的可执行文件:

  gcc -02 -c main2.c

  gcc -static -o p2 main2.o ./libvector.a

  gcc -02 和-0都是代码优化指令,可以减少编译时间

  -c 只编译,不连接成为可执行文件

  -static 告诉编译器驱动程序,链接器应该构建一个完全链接的可执行目标文件

  -o 命名生成文件

2.动态库

创建共享库:把.c文件编译成为.o文件,放入新建的共享库中,并且命名。

  gcc -shared -fPIC -o libvector.so addvec.c multvec.c

  -fPIC 指示编译器生成与位置无关的代码

  -shared 指示链接器创建一个共享的目标文件

  -o 命名生成文件

链接程序:创建一个可执行目标文件p2,在运行时可以和动态库libverctor.so链接

  gcc -o p2 main2.c ./libvector.so

第二部分 教材

第二章 信息的表示和处理

一、三种重要的数字表式:

 

1、 无符号数:编码基于传统的二进制表示法表示大于或等于零的数字。

 

2、 补码:编码是表示有符号整数的最常见方法,可以是正或者是负的数字。

 

3、 浮点数:编码是表示实数的科学计数法的以二位基数的版本

二、小端法和大端法

小端法:最低有效字节在前面——“高对高,低对低”

大端法:最高有效字节在前面

三、浮点数

浮点表示对形如V=x X (2^y)的有理数进行编码,适用于:非常大的数字,非常接近于0的数字,作为实数运算的近似值

1.二进制小数

  小数点以左是2的正次幂,以右是2的负次幂。

2.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),s=1位,k=8位,n=23位,一共32位;

  双精度(double),s=1位,k=11位,n=52位,一共64位。

三种情况:

1.规格化的值:

  exp的位模式既不全为0也不全为1,这种情况中,阶码字段被解释为以偏置形式表示的有符号整数。

  阶码E = e-Bias(Bias=[2^(k-1)-1])

  二进制小数点在小数字段最高有效位的左边。

  尾数M = 1+f(隐含的以1开头的表示)

2.非规格化的值

  当阶码域为全0时,阶码E = 1-Bias,尾数M = f(小数字段的值,不包含隐含的1)

  非规格化提供了表示0和极接近0的数值的方法

3.特殊值

  阶码全1时。

  一种情况是无穷,一种情况是“不是一个数”

四、舍入

舍入运算的任务是找到和数值x最接近的匹配值x',可以用期望的浮点形式表示出来。

1.向偶数舍入

  将数字向上或者向下舍入,使结果的最低有效数字是偶数。

2.向0舍入

3.向上舍入

4.向下舍入

34可以看上界下界。

向偶舍入可以得到最接近的匹配。

第三章 程序的机器级表示

 

指令和汇编很像,数据传送指令mov,pushl,popl,跳转指令jmp

一、栈帧结构:

  

假设过程p(调用者)调用过程q(被调用者),则q的参数放在p的栈帧中,另外,当p调用q时,p中的返回地址被压入栈中,形成p的栈帧的末尾。返回地址就是当程序从q返回时应该继续执行的地方。q的栈帧从保存的帧指针的值开始,后面是保存的其他寄存器的值。

过程q也用栈来保存其它不能存放在寄存器中的局部变量,这样做的原因如下:

  没有足够多的寄存器存放所有的局部变量

  有些局部变量是数组或结构,因此必须通过数组或结构引用来访问

  要对一个局部变量使用地址操作符&,我们必须能够为它生成一个地址

二、寄存器使用惯例

必须保证一个调用者调用被调用者时,被调用者不会覆盖某个调用者稍后会用到的寄存器的值。

实现以上要求的两个方式:

  在调用q之前,将y的值存放在自己的栈帧之中,当q返回时,过程p就可以从栈中取出y的值,即调用者保存y的值。

  将y的值保存在被调用者保存寄存器,调用后返回前恢复该值。

第四章 处理器体系结构

一、指令编码

所有字节序列都是根据上面几张图写出来的。

二、Y86的顺序实现

  ·取指:从存储器读取指令字节,地址为程序计数器(pc)的值,从指令中抽取出指令指示符字节的两个四位部分,成为icode(指令代码),和ifun(指令功能)。它还可能取出一个寄存器指示符字节,致命一个或者两个寄存器操作数指示符rA和rB,也可能取出一个四字节常数字valC。下一条指令的地址valP为pc的值加上已取出指令的长度。

  ·译码:从寄存器文件读入最多两个操作数,得到valA和/或valB。

  ·执行:算数/逻辑单元要么执行指令指明的操作,计算存储器引用的有效地址,要么增加或者减少栈指针,得到的值称为valE。如果有条件码,在这个阶段检验条件码。

  ·访存:将数据写入存储器,或从存储器读出数据,读出的值称为valM。

  ·写回:最多可以写两个结果到寄存器文件。

  ·更新PC:将PC设置成下一条指令的地址。

第六章 存储器层次结构

一、局限性

局部性原理:时间局部性,空间局部性。

顺序引用模式(步长为1的引用模式):顺序访问一个向量的每个元素。是程序中空间局部性常见和重要的来源。

  步长为k的引用模式:一个连续向量中,每隔k个元素进行访问,随k增加,空间局部性下降。

双重嵌套循环按照行优先顺序读数组的元素。

一些原则:

  重复引用同一个变量的程序具有良好的时间局部性。

  对于取指令来说,循环有好的时间和空间局部性。循环体越小,循环迭代次数越多,局部性越好。

二、缓存

存储器层次结构的中心思想:层次结构的每一层都缓存来自下一层的数据对象。

缓存命中、不命中及不命中后的处理。

三、高速缓存存储器

S E B m:一个计算机系统,每个存储器地址有m位,形成M=2m个不同的地址,这样一个机器的高速缓存被组织成一个有S=2s个高速缓存组的数组,每个组包含E个高速缓存行,每个行由一个B=2b字节的数据块组成,一个有效位指明这个行是否包含有意义的信息,还有t=m-(b+s)个标记位,它们唯一的标识存储在这个高速缓存行中的块。

参考资料

实验楼,博客园,教材

第三部分 收获和不足

经过这几周的学习,我逐渐适应了现在这种学习方式,深入理解计算机系统这本教材内容不算深奥,挺适合我这种没什么基础的人去学,但是有些地方对我来说还是有些简略,通过百度看各种资料才能理解。对书上的知识点,我进行总结的时候抓重点的能力还是不足,考试的时候就发现一些地方似是而非,换一种描述方式就反应不过来,还有一些题目中的特殊情况在看书时根本没想到过。有些书上重要的地方没有重视,反而抓着一些一般的内容,有些习题也是看看觉得会了就跳过了,之后却发现只是理解了几种情况,并不能做到举一反三,以后还要多练习一下,对教材的理解也要更深入一些。

 

posted @ 2015-11-01 15:37  20125221银雪纯  Views(185)  Comments(1Edit  收藏  举报