HNU君陌

第一章、计算机系统漫游
1、信息:
信息就是位+上下文,系统中所有的信息都是由一串位表示的,区分不同数据对象的唯一方法是我们读到这些数据对象时的上下文
2、程序:
源文件到目标文件的转化是由编译器驱动程序完成的,分为预处理阶段(预处理器)、编译阶段(编译器)、汇编阶段(汇编器)、链接阶段(链接器):
预处理阶段修改原始的C程序,将头文件中的内容直接插入到程序文本中,得到.i文件;
编译阶段将.i文件翻译成汇编语言程序的.s文件,每条语句都以一种标准的文本格式确切的描述了一条低级机器语言指令;
汇编阶段将.s文件翻译成机器语言指令(二进制),他的字节编码不是字符;
链接阶段将.o文件中调用的函数以某种方式合并到我们的.o文件中,ld链接器负责处理这种合并,得到可执行目标文件,可以被加载到内存中,由系统执行。
3、系统的硬件组成:
总线:贯穿整个系统的是一组电子管,称作总线,通常被设计成传送定长的字节块,即字。但在各个系统中的设置一般不相同。有系统总线(连接CPU与I/O桥)、存储器总线(连接主存储器<内存>与I/O桥)、I/O总线(连接输入输出设备和硬盘控制器与I/O桥)
I/O设备:每个I/O设备通过控制器或者适配器与I/O总线相连。控制器是I/O设备本身或者系统的主印制电路板(主板)上的芯片组,适配器是一块插在主板插槽上的卡
主存储器:内存,一个临时存储设备,用来存放程序和程序处理的数据,由一组动态随机存取存储器(DRAM)芯片组成
处理器:CPU,核心是一个大小为一个字的存储设备(或寄存器),称为程序计数器(PC)。在任何时刻,PC都指向主存中某条机器语言指令(含有该指令的地址)。处理器不断地执行PC指向的指令,再更新PC,使其指向下一条指令。寄存器是小的存储设备,每个寄存器都有唯一的名字。ALU是算术逻辑单元,用来计算新的数据和地址值。CPU在指令的要求下可能会执行加载(把一个字节或者字从主存复制到寄存器以覆盖寄存器原来的内容)、存储(把一个字节或者一个字从寄存器复制到主存的某个位置,以覆盖这个位置上原来的内容)、操作(把两个寄存器的内容复制到ALU并进行算术操作,将结果存放到一个寄存器中,以覆盖该寄存器中原来的内容)
4、运行程序过程:
在键盘输入./hello后,shell将字符读入寄存器,并复制到内存中;按下回车后,shell程序执行一系列指令来加载可执行的hello文件,将hello目标文件中的代码和数据从硬盘复制到主存;一旦目标文件中的代码和数据被加载到主存,处理器就开始执行hello文件中的main的机器语言指令,最后程序的结果从主存复制到寄存器,寄存器再复制到显示设备
5、高速缓存:
高速缓存存储器(cache)作为暂时的集结区域,存放处理器近期可能会需要的信息。L1位于处理器芯片上,容量为数万字节,访问速度可以寄存器一样快;L2通过一条特殊的总线连接到处理器,容量为数十万到数百万字节,访问时间比L1长5倍,L1和L2都是SRAM。
6、抽象概念:
进程:是操作系统对一个正在运行的程序的抽象。并发执行是说一个进程的指令和另一个进程的指令是交错执行的(看上去像是多个进程同时进行,但针对单个处理器来说,每个时间片只有一个进程的代码在执行)从一个进程到另一个进程的切换是由操作系统内核管理的,内核是操作系统代码常驻主存的部分,不是一个独立的进程,他是系统管理全部进程代码和数据结构的集合。
线程:一个进程可由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据,多线程之间比多进程之间更容易共享数据,一般比进程高效。
虚拟内存:为每个进程提供了一个假象,即每个进程都在独占主存。每个进程看到的内存都是一样的,称为虚拟地址空间(就是一个栈)。地址空间顶部是为内核保留的,不允许应用程序读写这个区域的内容或者直接调用内核代码定义的函数。
对于所有的进程,代码是从同一固定地址开始,代码和数据区是按照可执行目标文件的内容初始化的;
堆不同于代码和数据区在进程一开始就已经被制定了大小,堆可以在运行时动态的扩展和收缩;
共享库用来存放向C标注库和数学库这样的共享库的代码和数据的区域;
栈被编译器用来实现函数的调用,和堆一样,用户栈在程序执行期间可以动态的收缩和扩展。
7、并发和并行:、信息的表示和处理
并发指一个同时具有多个活动的系统,即多个任务能被来回切换地做;并行指用并发来使一个系统运行的更快,即几件事可以同时做。
多核处理器是将多个CPU集成到一个集成电路芯片上,每个核都有自己的L1和L2高速缓存,其中L1高速缓存又分为保存指令和保存数据。
超线程:允许一个CPU执行多个控制流。一般的处理器需要较长的时钟周期来进行不同线程之间的转换,而超线程处理器可以在单个周期的基础上决定要执行哪个线程。
8、名词:
位:电子计算机的最小的数据单位,每一位的状态只能是0或者1
字节:8个二进制位构成1个字节,他是存储空间的基本计量单位
字:字由若干个字节构成,字的位数叫做字长,字是计算机进行数据处理和运算的单位

