20145223 杨梦云《信息安全系统设计基础》第八周期中总结
书上内容以及前七周博客内容知识要点
LINUX常用命令总结
格式为:command [options] [arguments] //中括号代表是可选的,即有些命令不需要选项也不需要参数
一、重要快捷键
(1)[Tab]:使用Tab键来进行命令补全,(输入某个命令开头的一部分然后按下Tab键就可以得到提示或者帮助完成),除此之外还有补全目录,补全命令参数
(2)常用快捷键:
Ctrl+d 键盘输入结束或退出终端
Ctrl+s 暂定当前程序,暂停后按下任意键恢复运行
Ctrl+z 将当前程序放到后台运行,恢复到前台为命令fg
Ctrl+a 将光标移至输入行头,相当于Home键
Ctrl+e 将光标移至输入行末,相当于End键
Ctrl+k 删除从光标所在位置到行末
Alt+Backspace 向前删除一个单词
Shift+PgUp 将终端显示向上滚动
Shift+PgDn 将终端显示向下滚动
(3)键盘上的方向上下键:恢复你之前输入过的命令
二、需要掌握的命令
(1)man命令——man是manul的缩写,我们可以通过man man
来查看man的帮助:
常用来搜索,结合管道使用:man -k k1 | grep k2 |grep 2(搜索同时含有k1和k2,且属于系统调用。
最后的数字意味着帮助手册中的区段,man手册共有8个区段,最常用的是123,含义如下:
1.linux
2.系统调用
3.C语言
man printf:是普通的Linux命令
man 1 printf:是系统调用,操作系统的提供的服务接口
man 3 printf:是库函数, C语言中的函数
man -k sort:排序定位
man -k file |grep read |grep 2
grep -nr read only /usr/include:如何读文件
(2)cheat命令——用法大概就是想知道什么就查cheat XXX
是在GNU通用公共许可证下,为Linux命令行用户发行的交互式备忘单应用程序。它提供显示Linux命令使用案例,包括该命令所有的选项和简短但尚可理解的功能
(3)find命令————参考博客Linux find用法示例
常用find用法:
-name filename #查找名为filename的文件
-mtime -n +n #按文件更改时间来查找文件,-n指n天以内,+n指n天以前
-atime -n +n #按文件访问时间来查GIN: 0px">
-ctime -n +n #按文件创建时间来查找文件,-n指n天以内,+n指n天以前
-newer f1 !f2 #查更改时间比f1新但比f2旧的文件
-type b/d/c/p/l/f #查是块设备、目录、字符设备、管道、符号链接、普通文件
-size n[c] #查长度为n块[或n字节]的文件
-size n[c] #查长度为n块[或n字节]的文件
-depth #使查找在进入子目录前先行查找完本目录
(4)locate命令
·locate指定用在搜寻符合条件的档案,它会去储存档案与目录名称的数据库内,寻找合乎范本样式条件的档案或目录录,可以使用特殊字元(如”*”或”?”等)来指定范本样式,如指定范本为kcpaner, locate会找出所有起始字串为kcpa且结尾为ner的档案或目录,如名称为kcpartner若目录录名称为kcpa_ner则会列出该目录下包括 子目录在内的所有档案。
·locate指令和find找寻档案的功能类似,但查询速度会较快。
·locate 有一个十分有用的选项 -r,它可以让你在搜索文件时使用正则表达式。
用法举例:
·~$ locate /etc/sh
---查找etc目录下所有以sh开头的文件
·$ locate -n 5 /soft/android
--- 查看soft目录下以android开头的文件,限定只显示5个,使用 -n
(5)grep命令(功能:可以对文件全文检索)————参考博客Linux grep用法示例
(6)whereis命令——whereis,which告诉你使用的命令工具装在什么地方,比如用whereis firefox
、which firefox
这两个命令查找firefox
所在的目录
(7)apt-cache命令具体用法:可以在使用apt-get install
安装一个程序时先找找软件源的库里有没有这个程序,比如这周我们所需要安装的ddd
调试工具
(8)添加、删除用户
sudo adduser XXX(用户名):添加
sudo deluser XXX --remove-home:删除
(9)Linux 目录结构
因为我们的环境的原因,每次新启动实验会清除系统恢复初始状态,所以需要手动更新软件包索引,以便我们安装时能找到相应软件包的源sudo apt-get update
sudo apt-get install tree:
进入上一级目录:$ cd ..
进入你的“home”目录:$ cd ~
·或者 cd /home/
使用 pwd 获取当前路径:$ pwd
新建目录:touch XXX
新建文件夹:mkdir XXX
删除:rm XXX
三、vi, gcc, gdb,make的使用
(1)三种常用模式的切换
·vim启动进入普通模式,处于插入模式或命令行模式时只需要按Esc或者Ctrl+[(这在vim课程环境中不管用)即可进入普通模式。
·普通模式中按i(插入)或a(附加)键都可以进入插入模式,普通模式中按:进入命令行模式。
·命令行模式中输入wq回车后保存并退出vim。
(3)GCC基本操作
预处理: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
(2) GDB :查询用法:在 gdb 命令行界面,使用 (gdb) help command
可以查看命令的用法。
1.gdb programm(启动GDB)
2.b 设断点(要会设4种断点:行断点、函数断点、条件断点、临时断点)
3.run 开始运行程序
4.bt 打印函数调用堆栈
5.p 查看变量值
6.c 从当前断点继续运行到下一个断点
7.n 单步运行
8.s 单步运行
9.quit 退出GDB
(4)Makefile的使用
首先$ vim Makefile
test: prog.o code.o
gcc prog.o code.o -o test
prog.o: prog.c code.h
gcc -c prog.c -o prog.o
code.o: code.c code.h
gcc -c code.c -o code.o
clean:
rm -f *.o test
第一章内容总结
1.信息=位+上下文
2.系统的硬件组成:总线+I/O设备+主存
3.三个基本抽象:
(1)文件:是对I/O设备的抽象
(2)虚拟存储器:是对主存和磁盘的抽象
(3)进程:是对处理器,主存和I/O设备的抽象
4.存储器层次结构的主要思想是一层上的存储器作为低一层存储器的高速缓存
5.操作系统两个基本功能:
1.防止硬件被失控的应用程序滥用;
2.向应用程序提供简单一致的机制来控制复杂的低级硬件设备
第二章内容总结
1.三种数字:无符号数(表示大于或等于零的数)、有符号数(2进制补码)、浮点数——当计算结果太大超出了计算机的表示范围时,就会产生溢出(overflow)
2.进制转换,十六进制(0x或0X开头)、十进制、二进制之间的相互转换——注意拿二进制作中间结果就好转了
3.gcc -m32 可以在64位机上(比如实验楼的环境)生成32位的代码
4.字节顺序是网络编程的基础,小端法:“高对高、低对低”, 大端法与之相反。
5.能区分逻辑运算(结果是1或0)和位运算(结果是位向量),所有逻辑运算都可以用与、或、非表达(最大式、最小式),而与或非可以用“与非”或“或非”表达,所以,只要一个与非门,就可以完成所有的逻辑运算。
与——&&
或——||
非——!
按位与——&
按位或——|
按位异或——^
按位取反——~
逻辑右移(算数右移)——>> +右移位
逻辑左移(算数左移)——<< +左移位
6.掩码是位运算的重要应用,对特定位可以置一,可以清零。
7.要用C99中的“long long”类型,编译是要用 gcc -std=c99
8.0扩展和符号扩展
零扩展:将一个无符号数转换为一个更大的数据类型,在表示的开头添加“0”
符号扩展:将一个补码数字转换为一个更大的数据类型
9.IEE浮点标准: V=(-1)^s X 2^E X M
来表示一个数
符号:s决定这个数是正数还是负数(0的符号位特殊处理)
尾数:M是一个二进制小数,范围为1~2-ε或者0~1-ε(ε=1/2的n次幂)
阶码:E对浮点数加权,这个权重是2的E次幂(可能为负)
10.整数与浮点数转换规则
int转换为float——数字不会溢出但可能会舍入
int或float转换成double——double有更大的范围和精度所以可保留精确的数值
double转为float——可能溢出也可能舍入
float或double转为int——值会向零舍入且可能溢出
整数不确定值——浮点数转换为整数但是不能为该浮点数找到一个合理的整数近似值
第三章内容总结
Intel处理器(X86) 寻址方式经历三代:
1.DOS时代的平坦模式,不区分用户空间和内核空间,很不安全
2.8086的分段模式
3.IA32的带保护模式的平坦模式
程序编码:
在执行命令gcc时所使用的就是GCC C编译器,这是Linux上默认的编译器,实际上gcc命令调用了一系列程序,将源代码转换为可执行代码
机器级编程有两种重要的抽象
1.机器级格式的格式和行为,定义为指令集体系结构——ISA,它定义了处理器状态、指令的格式以及每条指令对状态的影响
2.机器级程序使用的存储器地址是虚拟地址,存储系统的实际实现是将多个硬件存储器和操作系统软件组合起来
gcc -S xxx.c -o xxx.s 获得汇编代码,也可以用objdump -d xxx 反汇编; 注意函数前两条和后两条汇编代码,所有函数都有,建立函数调用栈帧,应该理解、熟记
注意:
1.64位机器上想要得到32代码:gcc -m32 -S xxx.c
2.MAC OS中没有objdump, 有个基本等价的命令otool
3.Ubuntu中 gcc -S code.c (不带-O1) 产生的代码更接近教材中代码(删除"."开头的语句)
二进制文件可以用od 命令查看,也可以用gdb的x命令查看
有些输出内容过多,我们可以使用 more或less命令结合管道查看,也可以使用输出重定向来查看
od code.o | more
od code.o > code.txt
不同数据的汇编代码后缀
C声明 | Intel数据类型 | 汇编代码后缀 | 大小(字节) |
---|---|---|---|
char | 字节 | b | 1 |
short | 字 | w | 2 |
int | 双字 | l | 4 |
long int | 双字 | l | 4 |
long long int | — | — | 4 |
lchar * | 双字 | l | 4 |
float | 单精度 | s | 4 |
double | 双精度 | l | 8 |
long double | 扩展精度 | t | 10/12 |
esi edi可以用来操纵数组,esp ebp用来操纵栈帧。
**操作数的三种类型:立即数、寄存器、存储器;有效地址的计算方式: Imm(Eb,Ei,s) = Imm(立即数偏移) + R[Eb](基址寄存器) + R[Ei](变址寄存器)*s(比例因子)
MOV指令
MOV指令将原操作数的值复制到目的操作数中,传送指令的两个操作数不能都指向存储器位置,即不能从内存地址直接MOV到另一个内存地址,要用寄存器中转一下。**
MOV相当于C语言的赋值”=“,注意ATT格式中的方向,
MOVS和MOVZ指令类都是将一个较小的源数据复制到一个较大的数据位置,高位用**符号扩展(MOVS)**或**零扩展(MOVZ)**进行填充
push,pop指令
栈是一个数据结构,可以添加或者删除值,原则是先进后出,push操作把数据压入栈中,pop操纵删除数据。
注意栈顶元素的地址是所有栈中元素地址中最低的
算术和逻辑操作
leal S,D——加载有效地址
INC D——加一
DEC D——减一
NEG D——取负
NOT D——取补
ADD S,D——加
SUB S,D——减
IMUL S,D——乘
XOR S,D——异或
OR S,D——或
AND S,D——与
SAL k,D——左移
SHL k,D——左移
SAR k,D——算术右移
SHR k,D——逻辑右移
注意移位操作移位量可以是立即数或%cl中的数
算术和逻辑操作目的操作数类型
1.leal:目的操作数必须是一个寄存器
2.一元操作:操作数可以是一个寄存器,也可以是一个存储器位置
3.二元操作:第一个操作数可以是立即数、寄存器或者是存储器位置,第二个操作数可以是寄存器或存储器位置,两个操作数不能同时是存储器位置
4.位移操作:位移量可以是一个立即数,目的操作数可以是一个寄存器或是一个存储器位置
条件码
CF:进位标志
ZF:零标志
SF:符号标志
OF:溢出标志
leal指令不改变任何条件码,因为它是用来进行地址计算的,除此之外上面列出的算术和逻辑运算指令都会设置条件码
有两类指令只设置条件码而不改变其他寄存器:
CMP S2,S1:比较S1,S2来设置条件码
TEST S2,S1:与AND指令一样,但不改变目的寄存器的值
SET指令:目的操作数是8个单字节寄存器元素之一,或是存储一个字节的存储器位置,将这个字节设置为0或者1, SET指令根据t=a-b的结果设置条件码
跳转语句
jmp:无条件跳转(goto)
p128所示的其他跳转命令都是有条件的,这些指令的名字和跳转条件与SET指令是匹配的(实现if,switch,while,for)。
条件分支(if/switch)
if—els形式e:
t=test-expr;
if(!t)
goto false;
then-statement
goto done
false:
else-atatemrnt
done:
循环语句(while, for)
do-while循环:
loop:
body-statement
t = test-sxpr;
if(t)
goto loop;
while循环:
t = test-sxpr;
if(!t)
goto done;
loop:
body-statement
t = test-sxpr;
if(t)
goto loop;
done
for循环:
init-expr;
while(test-expr){
body-statement;
update-expr;
}
IA32利用栈来支持过程调用(包括将数据和控制),为单个过程分配的那部分栈称为栈帧,最顶端的栈帧用两个指针界定,寄存器%ebp为帧指针,寄存器%esp为栈指针(栈指针%esp指向栈顶元素)。当程序执行时,栈指针可以移动,大多信息的访问都是相对于帧指针来说的。
转移控制(call/ret):函数返回值存在%eax中
call指令的结果是将返回地址入栈,斌跳转到被调用过程的起始处,返回地址是程序中紧跟call后面那条指令的地址
ret指令从栈中弹出地址,并跳转到这个位置,使用这条指令栈指针要指向前面call指令存储返回地址的位置。
第四章内容总结
处理器体系结构
ISA——在编译器编写者和处理器设计者之间提供了一个抽象。
·计算机中的指令被编码为由一个或多个字节序列组成的二进制格式,一个处理器支持的指令和指令的字节级编码称为它的指令集体系结构(ISA)
·ISA模型看上去是**顺序**指令执行,实际上为了提高处理器的性能,并且保持处理器能达到同顺序执行相同的效果,人们会采用一些特殊的机制(比如web浏览器或平衡二叉树和哈希表这样的信息检索数据结构中使用缓存)
Y86指令体系结构
程序员可见状态:Y86程序中的每条指令都会读取或者修改处理器状态中的某些部分。
Y86的处理器状态类似于IA32,有八个程序寄存器:%eax.%ecx.%edx.%ebx.%esi.%edi.%esp和%ebp,处理器的每个程序寄存器存储一个字
寄存器%esp被入栈、出栈、调用和返回指令作为栈指针。在其他情况下,寄存器没有固定的含义或固定值。
有三个一位的条件码:ZF,SF,OF,它们保存最近的算术或洛基指令所造成英雄的有关信息。
程序计数器PC存放当前正在执行指令的地址。
存储器:概念上来说是一个保存程序和数组的很大的字节数组,Y86程序用虚拟地址来引用存储器位置,硬件和操作系统软件联合起来将虚拟地址翻译成实际或物理地址。
状态码Stat:程序状态的最后一个部分是状态码Stat,它表明程序执行的总体状态;它会指示是正常运行还是出现了某种异常。
Y86指令
**movl指令**: IA32的movl指令分为四种:irmovl,rrmovl,mrmovl,rmmovl 前面的两个字母是在显式的指定源操作数和目的操作数的格式,第一位是源操作数,第二位是目的操作数。
源操作数 可以是:i-立即数 r-寄存器 m-存储器 目的操作数 可以是:r-寄存器 m-存储器
**寻址方式不支持第二变址寄存器和任何寄存器值的伸缩,两个操作数不能都是来自存储器,也不允许将立即数传送到存储器**
**四个整数操作指令** addl 加 subl 减 andl 与 xorl 异或 并且它们只对寄存器数据进行操作(IA32允许对存储器数据进行这些操作)。
这些指令会设置三个条件码:ZF-零 SF-符号 OF-溢出
**七个跳转指令**根据分支指令的类型和条件码的设置来选择分支,分支条件和IA32一样。
**六个条件传送指令** cmovle cmovl cmove cmovne cmovge cmovg 这些指令的格式与寄存器-寄存器传送指令rrmovl一样,只有当条件码满足所需要的约束时,才会更新目的寄存器的值。
**call** call指令将返回地址入栈,然后跳到目的地址,**ret** 从这样的过程调用中返回。
**pushl和popl** 实现入栈和出栈
**halt指令** 停止指令的执行,执行此指令会导致处理器停止,并将状态码设置为HLT。
指令编码:每条指令的第一个字节表示指令类型,字节高四位是代码部分,低四位是功能部分。
Y86异常
| 值 |名字| 含义|
| -------- | :----------------:|:----------------:|
| 1 | AOK|正常操作(除此之外的任何状态都会使得处理器停止执行指令)
|2|HLT|处理器执行halt指令|
|3|ADR|遇到非法地址|
|4|INS|遇到非法指令
pushl会把栈指针减4,并将一个寄存器值写入存储器中
逻辑设计和硬件控制语言HCL
1.逻辑门:只对单个位的数进行操作而不是整个字
AND——&&
OR——||
NOT——!
2.将很多的逻辑门组合成一个网,就能构建计算块,称为组合电路。
两个或者多个逻辑门的输出不能连接在一起;
这个网必须无环
3.多路复用电路(MUX):根据输入控制信号的值,从一组不同的数据信号中选出一个。
4.HCL中所有字级的信号都声明为int,不指定字的大小。
5.存储器和时钟
两类存储器设备:
**时钟寄存器(寄存器):**存储单个位或者字。
**时钟信号控制寄存器(存储器):**加载输入值 随机访问存储器存储多个字,用地址来选择该读入或者该写哪个字。
Y86的顺序实现
1.将处理组织成阶段:
**取指(fetch):**
取值阶段从存储器读取指令字节,放到指令存储器(CPU中)中,地址为程序计数器(PC)的值。
它按顺序的方式计算当前指令的下一条指令的地址(即PC的值加上已取出指令的长度)
**译码(decode):**
ALU从寄存器文件(通用寄存器的集合)读入最多两个操作数。(即一次最多读取两个寄存器中的内容)
**执行(execute):**
在执行阶段会根据指令的类型,将算数/逻辑单元(ALU)用于不同的目的。对其他指令,它会作为一个加法器来计算增加或减少栈指针,或者计算有效地址,或者只是简单地加0,将一个输入传递到输出。
条件码寄存器(CC)有三个条件位。ALU负责计算条件码新值。当执行一条跳转指令时,会根据条件码和跳转类型来计算分支信号cnd。
**访存(memory):**
访存阶段,数据存储器(CPU中)读出或写入一个存储器字。指令和数据存储器访问的是相同的存储器位置,但是用于不同的目的。
**写回(write back):**
写回阶段最多可以写两个结果到寄存器文件。寄存器文件有两个写端口。端口E用来写ALU计算出来的值,而端口M用来写从数据存储器中读出的值。
更新PC(PC update):
根据指令代码和分支标志,从前几步得出的信号值中,选出下一个PC的值。
关于一些指令的执行阶段的说明
1.OPI,rrmovl,irmovl指令在访存阶段是不做操作的;此外,irmovl因为是长指令格式,所以PC要加6;
2.rmmovl,mrmovl在访存阶段要将寄存器值valA吸入存储器或者从存储器中读出valM
3.call指令和ret指令与popl和pushl类似;对于call指令来说,要将valP(紧跟call之后那条指令的地址)压入栈中
SEQ的时序(逐步深化)
1.要控制处理器中活动的时序,只需要寄存器和存储器的时钟控制
2.除了指令存储器只用来读指令故而可以看作组合逻辑之外,剩余的程序计数器、条件码寄存器、数据存储器和寄存器文件需要通过一个时钟信号来控制(控制时序)
3.在每个时钟周期内,程序计数器都会装载新的指令地址;只有执行整数运算指令的时候,才会装载条件码寄存器。只有执行rmmovl,pushl,call时,才会写数据存储器。
Y86指令集的本质遵循这样一项组织原则:处理器从来不需要为了完成一条指令的执行而去读由该指令更新了的状态
如何理解?也就是说,处理器所“经手”的指令中,如果有某些是可以改变机构状态的;那么一定先改变状态之后再执行指令。这样保证了操作的时序性(防止指令执行起来互相颠倒)
第六章内容总结
存储器层次结构
存储器系统是一个具有不同容量、成本和访问时间的存储设备的层次结构。
高速缓存存储器:作为CPU和主存之间的缓存区域。
1.RAM——随机访问存储器
**静态的SRAM:**
作为高速缓存存储器,CPU片上或片下。
每个位存储在一个双稳态的存储器单元里面,每个单元用一个六晶体管电路来实现。
其属性是可以无限期保持在两个不同的电压配置或者状态之一,其他的任何状态都是不稳定的。
比DRAM用更多的晶体管,**存储快,只要有供电就保持不变密集度低,更贵,功耗更大,对干扰不敏感**。
**动态的DARM:**
作为主存以及图形系统的帧缓冲区。
将每个位存储为对一个电容的充电(这个电容很小)
**对干扰(如光线、噪音等)很敏感,当电容的电压被扰乱之后就永远不会恢复。**
**功耗小,成本低。**
传统的DRAM:
芯片中的单元位被分为d个超单元,每个超单元有w个DRAM单元组成
一个dxw的DRAM总共存储了dw位信息。超单元被组织成一个r行c列的长方形,即rc=d。每个超单元有形如(i, j)的地址,i表示行,j表示列。
每个DRAM芯片被连接到某个称为存储控制器的电路,这个电路可以一次传送w位到每个DRAM芯片或者依次从每个芯片传出w位。电路设计者将DRAM组织成二维而不是线性数组的一个原因是降低芯片上地址引脚的数量。
存储器模块:
DRAM芯片包装在存储器模块中,它是插到主版的扩展槽上的。
增强的DRAM:**每种都是基于DRAM单元**
快页模式-FPM DRAM
扩展数据输出-EDO DRAM
同步-SDRAM
双倍数据速率同步-DDR SDRAM
RDRAM
视频-VRAM
2.ROM——非易失性存储器,即使在关电后,也仍然保存着它们的信息ROM中有的类型既可以读又可以写,但整体上称为只读存储器,ROM是以它们能够被重编程的次数和进行重编程所用机制进行区分的。
**PROM(可编程ROM)**:只能被编程一次。
**可擦可写编程ROM(EPROM):**:被擦除和重写的次数可以达到10^3次
**E2PROM(电子可擦除PROM)**:不需要物理上独立编程设备,直接在印刷电路卡上编程,达到10^5次
**FLASH(基于EEPROM的重要的存储技术)**:基于此的磁盘驱动器称为固态硬盘
3.存储在ROM设备中的程序通常称为固件;当一个计算机系统通电之后,它会运行存储在ROM中的固件
4.RAM在断电后会丢失信息,ROM即使断电也能保存着信息。
5.访问主存
数据流通过总线的共享电子电路在处理器和DRAM之间来回;每次CPU和主存之间的数据传送是通过一系列步骤来完成的,称为总线事务。
读事务(从主存到CPU)
写事务(从CPU到主存)
**总线:**
是一股并行的线,可以携带数据、控制信号和地址(数据总线,地址总线,控制总线)。
6.计算机系统的配置
主要部件是CPU芯片、I/O桥芯片组、组成主存的DRAM存储器模块。这些部件由一对总线连接起来,其中一条总线是系统总线,它连接CPU和I/O桥,另一条总线是存储器总线,它连接I/O桥和主存。
I/O桥将系统总线的电子信号翻译成存储器总线的电子信号。
7.磁盘存储——磁盘是保存大量数据的存储设备;但读取速度慢。
8:磁盘结构
盘片:
磁盘由盘片构成,每个盘片有两个表面,表面上覆盖着磁性记录材料。盘片中央有一个可旋转的主轴,盘片以固定旋转速率旋转。
磁道:
每个表面由一组称为磁道的同心圆组成。
扇区:
磁道被划分为一组扇区,每个扇区包含相等数量的数据位。
间隙:
扇区之间由间隙分隔开,间隙不存储数据,标识扇区的格式化位。
磁盘驱动器:
磁盘由一个或多个叠放的盘片组成,被封装在一个密封的包装里,整个装置称为磁盘驱动器,即磁盘,也称旋转磁盘,区别与基于闪存的固态磁盘SSD。
柱面:
描述多个盘片驱动器的构造,指所有盘片表面上到主轴中心的距离想等的磁道的组合。即所有盘片表面到主轴中心距离相等的磁道的集合
9.磁盘容量——一个磁盘上可以记录的最大位数称为最大容量,即容量
计算磁盘容量的公式:
磁盘容量 = 字节数/扇区 X 平均磁盘数/磁道 X 磁道数/表面 X 表面数/盘片 X 盘片数/磁盘
10.对扇区的访问时间有三个主要部分:
寻道时间:将读写头定位到包含目标扇区的磁道上。Tseek取决于它以前的位置和传动臂在盘面上的移动速度。时间通常为3——9ms。
旋转时间:一旦读写头定位到了期望的磁道,驱动器等待目标扇区的第一个位旋转到读写头下面。平均旋转时间是最大时间(等磁盘旋转一圈)
传送时间:驱动器开始写或者读扇区的内容;时间长短取决于旋转速度和每条磁道的扇区数目。
**平均时延为 Tavg=1/RPM1/(平均扇区数/磁道)60secs/1min**
**最大旋转延迟=1/RPM X 60secs/1min (s)**
平均旋转时间是最大值的一半。
**访问一个磁盘扇区内容的平均时间为平均寻道时间,平均旋转延迟和平均传送时间之和。**
11.逻辑磁盘块——这个很重要,内存可以看成字节数组、磁盘可以看成块数组
磁盘中有一个小的硬件/固件设备,称为磁盘控制器,维护这逻辑块号和实际(物理)磁盘扇区之间的映射关系。
**逻辑块号翻译成的盘面、磁道、扇区的三元组唯一标示对应物理扇区**
12.连接到I/O设备
输入输出设备都是通过I/O总线连接到CPU和主存的。与系统总线和存储器总线不同,它可以设计成与CPU无关的。
I/O总线较慢,但可以容纳种类繁多的第三方I/O设备:
1:通用串行总线(USB)控制器是一个连接到USB总线的设备的中转机构。
2:图形卡(或适配器)包含硬件和软件逻辑,代表CPU在显示器上画像素。
3: 主机总线适配器将一个或多个磁盘连接到I/O总线,使用特别的主机总线接口定义的通信协议,两个常用的磁盘接口SCSI/SATA,SCSI更快更贵,可支持多个磁盘驱动器。其他设备,如网络适配器,插入到主板上空的扩展槽,从而连接到I/O总线。
13.局部性原理:计算机程序倾向于引用邻近于其他最近引用过的数据项的数据或其本身;这种倾向性,被称为局部性原理。包括:时间局部性,空间局部性。有良好局部性的程序比局部性差的程序运行的更快。
**时间局部性:**被引用过一次的存储器位置很可能在不远的将来再被多次引用。
**空间局部性:**如果一个存储器位置被引用了一次,那么很可能在不远的将来引用附近的一个存储器位置。p429“存储器山”
14.数据引用局部性
步长为k的引用模式:一个连续变量中,每隔k个元素进行访问,就被称为步长为k的引用模式。
步长为1的引用模式:就是顺序访问一个向量的每个元素,有时也被称为顺序引用模式,它是程序中 空间局部性常见和重要的来源。一般来说,随着步长增加,空间局部性下降。
15.取指令的局部性
程序指令是存放在存储器中的,CPU必须取出(读出)这些指令。
代码区别于程序数据的是在运行时是不能被修改的。
16.一个程序中局部性的简单原则:
1:重复引用同一个变量的程序有良好的时间局部性
2:对于具有步长为k的引用模式的程序,步长越小,空间局部性越好
3:对于取指令来说,循环有好的时间和空间局部性。循环体越小,循环迭代次数越多,局部性越好。
17.存储层次结构:系统观(1+1>2)(举一反三:对称不对称加密形成的混合加密系统,混合动力汽车...)
中心思想:每层存储设备都是下一层的“缓存”
对照p408的表理解:**越往上:更小、更快、成本更高,反之相反**
18.高速缓存结构(S,E,B,m):高速缓存组、高速缓存行、块
·作用:连接CPU和主存
·每个存储器地址有m位,形成M=2^m个不同地址。这m位被划分成t个标记位、s个组索引位和b个块偏移位。
这样一个机器的高速缓存被组织成S=2^s个高速缓存组的数组;每个数组包含E个高速缓存行;每行由一个B=2^b字节的数据块、一个有效位(指明这个行是否包含有效信息)、t=m-(b+s)个标记位(唯一标识存储在这个高速缓存行中的块)组成
高速缓存的结构可以用元组(S,E,B,m)来描述:
S:这个数组中有S=2^s个高速缓存组
E:每个组包含E个高速缓存行
B:每个行是由一个B=2^b字节的数据块组成的
m:每个存储器地址有m位,形成M=2^m个不同的地址