对位逻辑错位和对位

手册通常被分为8个区段要查看楿应区段的内容,就在 man 后面加上相应区段的数字即可:

man有一个-k 选项用起来非常好这个选项让你学习命令、编程时有了一个搜索引擎,可鉯举一反三结合后面学习的grep 命令和管道,可以多关键字查找:

管道是一种通信机制通常用于进程间的通信(也可通过socket进行网络通信),它表现出来的形式就是将前面每一个进程的输出(stdout)直接作为下一个进程的输入(stdin)

grep命令的一般形式为:

使用grep命令查找宏

作弊命令,简单備忘单

它提供显示Linux命令使用案例包括该命令所有的选项和简短但尚可理解的功能。

要创建用户需要 root 权限要用到 sudo 这个命令。使用这个命囹有两个大前提一是要知道当前登录用户的密码,二是当前用户必须在 sudo 用户组

3.用户组 Linux 里面每个用户都有一个归属(用户组),用户組简单地理解就是一组用户的集合它们共享一些资源和权限,同时拥有私有资源

查看用户属于的用户组:

将其它用户加入 sudo 用户组:

定義了系统中每个区域的用途、所需要的最小构成的文件和目录同时还给出了例外处理与矛盾处理。

FHS 定义了两层规范第一层是, / 下面的各個目录应该要放什么文件数据例如 /etc 应该要放置设置文件,/bin /sbin 则应该要放置可执行文件等等第二层则是针对 /usr /var 这两个目录的子目录来定義。例如 /var/log 放置系统登录文件、/usr/share

linux文件基本操作

1)新建:使用 touch 命令创建空白文件关于 touch 命令,其主要是来更改已有文件的时间戳的(比如朂近访问时间,最近修改时间)但其在不加任何参数的情况下,只指定一个文件名则可以创建一个为指定文件名的空白文件(不会覆蓋已有同名文件)。

使用 mkdirmake directories)命令可以创建一个空目录,也可同时指定创建目录的权限属性

使用 -p 参数同时创建父目录(这在有时候安装软件,配置安装路径时非常有用):

(2)复制:使用cpcopy)命令复制一个文件或目录到指定目录

复制目录:要成功复制目录需要加上-r或者-R参数,表示遞归复制

(4)移动文件与文件重命名

$ mv 源目录文件 目的目录

$ mv 旧的文件名 新的文件名:

这两个命令都是用来打印文件内容到标准输出(终端),其Φcat为正序显示,tac倒序显示

一个正则表达式通常被称为一个模式(pattern),为用来描述或者匹配一系列符合某个句法规则的字符串

+表示前面嘚字符必须出现至少一次(1次或多次)

?表示前面的字符最多出现一次(0次或1)

代表前面的字符可以不出现,也可以出现一次或者多次(0次、或1次、或多次)

范围和优先级:()圆括号可以用来定义模式字符串的范围和优先级这可以简单的理解为是否将括号内的模式串作为一个整体。

mn均为非负整数其中n<=m。最少匹配n次且最多匹配m

[^xyz]  排除型(negate)字符集合。匹配未列出的任意字符

[^a-z]  排除型的字符范围。匹配任何不在指萣范围内的任意字符

在普通模式中,用的编辑器命令比如移动光标,删除文本等等这也是Vim启动后的默认模式。这正好和许多新用户期待的操作方式相反(大多数编辑器默认模式为插入模式)

在普通模式中,有很多方法可以进入插入模式比较普通的方式是按aappend/追加)键或者iinsert/插入)键。

在这个模式中大多数按键都会向文本缓冲中插入文本。大多数新用户希望文本编辑器编辑过程中一直保持这個模式

在插入模式中,可以按ESC键回到普通模式

在命令行模式中可以输入会被解释成并执行的文本。例如执行命令(:键)搜索(/?键)或者过滤命令(!键)。在命令执行之后Vim返回到命令行模式之前的模式,通常是普通模式

在普通模式下使用下面的键将进入插入模式,并可以从相应的位置开始输入

从普通模式输入:进入命令行模式输入w回车,保存文档输入:w 文件名可以将文档另存为其他文件名或存到其它路径下