第二章、信息的表示和处理
1、信息存储:
大部分计算机用字节作为最小的可寻址寄存器单位。程序将存储器视为一个非常大的字节数组,称为虚拟存储器,存储器的每一个字节都由唯一的数字来标识,即地址,所有可能地址的集合称为虚拟地址空间
计算机一次存取、加工和传送的数据长度称为字,字的位数叫做字长,用来表明整数和指针数据的标称大小。由于虚拟地址空间中的地址是用一个字来编码的,因此字长决定了系统的虚拟地址空间的最大大小。通俗的说字长指的是CPU一次能并行处理的二进制位数,字长总是8的整数倍,在cmd界面输入systeminfo可以查看处理器信息
计算机系统总结(上·前四章)
寻址和字节顺序:多字节对象被存储为连续的字节序列,对象的地址为所使用的的字节中最小的地址,其中小端法是低字节存低地址,大端法低字节高地址
数据类型的出现是为了把数据分成所需内存大小不同的数据,计算机在解释一个数据类型的值时有四个因素:位排列规则(大端小端)、起始位置、数据类型的字节数、数据类型的解释方式。后两种因素的改变可以改变一个数据类型的值的最终计算结果,即强制类型转换。sizeof函数可以告诉我们一个数据类型的字节数
程序其实就是一个二进制序列的简单描述,编译器会帮我们将其翻译成对应的机器所认识的二进制序列
字符串被编码为一个以NULL(其值为0)字符结尾的字符数组。在使用ASCII码作为字符码在任何系统上都得到相同的结果,与字节顺序和字大小规则无关,因此文本数据比二进制数据具有更强的平台独立性
位级运算:最常见的是实现掩码运算,掩码是一个为模式,表示从一个字中选出的位的集合,掩码0XFF表示一个字的低位字节,位运算X&0XFF将会得到x的最低有效位组成的值,其他值被置为0
移位运算:左移只有逻辑左移,在右侧补0;右移有算术右移,补最高位。移位数量应该保持小于字长,加减法的运算优先级高于移位运算
2、整数表示:
用一组固定的数字和一套统一的规则来表示数目的方法称为数制,数制有进位计数制(数码所表示的数值大小与它在数中所处的位置有关)和非进位计数制。进位计数制的要素有数码、基数、位权。每个数码所表示的数值=该数码值*所处位置的位权
无符号数编码:用unsigned声明,最高位计入总数,值为数码值和
补码编码:将字的最高有效位解释为负权,不计入总数。负数的范围比正数大1,反码最低位加1即为补码
原码编码:最高有效位是符号位,用来确定剩下的位是正是负,即一个整数,按照绝对值大小转换为二进制数,最高位为符号位
反码编码:将原码除最高位外,其余各位按位取反得到的二进制码。正数的反码为原码
对于正整数,原码、反码、补码完全一样,即符号位固定为0,数值为相同
对于负整数,原码为绝对值+最高位1,反码为绝对值取反,补码为反码+1
注意,在c语言中当执行一个运算(包括比较),会隐式地将有符号参数强制转换为无符号参数
3、整数运算:
无符号加法:如果结果小于0或者超过了(2^w)-1就会导致失真
补码加法:会出现正溢出、正常、负溢出三种情况,补码加法就是先按照无符号加法进行运算,而后再进行无符号和有符号的转换
无符号乘法:结果为mod 2^w
补码乘法:相乘后进行截断
除法运算:对于除以2的幂可以用移位来运算,无符号除法使用逻辑移位,补码除法使用算术移位,总是舍入到零(向偶数舍入)
4、浮点数:
小数点向左移动一位相当于除以2,向右移动一位相当于乘2,只要位数足够,就可以表示所有整数,二进制小数无法精确地表示任意小数
IEEE浮点标准表示:V=(-1)s*M*2E,其中s是符号位,0正1负;M为位数,是一个二进制小数,他的范围是0到1-ε或者1到2-ε,ε的值一般是2^-k;E为阶码,可正可负,作用是给位数加权。
小数可以表示为三个阶段,分别是一个单独的符号位s直接编码符号s;k位的阶码字段exp编码阶码E;n位小数字段frac编码位数M。
规格化情况exp!=0&255,非规格化情况exp=0,无穷大exp=1且f=0,NaN是exp=1且f!=0。
规格化情况写阶码字段被解释为以偏置形式(在原有值的基础上加一个偏移量,对于阶码位数为k的情况来说,偏移量Bias=2^(k-1)-1,单精度阶码位数为8,则偏移量Bias=127,真实阶码的范围为-126~127)表示有符号整数。二进制小数点在f的最高有效位的左边,当计算浮点数数值的时候会在尾数值的基础上+1
非规格化情况阶码的偏移量与规格化情况一直,阶码为定值1-Bias。尾数不会进行+1处理,这是为了能够表示0这个数值,非规格化浮点数可以表示0,以及接近0的数值。根据符号位有正0和负0之分
特殊值是阶码全为1的时候出现的,当阶码全为1时,如果尾数全为0表示无穷大,符号位为0表示正无穷大,为1为负无穷大。如果尾数不全为0表示NaN,表示不是一个数字
舍入:有四种方式,分别是向偶数舍入、向零舍入、向上舍入、向下舍入。向偶数舍入当且仅当多余数字刚好是1000、正好是最低位一半的特殊情况,最低位为0则舍弃多余位,最低位为1则进位1
浮点运算:浮点运算不满足加法结合律、加法分配律和乘法结合律

