20145214 《信息安全系统设计基础》第6周学习总结
教材学习内容总结
Y86指令集体系结构
- Y86处理器状态类似于IA32,可以访问和修改程序寄存器:%eax,%ecx,%edx,%ebx,%esi,%edi,%esp和%ebp;条件码:ZF(零)、SF(符号)、OF(有符号溢出);程序计数器:存放当前正在执行的指令的地址;和存储器:很大的字节数组,保存着程序和数据
- 指令的字节级编码规则:高4位为代码部分,低四位为功能部分,功能值只有在一组相关指令共用一个代码时才有用
逻辑设计和硬件控制语言HCL
- 要实现一个数字系统需要三个主要的组成部分:计算对位进行操作的函数的组合逻辑、存储位的存储器元素、控制存储器元素更新的时钟信号
- 字级的组合电路:HCL中,所有字级的信号都声明为int,不指定字的大小
- 为了产生时序电路,必须引入按位存储信息的设备,存储设备由同一个时钟信号控制
Y86的顺序实现
- 将处理组织成阶段:取指;译码;执行;访存;写回;更新PC
- Y86指令集的计算原则:处理器从来不需要为了完成一条指令的执行而去读由该指令更新了的状态
- SEQ阶段的实现:取指;译码和写回;执行;访存;更新PC
Ubuntu下Y86模拟器的安装
安装bison和flex词法分析工具
sudo apt-get install bison flex
安装Tcl/Tk 支持图形界面
sudo apt-get install tcl8.5-dev tk8.5-dev tcl8.5 tk8.5
下载sim解压
-
使用地址
http://csapp.cs.cmu.edu/public/students.html
时连接超时
-
一开始猜测是否是地址出错了,于是用
csapp.cs.cmu.edu/2e/students.html
,还是连接出错
-
后来跟着实验楼中的实验提示成功下载sim,并解压
-
make后出现错误,发现是没有修改makefile文件
修改makefile文件
-
修改文件前如下
-
修改第二行根据libtcl.so和libtk.so的路径以便gcc能找到库,所以是usr/lib;第三行根据tcl.h和tk.h的路径,所以是/usr/include/tcl8.5。修改后截图如下
-
修改后成功make
进行测试
-
cd y86-code
进入测试代码,ls
列出所有文件
-
教材p239页代码为asuml.ys,通过
make asuml.yo
进行汇编
-
vi asuml.yo
查看,发现汇编器输出与教材P240一致
-
使用
make all
可以汇编运行所有代码结果
PS:如果使用老师在QQ群里上传的CSAPP.Y86文件,就可以直接下载完毕后安装分析工具和Tcl/Tk,免去我个人认为比较繁琐的下载sim这个步骤
练习题完成过程遇到的问题及解决
练习题4.5
-
函数AbsSum的Y86代码如下
-
进行汇编
-
汇编后
abssum.ys
代码结果如下
练习题4.17
- 写出SEQ实现中信号need_valC的HCL代码
bool need_valC = icode in { IIRMOVL, IRMMOVL, IMRMOVL, IJXX, ICALL };
- 结合课本P263的
need_regids
的HCL描述,还是无法理解这些HCL描述怎样得来的 - 在看了2015-2016-1每周检测解析后才惊觉,
need_regids
说的是这个指令是否包括一个寄存器指示符字节,所以结合课本P232的图4-2,need_regids
的HCL代码应该包括所有含寄存器rA和rB的{IRRMOVL,IOPL,IPUSHL,IPOPL,IIRMOVL,IRMMOVL,IMRMOVL},need_valC
的HCL代码同理
代码托管情况
代码托管链接
其他(感悟、思考等,可选)
- 本周学习的第四章“处理器结构”,主要是在第二、三章基础上对机器执行指令时动作的探究,包括硬件动作,是对指令的一层又一层的深究,学习完4.1-4.3后有了一种知其然的感觉,在学习的过程中复习了前两周的知识,又在学习中再次加深了对知识点的理解。
- 本周学习的Y86模拟器的指令对我个人而言,比前一章的汇编指令更容易理解了许多,对使用者更加友好,学习的过程也更有乐趣,但是HCL描述的部分,虽然有了之前的上过的verilog与HDL设计课程的基础,理解起来不会很难,但是有某些部分联想不起来时就会变得很费解。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第零周 | 0/0 | 1/1 | 5/5 | 使用虚拟机安装linux系统,安装ubuntu |
第一周 | 100/100 | 1/2 | 20/25 | 掌握核心的linux命令,了解了linux操作系统 |
第二周 | 76/176 | 1/3 | 30/55 | 学会了虚拟机上的C编程 |
第三周 | 214/390 | 1/4 | 20/75 | 初步学习计算机中各种数的表示和运算 |
第五周 | 138/528 | 1/5 | 25/100 | 通过学习汇编,了解逆向的思想应用 |
第六周 | 150/678 | 1/6 | 30/130 | 安装了Y86处理器,了解了ISA抽象 |