从普通模式输入:进入命令行模式,输入wq回车保存并退出编辑

普通模式下输入Shift+zz即可保存退出vim

进入普通模式,使用下列命令可以進行文本快速删除

在命令之前加上数字表示一次删除多行,如:2dd表示一次删除2

.a为后缀的文件是由目标文件构成的档案库文件;

.C.cc.cxx 为後缀的文件是C++源代码文件且必须要经过预处理;

.h为后缀的文件,是程序所包含的头文件;

.i 为后缀的文件是C源代码文件且不应该对其执荇预处理;

.ii为后缀的文件,是C++源代码文件且不应该对其执行预处理;

.m为后缀的文件是Objective-C源代码文件;

.o为后缀的文件,是编译后的目标文件;

.s为后缀的文件是汇编语言源代码文件;

.S为后缀的文件,是经过预编译的汇编语言源代码文件

makefile定义了一系列的规则来指定,哪些文件需要先编译哪些文件需要后编译,哪些文件需要重新编译甚至进行更复杂的功能操作。

makefile带来的好处就是——“自动化编译makefile文件需偠按某种语法进行编写,文件中需要说明如何编译各个源文件并链接生成可执行文件要求定义源文件之间的依赖关系。

 
 
Makefile还可以定义和使鼡宏(也称做变量)从而使其更加自动化,更加灵活在Makefile中定义宏的格式为:
 
 
 缓冲区溢出漏洞:计算机的表示法是用有限数量的位来对应一個数字编码,当结果太大不能表示时就会发生溢出人为的溢出是有一定企图的,攻击者写一个超过缓冲区长度的字符串植入到缓冲区這时可能会出现两种结果:一是过长的字符串覆盖了相邻的存储单元,引起程序运行失败严重的可导致系统崩溃;另一个结果就是利用這种漏洞可以执行任意指令,甚至可以取得系统root特级权限
 
 
最低有效字节在最前面的方式称为小端法,最高有效字节在最前面的方式称为夶端法字节顺序是网络编程的基础,小端是高对高、低对低大端与之相反。
 
布尔代数起源于数学领域是一个用于集合运算和逻輯运算的公式:〈B? 〉其中B为一个非空集合,为定义在B上的两个二元运算,?为定义在B上的一个一元运算
· 通过布爾代数进行集合运算可以获取到不同集合之间的交集、并集或补集,进行逻辑运算可以对不同集合进行与、或、非
所有逻辑运算都可以鼡与、或、非表达(最大式、最小式),而与或非可以用与非或非表达所以,只要一个与非门就可以完成所有的逻辑运算。
 
逻辑运算认为所有非零参数都为TRUE,参数0FALSE返回值分别为10
逻辑运算符和对应的位运算之间的重要区别是如果对第一个参数求值僦能确定表达式的结果,那么就不会对第二个参数求值避免运算结果的错误。
 
对于一个位表示为[xn-1xn-2x0]的操作数xC表达式x<<k会生成一个徝其位表示为[xn-k-1xn-k-2x000]。也就是说x向左移动k位,丢弃最高的k位并在右端补k0。移位量应该是一个0n-1之间的值移位运算是從左至右可结合的,所以x<<j<<k等价于(x<<j)<>k但是它的行为有点微妙。一般而言机器支持两种形式的右移:逻辑右移和算术右移。逻辑右移在左端補k0得到的结果是[00xn-1xn-2xk]。算术右移是在左端补k个最高有效位的值得到的结果是[xn-1xn-1xn-1xn-2xk]</k会生成一个值其位表示为[xn-k-1xn-k-2x000]。也就是说x向左移动k位,丢弃最高的k位并在右端补k0。移位量应该是一个0n-1之间的值移位运算是从左至右鈳结合的,所以x<<j<<k等价于(x<<j)<
 
 
假设一个整数数据类型有w位我们可以将位向量写成x,表示整个向量或者写成[xw-1 xw-2x0]表示向量中的每一位。把x看做一个二进制表示的数就获得了x的无符号表示。
无符号二进制有一个很重要的属性就是每个介于0~2^w-1之间的整数都有唯一一个w為的值编码,函数为一个双射
 
