我是小康小白,一个平平无奇的Java小白。热爱有趣的文字,生活和远方。
个人博客:https://blog.csdn.net/weixin_45791445
有问题欢迎QQ联系:1059320343 (记得备注CSDN)
1. 常见通用计算机系统的四大层次以及连接层次之间的界面:
第一章的介绍:第一章的介绍:第一章的介绍:
应用系统,
—>应用程序编程接口API(生态建设的起点)
操作系统,
—>指令系统ISA(生态建设的终点)
硬件系统,
—>工艺模型
晶体管
补充:在API和ISA中间还有一层应用程序二进制接口(ABI)。ABI是应用程序访问计算机硬件以及操作系统服务的接口。
第二章的介绍:(从用户感知的应用软件到最底层的物理载体)第二章的介绍:(从用户感知的应用软件到最底层的物理载体)第二章的介绍:(从用户感知的应用软件到最底层的物理载体)
应用软件
基础软件
硬件逻辑
物理载体
指令系统介于软件和硬件之间,是软硬件交互的界面。
2. MIPS指令系统:
-
调试模式
-
根模式
- 核心模式
- 监管模式(很少使用)
- 用户模式
-
客户模式
- 核心模式
- 监管模式(很少使用)
- 用户模式
根-核心模式和调试模式可以控制所有的处理器资源,
根-用户模式和客户-用户模式只能控制各自模式的资源,
客户-核心模式可以控制所有的客户-用户资源。
3.指令系统
-
根据指令长度的不同,指令系统分为:
- 复杂 指令系统(CISC):指令长度可变。
- 精简指令系统(RISC):指令长度比较固定。有利于指令流水先的高效实现
精髓在于简化指令间关系,有利于指令流水线高效实现。 - 超长指令字:本质是多条同时执行的指令的组合,其“同时执行”的特征由编辑器指定,无需硬件进行判断。
-
指令集结构:
指令集时指令系统提供给软件的直接接口。
指令系统有时也会狭义地理解为指令集结构。 -
指令:
每条指令倒是一个操作的描述,主要包括操作码和操作数。
操作码包括指令系统,例如加减法。
操作数据指示操作对象,又包括数据类型,访问地址,寻址方式等内容的定义。 -
访存地址
-
访存地址的对齐:
对齐访问是指对该数据的访问地址和结束地址都符合其数据长度。
如果支持不对齐访问,硬件就需要完成数据的拆分和拼合。 -
大小尾端?
big endian:大尾端,也称大端(高位)优先存储。最高有效字节的地址较小的是大尾端。
little endian:小尾端,也称小端(低位)优先存储。最低有效字节的地址较小的是小尾端。如下对00000000 00000000 00000000 00000001的存储?
大尾端: 00000000 00000000 00000000 00000001
addr+0 addr+1 addr+2 addr+3 //先存高有效位(在低地址)
小尾端: 00000001 00000000 00000000 00000000
addr+0 addr+1 addr+2 addr+3 //先存低有效位(在低地址)
-
-
Load和Store的区别?
以LOAD R1 A和STORE C,R3这两条命令进行讲解。在第一条指令中LOAD表示从存储器中读取数据A然后保存到R1寄存器中第二条指令中STORE表示将C保存到存储器R3中。
-
从功能上分,指令可分为四大类:
-
对于跳转指令:
PC 相对地址跳转指令称为“分支”,绝对地址跳转指令称为“跳转“。 -
延迟槽:
RISC指令集中很多条件转移采用了延迟槽技术。
程序中 条件条件条件 转移指令的后一条指令位延迟槽指令。
分支延迟槽 (Branch delay slot),简单地说就是位于分支指令后面的一条指令,不管分支发生与否其总是被执行,而且位于分支延迟槽中的指令先于分支指令提交 (commit)。
- MIPS常用指令集
lb/lh/lw: 从存储器中读取一个byte/half word/word的数据到寄存器中.如lb $1, 0($2)
sb/sh/sw: 把一个byte/half word/word的数据从寄存器存储到存储器中.如 sb $1, 0($2)
add/addu:把两个定点寄存器的内容相加add $1,$2,$3($1=$2+$3);u为不带符号加。
addi/addiu:把一个寄存器的内容加上一个立即数add $1,$2,#3($1=$2+3);u为不带符号加。
sub/subu:把两个定点寄存器的内容相减。
div/divu:两个定点寄存器的内容相除。
mul/mulu:两个定点寄存器的内容相乘。
and/andi:与运算,两个寄存器中的内容相与and $1,$2,$3($1=$2 & $3);i为立即数。
or/ori:或运算。
xor/xori:异或运算。
beq/beqz/benz/bne:条件转移eq相等,z零,ne不等。
j/jr/jal/jalr:j直接跳转;jr使用寄存器跳转;
lui:把一个16位的立即数填入到寄存器的高16位,低16位补零。
sll/srl:逻辑左移/右移sll $1,$2,#2。
slt/slti/sltui:如果$2的值小于$3,那么设置$1的值为1,否则设置$1的值为0。slt $1,$2,$3。
mov/movz/movn:复制,n为负,z为零。mov $1,$2; movz $1,$2,$3($3为零则复制$2到$1)。
trap:根据地址向量转入管态。
eret:从异常中返回到用户态。
add是有符号数加法,addu是无符号数加法。
区别:add指令执行附加的溢出检测,如果运算结果溢出,会触发异常。
C语言代码转换为MIPS机器表示
-
C语言等高级语言编写的程序必须经过编辑器转化为汇编语言,再由汇编器转换为指令码才能在CPU上执行。
-
对下图的解释:
执行顺序:
1.add:(add是被调用的子程序)addu v0,a0,a1addu:这是一个操作码,把两个定点寄存器的内容不带符号相加add $1,$2,$3($1=$2+$3);(相似的指令见上文)v0,a0,a1是三个寄存器而这条指令是将会将输入的参数保存到a0,a1两个寄存器中,并将结果保存到v0寄存器中。jr rajr:负责函数返回的指令,属于间接跳转指令,该指令的操作数为寄存器,因此MIPS汇编中常见的函数返回指令是JR RA指令的后一条指令其延迟槽,延迟槽内的指令先于JR指令执行。调用函数时才会执行此指令。
ref:(函数)
addiu sp,sp,-32指令addi/addiu:把一个寄存器的内容加上一个立即数add $1,$2,#3($1=$2+3);u为不带符号加。这条指令给sp寄存器中加上-32,并将结果保存到sp寄存器中。sw ra,28(sp)sw:sw rt,imm(rs)将rt寄存器中存放的值保存到rs寄存器中存放的值加上立即数imm进行符号扩展后得到的扩展立即数所得的内存地址的内存单元中,即memory[rs + (SignExtend)immediate] <- rt这条指令是li a0,12这条指令将12保存到a0这个寄存器中。li a1,34这条指令将34保存到a1jal addjal:调用函数,属于绝对转移指令,该指令在跳转的同时还将下一条指令(延迟槽除外)的地址放入31号通用寄存器(记为RA)中,作为函数放回地址。 在这条指令中,它调用了add函数。lw ra,28(sp)
注:这个解释未写完,小白后面会补完的。
4. 存储管理
-
段式存储管理的地址转换的过程:
-
页式存储管理的地址转换过程:
-
段页式存储管理的地址转换过程(虚拟地址分为段号,虚拟页号和页内偏移):
-
段里面存储的是多张页表。
- 首先根据短号查询段表得到对应段的页表起始地址
- 根据页表起始地址和虚拟页号查询页表得到物理页号,
- 物理页号与业内偏移组合得到最终的物理地址。
补充:段页式同样需要检查段地址的合法性。
5.特权指令系统简介
特权指令系统就其机制而言,可以分为以下几类
(1)运行模式定义及转换
(2)虚拟存储管理
(3)异常和中断处理
(4)控制寄存器
控制寄存器位于一个独立的地址空间,是支撑前面3种机制的具体实现。不同的指令系统差别较大。
5.异常和中断
6.MIPS的原子性方案:
使用LL(Load Linked)和SC(Store Conditional)指令来完成原子操作。由硬件维护一个LL bit,在LL指令访问莫内存地址后,若该地址被改写则修改LL bit状态,执行SC指令时检查LL bit来确定原子性。