第三章、程序的机器级表达
1、程序编码:
机器语言:用二进制代码表示的计算机能直接识别和执行的一种机器指令系统的集合(ISA)。机器级程序使用的存储器地址是虚拟地址,只是简单地将存储器看成一个很大的按字节寻址的数组。一条机器指令只执行一个非常基础的操作,编译器必须产生这些指令的序列,从而实现程序结构。定义了处理器状态,指令格式以及每条指令对状态的影响。记录了指令的编码方式(如何编码)、操作数和操作结构的存放位置、数据的类型和大小、支持哪些操作、下一条指令的地址。。
汇编语言:主题是汇编指令,汇编指令和机器指令的差别在于指令的表示方法上,汇编指令是机器指令便于记忆的书写格式。程序用汇编语言写出源代码,通过编译器将汇编语言便以为机器码,再由计算机执行。汇编语言是直接面向处理器的程序设计语言。由于汇编语言是直接和寄存器和存储器打交道,所以汇编语言比其他语言快,但更复杂。汇编代码不区分有符号或者无符号整数,不区分各种类型的指针,甚至不区分指针和整数
在汇编语言中,有四个处理器状态是可见的:程序计数器(用%eip表示)只是将要执行的下一条指令在存储器中的地址;整数寄存器文件包含8个命名的位置,可以存储一些地址或者整数的数据,有的用来记录某些重要的程序状态,有的用来保存临时数据;条件码寄存器保存最近执行的算术或者逻辑指令的状态信息,用来实现控制或者数据流中的条件变化;浮点寄存器用来存储浮点数
程序存储器包含程序的可执行机器代码,操作系统需要的一些信息,用来管理过程调用和返回的运行时栈,以及用户分配的存储器块。程序存储器用虚拟地址来寻址,在任意给定时刻,只认为有限一部分虚拟地址是合法的。操作系统负责管理虚拟地址空间,将虚拟地址翻译成实际处理器存储器中的物理地址
要查看目标代码文件的内容用反汇编器,将源代码产生一种类似于汇编代码的格式。所有以.开头的行都是知道汇编器和链接器的命令,可以忽略
2、访问信息:
用字表示16位数据类型,双字表示32,四字表示64,所以movb表示传送一个字节的数据,movw表示传送两个字节的数据,movl表示传送四个字节的数据
32位CPU中包含一组8个存储32位值的寄存器,用来存储整数数据或指针,其中
%eax可存放一般数据,可作为累加器和函数返回值使用;
%ebx可存放一般数据,可作为存放数据的指针(偏移地址);
%ecx可存放一般数据,可用来做计数器,循环次数常用他;
%edx可存放一般数据,可用来存放乘法运算产生的部分积,或用来存放输入输出的端口地址;
%esi可存放一般数据,可用于串操作存放原地址;
%edi可存放一般数据,可用于串操作存放目标地址;
%esp用于寻址一个称为独占的存储区,用来访问堆栈数据;
%ebp可存放一般数据,用于存放访问堆栈的一个数据区,作为基地址
3、算术和逻辑操作:
大多数指令都有一个或多个操作数,指示出执行一个操作中需要引用的源数据值,以及放置结果的目标位置。操作数有三种类型:
立即数(书写方式是$跟一个标准c表示的整数,任何能放进一个32位字里面的数值都可以做立即数)
寄存器(表示某个寄存器的内容)
存储器(根据计算出来的地址即有效地址来访问某个存储器位置)
语法为lmm(Eb,Ei,s),其中lmm是立即偏移数,Eb是基址寄存器,Ei是变址寄存器,s是比例因子,必须为1,2,4,8,其有效地址计算公式为lmm+R[Eb]+R[Ei]s地址的值
数据传送指令:将数据从一个位置复制到另一个位置的指令,将源操作数的值复制到目的操作数中并覆盖,源操作数指定的值是一个立即数,存储在寄存器或存储器中,目的操作数指定一个位置,要么是一个寄存器,要么是一个存储器地址。
movs指令格式为movsxy,其中xy为数据格式,组合有三种bw,bl,wl分别表示传送字节到字,字节到双字,字到双字,高位用符号位拓展
movz指令格式为movzxy,其中xy为数据格式,组合有三种bw,bl,wl分别表示传送字节到字,字节到双字,字到双字,高位用0拓展
push是把数据压入栈中,并且esp减4,pop将数据从栈中移出,同时esp加4
计算机系统总结(上·前四章)
4、控制:
条件码寄存器是由单个位组成的寄存器,值只能是0或1
CF:进位标志寄存器,最近的操作时最高位产生了进位,它可以记录无符号操作的溢出,当溢出时会被设为1
ZF:零标志寄存器,最近的操作得到的结果为0,当结果为0会记为1
SF:符号标志寄存器,最近的操作得到的结果为负数,当结果为负数会记为1
OF:溢出标志寄存器,最近的操作导致一个补码溢出,当结果为溢出时会记为1
当leal指令作为地址计算的时候,是不会改变任何条件码的,条件码寄存器的值无法被主动改变,大多是被动改变。
cmp指令和test指令值设置条件码,而不改变任何其他寄存器的值。cmp指令会根据sub的结果来设置条件码,即cmp s2,s1的条件码设置为s1-s2;test指令会根据and指令的结果来设置条件码,即test s2,s1的条件码设置为s1&s2
e->ZF表示相等
ne->~ZF表示不相等
s->SF表示负数,因为SF在计算结果为负数时设置为1
ns->~SF表示非负数
l->SF^OF表示有符号的小于,当OF0SF1时表示负数,即小于;当OF1SF0时表示产生了溢出,即结果最后为正数,是负溢出,表示小于
le->(SF^OF)ZF表示有符号的小于等于
g->(SF^OF)&ZF表示有符号的大于,表示大于且不等于
ge->~(SF^OF)表示有符号的大于
b->CF表示无符号的小于,即无进位标志或无无符号溢出
be->CF|ZF表示无符号的小于等于
a->CF&ZF表示无符号的大于
ae->~CF表示无符号的大于等于
跳转指令jmp:有三种跳转方式,直接跳转的跳转目标是作为指令的一部分编码的;间接跳转的跳转目标是从寄存器或者存储器位置读出的;其他条件跳转。其中直接跳转的目的地址计算方式为当前指令地址+跳转参数+2
循环:汇编中没有相应的指令存在,可以通过条件测试和跳转指令组合起来实现循环的效果,而大多数汇编器都会根据一个循环的do-while循环形式来产生循环代码
跳转表:是一个数组,表项i是一个代码段的地址,这个代码段实现当switch索引值等于i是程序应该执行的动作,程序代码用索引值来执行一个跳转表内的数组引用,确定跳转指令的目标。优点是执行switch语句的时间与case的数量无关gcc会根据switch中case的数量和case中值的稀少程度来翻译开关语句。执行switch语句的关键步骤是通过跳转表来访问代码位置。
cmov条件传送指令:只有在满足条件的时候才进行传送,后缀如上
5、栈帧结构:
机器用栈来传递过程参数、存储返回信息、保存寄存器用于以后恢复,以及本地存储,单个过程分配的那部分叫做栈帧。栈帧有两个端点,一个标志着起始地址,存储在ebp中,一个标志着结束地址,存储在esp中,当程序执行时,栈指针可以移动。注意函数的参数按照顺序存放在小端。我们将栈指针减去一定的值,就相当于给栈帧分配了一定空间的内存。
过程实现中参数传递以及局部变量的内存分配和释放先备份原来的帧指针,调整当前的帧指针到栈指针的位置,再对栈指针进行减操作开辟空间,再备份被调用者保存的寄存器当中的值,如果有值的话,备份的方式是压入栈顶,然后使用建立好的栈帧,调用结束后恢复被调用者寄存器当中的值,释放被调用者的栈帧,恢复调用者的栈帧,最后弹出返回地址,跳出当前过程,继续执行调用者的代码
call指令将会调用一个被调用者过程,将程序跳转到当前调用的方法的起始地址,并将返回地址压入栈顶
leave指令将结束被调用者过程,将栈指针指向帧指针,并弹出备份的原帧指针到ebp
ret指令将栈顶的染回地址弹出到pc,并按照pc此时的指令地址继续执行程序
eax、edx、ecx被划分为调用者保存寄存器;ebx、esi、edi被划分为被调用者保存寄存器;ebp、esp是保持寄存器;eax保存函数返回值
6、数组:
数组声明T A[n]一方面在存储器中分配一个L
N字节的连续区域,这里L是数据类型T的大小,另一方面A作为指向数组开头的指针,如果分配的连续区域的地址为xa,那么这个指针的值就是xa,即我们访问A[I]实际上访问的是xa+isizeof(T)。
变长数组和定长数组相比,一方面加上了参数n,参数在栈上的地址移动了,另一方面用了乘法指令计算n
i而不是通过leal指令计算3i
数据强制对齐:计算机系统要求某种类型对象的地址必须是某个k值(2,4,8)的倍数,简化了形成处理器和存储器系统之间接口的硬件设计,其中K值为数据对象的宽度。