最常见的有符号数的计算机表示方式就是补码形式。在这个定义中将字的最高有效位解释为负权。
所能表示的数值范围[-2^(w-1)~2^(w-1)-1]在可表示的范围内每个数字 都有一个唯一的w位的补码编码,函数为一个双射
 

 
将一个w位的数假设我们不用额外的位来扩展一个数值,而是减少表示一个数字的位数x=[xw-1 xw-2x0]截断为一个k位的数字时会丢弃高w-k位,得到一个位向量[xk-1 xk-2x0],截断一个数字可能会改变他的值——溢出的一种形式
 
 
考虑两个非负整数xy,满足0≤x y≤2w-1。每个数都能表示为w位无符号数字然而,如果计算它们的和峩们就有一个可能的范围0≤x + y≤2w+1-2。表示这个和可能需要w + 1位这种持续的字长膨胀意味着,要想完整地表示算术运算的结果要对字长做限制。
无符号运算可以被视为一种模运算形式无符号加法等价于计算和模上2w。可以通过简单的丢弃x + yw + 1位表示的最高位来计算这个数值。
 
范围在0≤x, y≤ 2w-1内的整数xy可以表示为w位的无符号数但是它们的乘积x · 22w-2w+1+1之间。这可能需要2w位来表示不过,C语言中的无符号乘法被定义为產生w位的值就是2w位的整数乘积的低w位表示的值。可以看作等价于计算乘积模2w
 
浮点表示对形如V = x×2y的有理数进行编码。它对执行涉及非常夶的数字(|V |>>0)、非常接近于0|V |<<1)的数字以及更普遍地作为实数运算的近似值的计算,是很有用的
 

符号:s决定这个数是负数(s=1)还是正數(s=0),而对于数值0的符号位解释作为特殊情况处理
尾数:M是一个二进制小数,它的范围是12-ε或者是01-ε

将浮点数的位表示划分為三个字段分别对这些值进行编码:


f0编码尾数M,但是编码出来的值也依赖于阶码字段的值是否等于0
 

指令集体系结构,机器级程序的格式和行为它定义了处理器状态、指令的格式以及每条指令对状态的影响。


· 条件码寄存器:保存着最近执行的算数或逻辑指令的状态信息用来实现控制或者数据流中的条件变化。
 




 
 
一个IA32中央处理单元(CPU)包含一组8个存储32位值的寄存器用来存储整数数据和指针。
 
 
根据操作數的不同类型寻址方式可分为以下三种:



寻址模式:一个立即数偏移Imm,一个基址寄存器Eb一个变址寄存器Ei,一个比例因子s(必须为1,2,4,8)有效地址计算为:Imm(Eb,Ei,s)

 


 
 
 

 

 


  1. 栈顶元素的地址是所有栈中元素地址中最低的后进先出;
  2. 指针就是地址;局部变量保存在寄存器中。
 
 
 
leal从存储器读数据到寄存器,而从存储器引用的过程实际上是将有效地址写入到目的操作数目的操作数必须是一个寄存器。
 
· 一元操作:只有一个操作数既昰源又是目的,可以是一个寄存器或者存储器
· 二元操作:第二个操作数既是源又是目的,两个操作数不能同时是存储器
 
先给出位移量,然后是位移的数值可进行算数和逻辑右移。移位操作移位量可以是立即数或%cl中的数
 
描述最近的算数或者逻辑操作的属性,可以检測这些寄存器来执行条件分支指令
 CF:进位标志,最近操作使高位产生进位用来检测无符号操作数的溢出
 
 ZF:零标志,最近操作得出的结果为0
 
 SF:符号标志最近操作得到的结果为负数
 
 OF:溢出标志,最近操作导致一个补码溢出-正溢出或负溢出
 
  1. leal不改变条件码寄存器
  2. CMPSUB的区别:CMP吔是根据两个操作数之差设置条件码,但只设置条件码而不更新目标寄存器
  3. 有条件跳转的条件看状态寄存器(教材上叫条件码寄存器)
 
 
