20145233 《信息安全系统设计基础》第6周学习总结
教材学习内容总结
ISA
- ISA是IndustryStandardArchitecture的缩写ISA插槽是基于ISA总线(IndustrialStandardArchitecture,工业标准结构总线)的扩展插槽,其颜色一般为黑色,比PCI接口插槽要长些,位于主板的最下端。其工作频率为8MHz左右,为16位插槽,最大传输率16MB/sec,可插接显卡,声卡,网卡已及所谓的多功能接口卡等扩展插卡。其缺点是CPU资源占用太高,数据传输带宽太小,是已经被淘汰的插槽接口。
- ISA是8/16bit的系统总线,最大传输速率仅为8MB/s,但允许多个CPU共享系统资源。由于兼容性好,它在上个世纪80年代是最广泛采用的系统总线,不过它的弱点也是显而易见的,比如传输速率过低、CPU占用率高、占用硬件中断资源等。后来在PC‘98规范中,就开始放弃了ISA总线,而Intel从i810芯片组开始,也不再提供对ISA接口的支持。
- ISA卡外观
- 2ISA总线时序
- ISA总线是IBMPC/AT机(CPU是80286)所用的系统总线.。�PC/AT总线经过标准化之后的名称。IEEE将ISA总线作为IEEEP996推荐标准。�这是一个16位兼8位的总线标准。如果忽略标准化细节�则可认为16位ISA总线就是PC/AT总线。由于IBMPC/AT与IBMPC、IBMPC/XT机(CPU都是8088)所用的Pc总线兼容,所以可认为8位ISA总线(16位ISA总的低8位部分)就是PC总线。
Y86指令体系结构
Y86的处理器类似于IA32
- 有8个程序寄存器,%eax,%ecx,%edx,%ebx,%esi,%edi,%esp,%ebp
- 处理器的每个程序寄存器存储一个字
- 寄存器%esp被入栈、出栈、调用和返回指令作为栈指针。在其他情况下,寄存器没有固定的含义或固定值。
- 有三个一位的条件码:ZF,SF,OF,它们保存最近的算术或洛基指令所造成英雄的有关信息。
- 程序计数器PC存放当前正在执行指令的地址。
- 状态码stat,它表明程序执行的总体状态,会指示是正常运行还是出现了某种异常。
Y86指令
Y86指令集基本上是IA32指令集的一个子集,只包括四字节整数操作,寻址方式比较少,操作也较少。
汇编码表示和字节编码参见课本232页。
1.movl指令
IA32的movl指令分为四种:
irmovl,rrmovl,mrmovl,rmmovl
前面的两个字母是在显式的指定源操作数和目的操作数的格式,第一位是源操作数,第二位是目的操作数。
(1)源操作数
可以是:
i-立即数
r-寄存器
m-存储器
(2)目的操作数
可以是:
r-寄存器
m-存储器
- 这里的存储器引用方式是简单的基址和偏移量形式,寻址方式不支持第二变址寄存器和任何寄存器值的伸缩
- 两个操作数不能都是来自存储器,也不允许将立即数传送到存储器
2.四个整数操作指令
addl 加
subl 减
andl 与
xorl 异或
并且它们只对寄存器数据进行操作(区别于IA32,后者还允许对存储器数据进行这些操作)。
这些指令会设置三个条件码:
ZF-零
SF-符号
OF-溢出
逻辑设计和硬件控制语言HCL
逻辑门
1.逻辑门产生的输出,等于它们输入位值的某个布尔函数。
AND &&
OR ||
NOT !
2.逻辑门只对单个位的数进行操作,而不是整个字。
3.逻辑门总是活动的,输入变化输出很快就跟着变化。
组合电路和HCL布尔表达式
1.构建计算块(组合电路)时的限制
-
两个或多个逻辑门的输出不能连接在一起
-
必须无环
2.组合逻辑电路和c语言中逻辑表达式的区别 -
组合电路的输出会持续响应输入变化,c语言表达式只有在执行过程中被遇到才求值
-
逻辑门只对0和1操作,c语言表达式中参数可以是任意整数,0是FALSE,不是0的都是TRUE
-
c的逻辑表达式可能被部分求值
集合关系
判断集合关系的通用格式是:
iexpr in {iexpr1,iexpr2,...,iexprk}
iexpr等都是整数表达式。
存储器和时钟
对应EDA学习时的时序逻辑电路
1.时序电路的两类存储器设备:
(1)时钟寄存器(简称寄存器):储存单个位或字。
(2)随机访问储存器(简称储存器):储存多个字,用地址选择该读/写哪个字。
寄存器分为“硬件寄存器”和“程序寄存器”。
2.Y86处理器
它会用时钟寄存器保存程序计数器PC,条件代码CC和程序状态Stat。
Y86的顺序实现
一、将处理组织成阶段
六个基本阶段:
- 取指:从存储器读取指令字节,地址为程序计数器(PC)的值。指令指示符字节两个四位部分,称为icode(指令代码)和ifun(指令功能)。vaIP(下一条指令的地址)=PC+已取出指令的长度。
- 译码:从寄存器文件读入最多两个操作数,得到valA和/或valB。
- 执行:算数逻辑单元(ALU)根据ifun的值执行指令指明的操作,计算存储器引用的有效地址,或者增加或减少栈指针。得到的值称为valE。也可根据条件码执行跳转。
- 访存:将数据写入存储器,或者从存储器读出数据。读出的值为valM。
- 写回:将数据写入存储器,或者从存储器读出数据。读出的值为valM。
- 更新PC:将PC设置成下一条指令的地址。
二、SEQ硬件实现
- 取指:将程序计数器寄存器作为地址,指令存储器读取指令的字节。PC增加器计算valP,即增加了的程序计数器。
- 译码:寄存器文件有两个读端口A和B,从这两个端口同时读寄存器的值valA和valB。
- 执行:根据指令类型将算数/逻辑单元(ALU)用于不同的目的。条件码寄存器有三个条件码位,ALU负责计算条件码的新值,当执行跳转指令时会根据条件码和跳转类型来计算分支信号Cnd。
- 访存:数据存储器读出或写入一个存储器字。指令和数据存储器访问的是相同的存储器位置,但用于不同的目的。
- 写回:寄存器文件有两个写端口,E用来写ALU计算出来的值,M用来写从数据存储器中读出来的值。
三、SEQ的时序
-
Y86指令集的计算原则:处理器从来不需要为了完成一条指令的执行而去读由该指令更新了的状态。
四、SEQ阶段的实现 -
取指阶段:包括指令存储器硬件单元。
-
译码和写回阶段:寄存器文件,支持同时进行两个读和两个写,每个端口有一个地址连接(寄存器ID)和一个数据连接(32根线路),既可以作为寄存器文件的输出字,又可以作为他的输入字。
-
执行阶段:算数逻辑单元(ALU),输出为valE信号。
-
访存阶段:读或者写程序数据,两个控制块产生存储器地址和存储器输入数据的值。另外两个块产生控制信号表明应该执行读还是写操作。当执行读操作时,数据存储器产生valM。
-
更新PC阶段:产生程序计数器的新值,依据指令的类型和是否要选择分支,新的PC可能是valC、valM或者valP。
本周代码托管链接
本周的个人思考问题
在本周的实验内容中,老师给大家了Y86的模拟器,但是这个需要在虚拟机的环境下来完成,在第一次设置虚拟机的时候,因为是之前的虚拟系统,漏洞百出,我只好重新做了,这是接下来的截图:
这是按照同学的步骤来完成的。
开始的时候
安装bison和flex词法分析工具,在终端中输入sudo apt-get install bison flex
下载sim解压。地址http://csapp.cs.cmu.edu/public/students.html(注意:使用校网很可能打不开,最好使用其他网络)
找到 Chapter 4: Processor Architecture,点击Source distribution (README)如下图所示,下载后在虚拟机中解压。
完成之后,紧跟的安装过程
最后生成的图形模拟器
将其中code下的代码都使用make来编译:
其中书上251的代码:
我的代码有错误,应该是中间缺少了一部分,我看了code文件下的代码,都有开头,只是我这个加进去了也有问题。
其他(感悟、思考等,可选)
本周我做了很多内容,不知道为啥我的之前的虚拟系统有问题,我查了很多资料依旧无法解决,所以我只好用了最笨的方法来处理这个问题,我重新设置了一个虚拟机这个虚拟机很成功,不但之前的所有问题都有解决,并且连在终端中输入汉字都也解决了,虽然我不清楚这是为什么。
本周的内容其实也不少,知识点很多,并且还接触了一个新的语言HCL,书上的一些地方不是很明了,但是多次阅读加上练习就可以更好的弄清楚为什么。
本次的Y86安装离不开张晓涵同学的博客帮助,里面很详细的讲解了如何完成这些步骤,最后可以进行Y86模拟,也练了很多书上的代码。果然,多看多学习有很大的帮助。
练习题
4.1
确定下面的Y86指令序列的字节编码。.pos 0x100表明这段代码的起始地址应该是0x100
irmovl $15,%ebx
rrmovl %ebx,%ecx
loop:
rmmovl %ecx,-3(%ebx)
addl %ebx,%ecx
jmp loop
答案:
irmovl $15,%ebx ##30f30f000000
rrmovl %ebx,%ecx ##2031
loop:
rmmovl %ecx,-3(%ebx) ##4013fdffff
addl %ebx,%ecx ##6031
jmp loop
4.8
写出信号xor的HCL表达式,xor就是异或,输入为a和b。信号xor和上面定义的eq有什么关系?
bool xor = (a && !b) || (!a && b)
与bool eq = (!a && !b) || (a && b)的区别为:互补
4.10(3个HCL代码)
对于三个以上的HCL代码,我觉得使用真值表可以来证明,可以画图进行逻辑运算。
写一个电路的HCL代码,对于输入字A,B,C,选择中间值。
int Med3 = [
A<=B && A>=C :A;
A<=C && A>=B :A;
B<=A && B>=C :B;
B<=C && B>=A :B;
C<=A && C>=B :C;
C<=B && C>=A :C;
];
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 24篇 | 350小时 | |
第一周 | 0/0行 | 1/2 | 20小时 | |
第二周 | 53/53行 | 1/3 | 25/45小时 | |
第三周 | 130/183行 | 1/4 | 30/75小时 | |
第四周 | 0/183行 | 0/4 | 5/80小时 | |
第五周 | 158/341行 | 1/5 | 30/110小时 | |
第六周 | 84/425行 | 2/7 | 30/140小时 |