第四章、处理器体系结构(不考)
1、Y86指令集体系结构:
一个处理器支持的指令和指令的字节级编码称为他的指令集体系结构。Y86程序员可见部分包括寄存器、存储器、条件码、PC、程序状态。
halt指令会停止指令的执行,并将状态码设置为HLT
nop指令为一个占位指令,不做任何事情
xxmovl指令是一系列的数据传送指令,r代表寄存器,m代表存储器,i代表立即数
OPL包括4个整数操作指令addl,subl,andl,xorl,只对寄存器数据进行操作
jxx包括7个跳转指令jmp,jle,jl,je,jne,jge,jg,根据指令的类型和条件码的设置来选择分支
cmovxx包括6个条件传送指令cmovle,cmovl,cmove,cmovne,cmovge,comvg仅寄存器间
call指令将返回地址入栈,并跳转到目标地址
ret指令将返回地址入PC,并跳转到返回地址
pushl和popl实现地址的入栈出栈
2、逻辑设计:
常用的存储设备一般有时钟寄存器(简称寄存器,存储单个位或字,时钟信号控制寄存器加载输入值)和随机访问存储器(简称存储器,存储多个字,用地址来选择该读或者该写哪个字)。时钟寄存器典型是程序计数器PC、条件码寄存器以及程序状态。随机访问存储器典型是寄存器文件(8个程序寄存器)和随机访问存储器(内存),没有明确的输入值,因此不存在函数关系,都有读写两种操作
处理器从来不需要为了完成一条指令的执行二区读由该指令更新了的状态
数据相关:下一条指令会用到这条指令计算出来的结果
控制相关:一条指令要确定下一条指令的位置

相关文章:

  • 2021-06-04
  • 2021-06-07
  • 2022-01-28
  • 2021-12-15
  • 2021-12-26
  • 2021-04-11
  • 2021-07-05
  • 2022-01-07
猜你喜欢
  • 2021-12-18
  • 2021-10-12
  • 2021-12-03
  • 2021-12-03
  • 2022-01-23
  • 2021-10-15
  • 2022-12-23
相关资源
相似解决方案