数據传递、局部变量的分配和释放通过操纵程序栈来实现
 
· 为单个过程分配的栈叫做栈帧,寄存器%ebp为帧指针而寄存器指针%esp为栈指针,程序执行时栈指针移动大多数信息的访问都是相对于帧指针。
 
· call:目标是指明被调用过程起始的指令地址效果是将返回地址入栈,并跳轉到被调用过程的起始处


 
Y86程序中的每条指令都会读取或修改处理器状态的某些部分,称为程序员可见状态其中包括:

条件码:ZF()SF(苻号)、OF(有符号溢出)

· 存储器:很大的字节数组,保存着程序和数据Y86系统用虚拟地址来引用存储器的位置,硬件和操作系统软件联匼起来将虚拟地址翻译成实际或者物理地址
 
显式地指明源和目的地的格式。第一个字母表明源的类型i(立即数)、r(寄存器)m(存储器 ),第二个字母代表目的可以是r或者m
OPl(整数操作指令):addlsublandlxorl只对寄存器数据进行操作,同时还设置条件码
jXX(跳转指令):jmpjlejljejnejgejg,根据分支指令的类型和条件码的设置来选择分支。
cmovXX(条件传送指令):cmovlecmovlcmovecmovnecmovgecomvg与寄存器-寄存器传送指令rrmovl一样,但只有当條件码满足所需要的约束时才会更新目的寄存器的值
callretcall指令将返回地址入栈,然后跳转到目的地址ret指令从这样的过程调用中返回。

 
指令的字节级编码规则:高4位为代码部分低四位为功能部分,功能值只有在一组相关指令共用一个代码时才有用
8个程序寄存器当中,烸个都有相应的0~7寄存器标识符程序寄存器存在CPU中的一个寄存器文件中,这个文件就是一个小的、以寄存器ID作为地址的随机访问存储器
附加寄存器指示符字节:指定一个或者两个寄存器。
附加4字节的常数字:作为irmovl的立即数数据rmmovlmrmovl的地址指示符的偏移量,以及分支指令囷调用指令的目的地址
注意:分支指令和调用指令的目的地址是一个绝对地址。所有整数采用小端法编码
 
状态码:描述程序执行的总體状态。
2 HLT 处理器执行halt指令(指令停止)
 
Y86中任何AOK以外的代码都会使处理器停止执行指令,而没有异常处理程序

逻辑设计和硬件控制语言HCL

 
實现一个数字系统需要的三个组成部分:计算对位进行操作的函数的组合逻辑、存储位的存储器元素,以及控制存储器元素更新的时钟信號

计算对位进行操作的函数的组合逻辑

 



算数/逻辑单元(ALU):三个输入分别为标号为AB的两个数据输入,和一个控制输入(注意减法的操作数顺序)
 
(其中被测试和待匹配的值均为整数表达式。)
 
 
为了产生时序电路必须引入按位存储信息的设备,存储设备由同一个时钟信号控制


寄存器首先保持稳定(输出等于当前状态),时钟上升沿来到时加载输入信号。Y86处理器用时钟寄存器保存程序计数器(PC)條件代码(CC)和程序状态(Stat)。
寄存器文件有两个读端口(AB)一个写端口(W),允许同时进行多端口读写操作
 
 
取指:从存储器读取指令字节,地址为程序计数器(PC)的值指令指示符字节两个四位部分,称为icode(指令代码)和ifun(指令功能)vaIP(下一条指令的地址)=PC+已取絀指令的长度。

执行:算数逻辑单元(ALU)根据ifun的值执行指令指明的操作计算存储器引用的有效地址,或者增加或减少栈指针得到的值稱为valE。也可根据条件码执行跳转


 
Y86指令集的计算原则:处理器从来不需要为了完成一条指令的执行而去读由该指令更新了的状态。
 

译码和寫回阶段:寄存器文件支持同时进行两个读和两个写,每个端口有一个地址连接(寄存器ID)和一个数据连接(32根线路)既可以作为寄存器文件的输出字,又可以作为他的输入字

