熟知任务:
1. 复习Linux命令,特别是man -k, cheat, grep -nr xxx /usr/include
2. 复习vi, gcc, gdb,make的使用
3. 复习教材内容ch01 ch02 ch03 ch04 ch06 ch07
4. 复习前面的考题(答案解析见http://group.cnblogs.com/topic/73060.html) ,下次考试考每次考试错的最多的题目
5. 期中总结发一篇Blog:
知识点总结
自己的收获(不要假大空)
自己的不足(要具体,有改进措施)
课程建议和意见(要有理由)
一、Linux命令
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的用法。
cheat
cheat够告诉你想要的内容。
示例:
cheat vim
grep -nr
这条语句可以用来查找关键字,全文搜索,并且可以直接查找文件内的内容。其中:
n:为显示行号 r:为递归查找
例如,如果想查找某个宏,我们已知宏保存在include文件夹中,所以可以使用下列语句:
grep -nr XXX /usr/include(XXX为所要找的宏)
二、工具使用
vim
vim是一种非常好用的编辑器,总共有六种基本模式,最常用的是普通模式、插入模式和命令行模式。需要熟悉这三种模式之间的切换方式:
普通→插入: i 或 a 插入→普通: Esc 或 Ctrl + [ 普通→命令行: : 命令行→普通:Esc 或 Ctrl + [
常用的进入、保存和退出指令:
进入:
vim
文件名 保存:命令行模式 :w 退出:命令行模式 :q
常用动作:
删除:dd删除整行 复制:yy复制整行 粘贴:p
实用功能:交换上下行——ddp,快速交换光标所在行与它下面的行。
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** 创建可执行目标文件
-o后面是接的你给生成的文件指定的名字,如果不指定,则默认为a.out
在命令行上运行这个可执行目标文件需要输入它的名字: ./a.out
其中./代表当前目录。
gdb
注意:使用GCC编译时要加“-g”参数,然后才能够用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 [行数或函数名] <条件表达式>
Make
Makefile的一般写法:
一个Makefile文件主要含有一系列的规则,每条规则包含以下内容:
需要由make工具创建的目标体,通常是可执行文件和目标文件,也可以是要执行的动作,如‘clean’;
要创建的目标体所依赖的文件,通常是编译目标文件所需要的其他文件。
创建每个目标体时需要运行的命令,这一行必须以制表符TAB开头
格式为:
test(目标文件): prog.o code.o(依赖文件列表)
tab(至少一个tab的位置)
gcc prog.o code.o -o test(命令)
定义变量的两种方式:
(1)递归展开方式 VAR=var
(2)简单方式 VAR:=var
三、知识点总结
第1章 计算机系统漫游
处理器读取并解释存放在主存里的二进制指令,因为计算机可以把大量的时间用于存储器、I/O设备和CPU寄存器之间复制数据,所以将系统中的存储设备划分成层次结构--CPU寄存器在顶部,接着是多层的硬件高速缓存存储器、DRAM主存和磁盘存储器在层次模型中,位于更高层的存储设备比低层的存储设备要更快,单位比特开销也更高。层次结构中较高层次存储设备可以作为较低层次设备的高速缓存。
操作系统内核是应用程序和硬件之间的媒介。
它提供三个基本的抽象:
(1)文件是对I/O的抽象
(2)虚拟存储器是对主存和磁盘的抽象
(3)进程是对处理器、主存抽象和I/O设备的设备最后,网络提供了计算机系统之间通信的手段
第2章 信息的表示和处理
计算机将信息按位编码,通常组织成字节序列。用不同的编码方式表示整数、实数和字符串。不同的计算机模型在编码数字和多字节数据中的字节排序时使用不同的约定。C语言的设计可以包容多种不同字长和数字编码的实现。虽然高端机器逐渐开始使用64位字长,但是目前大多数机器仍使用32位字长。大多数机器对整数使用补码编码,而对浮点数使用IEEE浮点编码。在位级上理解这些编码,并且理解算术运算的数学特性,对于想使编写的程序能在全部数值范围上正确运算的程序员来说,是很重要的。在相同长度的无符号和有符号整数之间进行强制类型转换时,大多数C语言实现遵循的原则是底层的位模式不变。在补码机器上,对于一个W位的值,这种行为是由函数T2Uw和U2Tw来描述的。
第3章 程序的机器级表示
计算机执行机器代码,用字节序列编码低级操作,包括处理数据、管理储存器、读写储存设备上的数据,以及利用网络通信。
3.1历史观点
Intel处理器俗称X86,经历了长期的、不断进化的发展过程。
3.2程序编码
编译代码:gcc =O1 -o p p1.c p2.c
实际上gcc命令调用了一系列程序,将源代码转化成可执行代码。
3.2.1机器级代码
指令集体系结构ISA:定义了处理器状态、指令的格式,每条指令对状态的影响。
3.4访问信息
一个IA32中央处理单元包含一组8个储存32位值的寄存器。这些寄存器用来存储整数数据和指针。
3.4.2数据传送指令
将数据从一个位置复制到另一个位置的指令。
3.4.3数据传送指令:
MOV:movb,movw,movl分别传送字节,字,双字
MOVZ(零扩展,高位用0填充):同上,压栈出栈见p114表格。(注意栈顶的地址值是栈中最小的)
MOVS(符号扩展,高位用原来最高位的数值填充):同上
C语言中,指针就是地址,间接引用指针就是将指针放在一个寄存器中,然后在存储器中使用这个寄存器。
3.5算数和逻辑操作
四种整数操作:
加载有效地址:实际是将有效地址写入目的操作数,目的操作数必须是寄存器。
一元操作:只有一个操作数,可以是寄存器也可是存储器位置。
二元操作:源操作数是第一个,可以是立即数、寄存器、存储器 目的操作数是第二个,可以是寄存器、存储器 两个不能同时为存储器。
移位:第一个是移位量,用单个字节编码(只允许0-31位的移位)。
3.6控制
控制中最核心的是跳转语句:
有条件跳转
无条件跳转
3.6.5循环
1.do-while循环
通用形式:
do
body-statement
while(test-expr);
loop:
body-statement
t = test-expr;
if(t)
goto loop;
2.while循环
通用形式:
while (test-expr)
body-statement
if(!test-expr)
goto done;
do
body-statement
while(test-expr);
3.for循环
通用形式:
for(init-expr;test-expr;update-expr)
body-satament
第4章 处理器体系结构
我们看到的计算机系统只限于机器语言程序级。我们知道处理器必须执行一系列的指令。设计处理器的第一步:给出一个基于顺序操作、功能正确有点不实用的Y86处理器。
4.1Y86指令集体系结构
4.1.1程序员可见状态
Y86程序中每条指令都会读取或者修改处理器状态的某些部分的状态。
4.1.2 Y86指令
存储器:Y86程序用虚拟地址来引用存储器位置,硬件和操作系统软件联合起来将虚拟地址翻译成实际或物理地址。
状态码:表明程序执行的总体状态,会指示是正常运行还是出现了某种异常。
4字节的常数字
1.irmovl中的立即数数据
2.mmovl,mrmovl中存储器m地址指示符的偏移量
3.绝对地址:分支指令jXX的目的地址
4.绝对地址:调用指令call的目的地址
注意:字节编码和指令序列是相对应的
4.1.4Y86异常
1 AOK 正常操作
2 HLT 处理器执行halt指令
3 ADR 遇到非法地址
4 INS 遇到非法指令
当遇到这些异常的时候,我们就简单地让处理器停止执行指令。在更完整的设计中,处理器通常会调用一个异常处理程序,这个过程被指定用来处理遇到的某种类型的异常。
4.2逻辑设计和硬件控制语言HCL
电子电路中,用1.0V左右的高电压表示逻辑1,用0.0V左右的低电压表示逻辑0.
4.2.1逻辑门
AND &&
OR ||
NOT !
4.2.2组合电路和HCL布尔表达式
字级相等测试电路:一些位级信号代表一个整数或一些控制模式。执行字级计算的组合电路根据输入字的各个位,用逻辑门来计算输出字的各个位。
算数/逻辑单元(ALU)是很重要的组合电路,有三个输入,标号为A、B的两个数据输入和一个控制输入,根据控制输入的设置,电路会对数据输入执行不同的算数或逻辑操作。
4.2.3字级的组合电路和HCL整数表达式
多路复用函数具体格式:
[
select_1 : expr_1
select_2 : expr_2
……
select_k : expr_k
]从逻辑上讲,这些选择表达式是顺序求值的且不同选择表达式之间允许不互斥。
4.2.4集合关系
通用格式:
iexpr in {iexpr1,iexpr2,...,iexprk}(整数表达式)
4.3.1将处理组织成阶段
取指 译码 执行 访存 写回 更新PC
1.取指阶段:取指阶段包括指令存储器硬件单元。以PC作为第一个字节(字节0)的地址,这个单元一次从存储器读出6个字节,第一个字节被解释称指令字节,分为两个4位数。
2.译码和写回阶段:寄存器文件有四个端口,支持同时进行两个读(端口A、B)和两个写(E、M),每个端口都有一个地址连接和一个数据连接。
3.执行阶段:执行阶段包括算术/逻辑单元(ALU)第一步每条指令的ALU计算,执行阶段还包括条件码寄存器。
4.访存阶段:访存阶段的任务是读或者写程序数据,两个控制块产生存储器地址和存储器输入数据的值,另外两个块产生控制信号表明应该执行读操作还是写操作。
5.更新PC阶段:SEQ中最后一个阶段会产生程序计数器的新值,依据指令的类型和是否要选择分支,新的PC可能是valC、valM、valP。
第6章 存储器层次结构
6.1.1随机访问存储器(RAM)
(1)静态RAM:用来作为高速缓存存储器,每个位存储在一个双稳态的存储器单元里。双稳态:电路可以无限期的保持在两个不同的电压配置或者状态之一。
(2)动态RAM:用来作为主存以及图形系统的帧缓冲区。将每个位存储为对一个电容的充电,当电容的电压被扰乱之后,他就永远都不会再恢复了。暴露在光线下会导致电容电压改变。
(3)传统的DRAM:DRAM芯片中的单元(位)被分成了d个超单元,每个超单元都由w个DRAM单元组成, 一个d*w的DRAM共存储dw位信息。超单元被组织成一个r行c列的长方形阵列,rc=d。每个超单元的地址用(i,j)来表示(从零开始)。
(4)存储器模块
双列直插存储器模块(DIMM):168个引脚,以64位为块传入/传出数据到存储控制器。
单列直插存储器模块(SIMM):72个引脚,以32位为块传入/传出数据到存储控制器。
(5)增强的DRAM
快页模式DRAM、扩展数据输出DRAM、同步DRAM、双倍数据速率同步DRAM、RambusDRAM、视频DRAM
(6)非易失性存储器
如果断电,DRAM和SRAM都会丢失信息。
PROM:只能被编程一次。PROM每个存储单元有一种熔丝,只能用高电流熔断一次。
可擦写可编程ROM(EPROM):紫外线光照射过窗口,EPROM就被清除为0,被擦除和重编程的次数为1000次。
电子可擦除ROM(EEPROM):不需要一个物理上独立的编程设备,因此可以直接在印制电路卡上编程,能够编程的次数为10^5。
闪存:基于EEPROM,为大量的电子设备提供快速而持久的非易失性存储。
6.1.2磁盘存储
(1)磁盘构造:磁盘由盘片构成,旋转速率大约为5400-15000每分钟。磁盘的每个表面是一组称为磁道的同心圆组成,每个磁道被划分为一组扇区,扇区之间由一些间隙隔开,间隙存储用来标识扇区的格式化位。
(2)磁盘容量由以下技术因素决定:
记录密度(位/英寸):磁道一英寸的段中可以放入的位数。
磁道密度(道/英寸):从盘片中心出发半径上一英寸的段内可以有的磁道数
面密度(位/平方英寸):记录密度与磁道密度的乘积。
(3)磁盘操作:磁盘用读/写头来读写存储在磁性表面的位,而读写头连接到一个传动臂 一端,通过移动转动臂将读写头定位在磁道上的机械运动称为寻道。磁盘以扇区大小的块来读写数据,对扇区的访问时间有三个主要的组成部分:
寻道时间:转动臂将读/写头定位到包含目标扇区的磁道上所需时间。
旋转时间:驱动器等待目标扇区的第一个位旋转到读/写头下的时间。
传送时间:读写并传送该扇区内容的时间。
6.1.3固态硬盘
固态硬盘是一种基于闪存的存储技术。一个硬盘包由一个或者多个闪存芯片和内存翻译层组成,闪存芯片替代旋转磁盘中的机械驱动器,而闪存翻译层将对逻辑块的请求翻译成对底层物理设备的访问
6.1.4存储技术趋势
1.不同的存储技术有不同的价格和性能折中。
2.不同存储技术的价格和性能属性以截然不同的速率变化着
3.DRAM和磁盘的性能滞后于CPU的性能。
6.2局部性
局部性原理:一个编写良好的计算机程序倾向于引用邻近于其他最近引用过的数据项,或者最近引用过的数据项本身。有良好局部性的程序比局部性差的程序运行的更快,在硬件层引入高速缓存存储器就体现了局部性原理。
6.3存储器层次结构
(1)缓存命中:当程序需要第k+1层的某个数据对象d时,首先在当前存储的第k层的一个块中查找d,如果d刚好在第k层中,则称为缓存命中。
(2)缓存不命中:如果k层中没有缓存数据d,则称为缓存不命中,此时要从k+1层取出包含d的块,可能会覆盖(替换/驱逐)现在的一个块(牺牲块)。
(3)缓存不命中的种类
强制性不命中/冷不命中:第k层缓存是空的(冷缓存),只是短暂的状态,不会在反复访问存储器使得缓存暖身之后的稳定状态出现。
冲突不命中:第k+1层的第i块,必须放置在第k层的块(i mod 4)中,这种限制性的放置策略引起冲突不命中。
6.4高速缓存存储器
6.4.1通用的高速缓存存储器结构
高速缓存被组织成一个有S=2^s个高速缓存组的数组,每个组包含E个高速缓存行,每个行是由一个B=2^b字节的数据块、一位有效位以及t=m-(b+s)个标记位组成,唯一标识存储在这个高速缓存行中的块。
高速缓存的结构用元组(S,E,B,m)来描述,高速缓存的大小C = S * E * B。
6.4.2直接映射的高速缓存
每组只有一行(E=1)的高速缓存称为直接映射高速缓存。
(1)直接映射高速缓存中的组选择:高速缓存从要抽取的字的地址中抽取出S个组索引位,这些位被解释成一个对应于一个组号的无符号整数。
(2)直接映射高速缓存中的行匹配:当且仅当设置了有效位,而且高速缓存行标记与w的地址中的行标记相匹配时,这一行中包含w的一个拷贝。
(3)直接映射高速缓存中的字抽取:块偏移位提供了所需要的字的第一个字节的偏移。
(4)直接映射高速缓存中不命中时的行替换:需要从存储器层次结构中的下一层取出被请求的块,将新的块存储在组索引位指示的组中的一个高速缓存行中。
6.4.3组相连高速缓存
组相连高速缓存中的组选择:与直接映射高速缓存中的组选择一样,组索引位标识组。
组相连高速缓存中的行匹配和字选择:把每个组看做一个小的相关联存储器,是一个(key,value)对的数组,以key为输入,返回对应数组中的value值。高速缓存必须搜索组中的每一行,寻找有效的行其标记与地址中的相匹配。
组相连高速缓存中不命中时的行替换:最简单的替换策略是随机选择要替换的行,其他复杂的策略则使用了局部性原理,例如最不常使用、最近最少使用,等。
6.4.7高速缓存参数的性能影响
影响性能的因素
高速缓存大小的影响:较大的高速缓存可能会提高命中率,但使大存储器运行的更快是更难一些的。
块大小的影响:较大的块能利用程序中可能存在的空间局部性,帮助提高命中率;但块越大意味着高速缓存行较少,损害时间局部性。
相联度的影响:相联度较大(E值较大)优点是降低了高速缓存由于冲突不命中出现抖动的可能性,但成本较高。
写策略的影响:直写高速缓存易实现,而且能使用独立于高速缓存的写缓冲区,用来更新存储器,不命中开销小。
1.《深入理解计算机系统》
自己的收获
在一定基础上,掌握了实验楼的使用,linux系统的操作,对vim编辑器也有一定的了解,针对验证性实验均具有一定的可操作性。
自己的不足
书本上的知识没有做到全部搞懂,只是一知半解的一带而过,基础不是很好,欠的东西也越来越多,不能真正学到深入理解计算机系统的精华。
课程建议
实验楼指导可以针对较弱同学给予更详细的指导步骤,可以多开展实践性项目,在制作过程中了解系统原理。