第一部分 教材外
一、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)个标记位,它们唯一的标识存储在这个高速缓存行中的块。
参考资料
实验楼,博客园,教材
第三部分 收获和不足
经过这几周的学习,我逐渐适应了现在这种学习方式,深入理解计算机系统这本教材内容不算深奥,挺适合我这种没什么基础的人去学,但是有些地方对我来说还是有些简略,通过百度看各种资料才能理解。对书上的知识点,我进行总结的时候抓重点的能力还是不足,考试的时候就发现一些地方似是而非,换一种描述方式就反应不过来,还有一些题目中的特殊情况在看书时根本没想到过。有些书上重要的地方没有重视,反而抓着一些一般的内容,有些习题也是看看觉得会了就跳过了,之后却发现只是理解了几种情况,并不能做到举一反三,以后还要多练习一下,对教材的理解也要更深入一些。