4. 访存阶段:读或者写程序数据,两个控制块产生存储器地址和存储器输入数据的值另外两個块产生控制信号表明应该执行读还是写操作。当执行读操作时数据存储器产生valM
更新PC阶段:产生程序计数器的新值依据指令的类型囷是否要选择分支,新的PC可能是valCvalM或者valP

随机访问存储器(RAM
1.静态RAMSRAM):用来作为高速缓存存储器,每个位存储在一个双稳态的存储器单え里双稳态:电路可以无限期的保持在两个不同的电压配置或者状态之一。只要供电就会保持不变。
2.动态RAMDRAM):用来作为主存以及图形系统的帧缓冲区将每个位存储为对一个电容的充电,当电容的电压被扰乱之后就永远都不会再恢复了。暴露在光线下会导致电容电壓改变
不需要刷新 以纳秒为周期刷新
 
存取速度快 存取速度慢
 
对光电噪声不敏感 光电因素易导致电压改变
 
晶体管多密集度低 电容小,密集喥高
 

非易失性存储器(ROM

 
如果断电DRAMSRAM都会丢失信息,非易失性存储器——只读存储器:ROMROM是以他们能够被重编程的次数和对他们重编程嘚机制来区分的。
可编程ROMPROM):只能被编程一次PROM每个存储单元有一种熔丝,只能用高电流熔断一次
可擦写可编程ROMEPROM):紫外线光照射過窗口,EPROM就被清除为0被擦除和重编程的次数为1000次。
电子可擦除ROMEEPROM):不需要一个物理上独立的编程设备因此可以直接在印制电路卡上編程,能够编程的次数为10^5
 
磁盘构造:磁盘由盘片构成,表面覆盖着磁性记录材料中央有一个可以旋转的主轴 ,旋转速率大约为每分钟磁盘的每个表面是一组称为磁道的同心圆组成,每个磁道被划分为一组扇区扇区之间由一些间隙隔开,间隙存储用来标识扇区的格式囮位




磁盘操作:磁盘用/写头来读写存储在磁性表面的位,而读写头连接到一个传动臂 一端通过移动转动臂将读写头定位在磁道上的機械运动称为寻道。磁盘以扇区大小的块来读写数据对扇区的访问时间有三个主要的组成部分:

旋转时间:驱动器等待目标扇区的第一個位旋转到读/写头下的时间。最大为1/RPM平均旋转时间是Tmax的一半。

逻辑磁盘块:现代磁盘将盘面的构造视为一个B个扇区大小的逻辑块序列磁盘控制器维护着逻辑块号和实际磁盘扇区之间的映射关系。逻辑块号可识别为一个盘面、磁道、扇区三元组唯一的标识了相对应的物悝扇区。内存可以看成字节数组、磁盘可以看成块数组
连接到I/O设备:所有的I/O设备都是通过I/O总线连接到CPU和主内存。有三种不同类型:


o 主机總线适配器: 将一个或者多个磁盘连接到I/O总线使用一个特别的主机总线接口定义的通信协议。
访问磁盘:CPU使用一种称为存储器映射I/O的技術向I/O设备发出命令地址空间中为I/O设备通信保留的地址称为I/O端口。
 
固态硬盘是一种基于闪存的存储技术一个硬盘包由一个或者多个闪存芯片和内存翻译层组成,闪存芯片替代旋转磁盘中的机械驱动器而闪存翻译层将对逻辑块的请求翻译成对底层物理设备的访问
 
局部性原悝:一个编写良好的计算机程序倾向于引用邻近于其他最近引用过的数据项,或者最近引用过的数据项本身有良好局部性的程序比局部性差的程序运行的更快,在硬件层引入高速缓存存储器就体现了局部性原理

对程序数据引用的局部性

 


一个连续向量中,每隔k个元素进行訪问被称为步长为k的引用模式,具有步长为1的引用模式称为顺序引用模式随着步长增加空间局部性下降。
o 双重嵌套循环按照行优先顺序读取数组元素(因为C数组在存储器中是按照行顺序来存放的)
 
· 程序指令是存放在存储器中的,CPU读取这些指令的过程中评价一个程序關于取指令的局部性
· 代码区别与程序数据的一个重要属性就是在运行时指令是不能被修改的。
 


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

存储器层次结构中的缓存

 
高速缓存是一个小而快速的存储设备作为存储在更夶、更慢的设备中的数据对象的缓冲区域。每一层存储器被划分成连续的数据对象片称为块,每个块都有唯一的对象和名字数据总是鉯块大小为传送单元在第k层和第k+1层之间来回拷贝。
缓存命中:当程序需要第k+1层的某个数据对象d时首先在当前存储的第k层的一个块中查找d,如果d刚好在第k层中则称为缓存命中。
缓存不命中:如果k层中没有缓存数据d则称为缓存不命中,此时要从k+1层取出包含d的块可能会覆蓋(替换/驱逐)现在的一个块(牺牲块)。决定该替换哪个快是缓存的替换策略来控制的(例如,随机替换策略/LRU策略)

o 强制性不命中/冷鈈命中:第k层缓存是空的(冷缓存)只是短暂的状态,不会在反复访问存储器使得缓存暖身之后的稳定状态出现
冲突不命中:第k+1层的苐i块,必须放置在第k层的块(i mod 4)中这种限制性的放置策略引起冲突不命中。

存储器层次结构概念小结

 
· 利用时间局部性: 一旦一个数据茬第一次不命中时被拷贝到缓存中我们就会期望后面对该目标有一系列的访问命中。
· 利用空间局部性:块通常包含多个数据对象我們通常期望后面对该块中其他对象的访问能够补偿不命中后拷贝该块的花费。
 

通用的高速缓存存储器结构

 
一个计算机系统每个存储地址有m位形成M=2^m个不同的地址。
高速缓存被组织成一个有S=2^s个高速缓存组的数组每个组包含E个高速缓存行,每个行是由一个B=2^b字节的数据块、一位囿效位以及t=m-(b+s)个标记位组成唯一标识存储在这个高速缓存行中的块。
高速缓存的结构用元组(S,E,B,m)来描述高速缓存的大小C = S * E * B


 
每组只有一行(E=1)的高速缓存称为直接映射高速缓存高速缓存确定一个请求是否命中,然后抽取出被请求字的过程分为三步:1)组选择2)行匹配,3)字抽取
· 直接映射高速缓存中的组选择:高速缓存从要抽取的字的地址中抽取出S个组索引位,这些位被解释成一个对应于一个组号的無符号整数
· 直接映射高速缓存中的行匹配:当且仅当设置了有效位,而且高速缓存行标记与w的地址中的行标记相匹配时这一行中包含w的一个拷贝。
· 直接映射高速缓存中的字抽取:块偏移位提供了所需要的字的第一个字节的偏移
· 直接映射高速缓存中不命中时的行替换:需要从存储器层次结构中的下一层取出被请求的块,然后将新的块存储在组索引位指示的组中的一个高速缓存行中

高速缓存参数嘚性能影响

 


· 命中时间:从高速缓存传送一个字到CPU所需的时间,包括组选择行匹配,字抽取的时间



2. 块大小的影响:较大的块能利用程序中可能存在的空间局部性,帮助提高命中率;但块越大意味着高速缓存行较少损害时间局部性。
3. 相联度的影响:相联度较大(E值较大)优点是降低了高速缓存由于冲突不命中出现抖动的可能性但成本较高。
写策略的影响:直写高速缓存易实现而且能使用独立于高速緩存的写缓冲区,用来更新存储器不命中开销小。写回高速缓存引起的传送比较少允许更多的到存储器的宽带用于执行DMAI/O设备。越下層越可能使用写回
}

运算符“>>”执行算术右移它使鼡最高位填充移位后左侧的空位。右移的结果为:每移一位第一个操作数被2除一次,移动的次数由第二个操作数确定

逻辑右移或叫无苻号右移运算符“>>>“只对位进行操作,没有算术含义它用0填充左侧的空位。

算术右移不改变原数的符号而逻辑右移不能保证这点。

移位运算符约简其右侧的操作数当左侧操作数是int类型时,右侧以32取模;当左侧是long类型时右侧以64取模。

}

我要回帖

更多关于 脚踝错位怎么办 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信