2017-2018-1 20155213 《信息安全系统设计基础》第七周学习总结
2017-2018-1 20155213 《信息安全系统设计基础》第七周学习总结
教材学习内容总结
浏览了正章,重点学习了处理器的流水线作业
- 流水线的通用原理
- 将处理组织成阶段
- 将一条指令分解成很多步操作,在执行
- 将处理组织成阶段
操作 | 描述 |
---|---|
取值(fetch) | 从存储器取指令,再更新PC |
译码(decode) | 从寄存器堆读出寄存器的值 |
执行(execute) | 运算指令:进行算术逻辑运算;访存指令:计算存储器的地址 |
访存(memory) | load指令:从内存读出数据;store指令:将数据写入内存 |
写回(write-back) | 将数据写回寄存器堆 |
-
-
- 计算流水线
- 这是一个非流水线的硬件系统,对应一条指令的执行,执行其中的组合逻辑部分假设需要300ps (1ps=10^(-12)s),寄存器延迟需要20ps,那么时钟周期设置为320ps(这条指令的执行时间为一个周期),吞吐量(指令数/指令执行时间)为
1/320ps = 3.12GIPS(每秒千兆指令)。
-
Y86模拟器的配置
- 具体参考 20145218张晓涵学姐的博客,里面的步骤已经叙述的很详尽了,只是有一点需要注意,输入make指令前,先将Makefile里面的代码改成如下形式,以及出现如下截图的提示也不要管,对后续的步骤没有影响。
# Comment this out if you don't have Tcl/Tk on your system
GUIMODE=-DHAS_GUI
# Modify the following line so that gcc can find the libtcl.so and
# libtk.so libraries on your system. You may need to use the -L option
# to tell gcc which directory to look in. Comment this out if you
# don't have Tcl/Tk.
TKLIBS=-L/usr/lib/ -ltk8.5 -ltcl8.5
# Modify the following line so that gcc can find the tcl.h and tk.h
# header files on your system. Comment this out if you don't have
# Tcl/Tk.
TKINC=-I /usr/include/tcl8.5
##################################################
# You shouldn't need to modify anything below here
##################################################
# Use this rule (make all) to build the Y86 tools. The variables you've
# assigned to GUIMODE, TKLIBS, and TKINC will override the values that
# are currently assigned in seq/Makefile and pipe/Makefile.
all:
(cd misc; make all)
(cd pipe; make all GUIMODE=$(GUIMODE) TKLIBS="$(TKLIBS)" TKINC="$(TKINC)")
(cd seq; make all GUIMODE=$(GUIMODE) TKLIBS="$(TKLIBS)" TKINC="$(TKINC)")
(cd y86-code; make all)
clean:
rm -f *~ core
(cd misc; make clean)
(cd pipe; make clean)
(cd seq; make clean)
(cd y86-code; make clean)
(cd ptest; make clean)
- 最后输入
./psim -t -g ../y86-code/asum.yo
可以看到如下截图:
教材学习中的问题和解决过程
- 问题1:P255的4.4题:根据下面的C代码,用Y86-64代码来实现一个递归求和函数rsum;
int Sum(int *Start,int Count)
{
int sum = 0;
while(Count)
{
sum+=*Start;
Start++;
Count--;
}
return sum;
}
- 问题1解决方案:先用linux下的gcc编译器将上面的代码编译成x86-64汇编代码如下:
Sum:
.LFB0:
pushq %rbp
movq %rsp, %rbp
movq %rdi, -24(%rbp)
movl %esi, -28(%rbp)
movl $0, -4(%rbp)
jmp .L2
.L3:
movq -24(%rbp), %rax
movl (%rax), %eax
addl %eax, -4(%rbp)
addq $4, -24(%rbp)
subl $1, -28(%rbp)
.L2:
cmpl $0, -28(%rbp)
jne .L3
movl -4(%rbp), %eax
popq %rbp
ret
- 按照Y86-64规则改写上面代码:
Sum:
xorq %rax,%rax
andq %rsi,%rsi
je return
pushq %rbx
mrmovq (%rdi),%rbx
irmovq $-1,%r10
addq %r10,%rsi
irmovq $8,%rdi
call Sum
addq %rbx,%rax
popq %rbx
return:
ret
代码托管
结对及互评
结对队友20155303
其他(感悟、思考等,可选)
这周学习了新的处理器环境,挺受用的,也理解了ISA是处理器设计者和编译器编写者的抽象层。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 15篇 | 400小时 | |
第一周 | 177/177 | 1/1 | 10/10 | |
第三周 | 308/485 | 2/2 | 12/22 | |
第五周 | 277/762 | 2/4 | 10/32 | |
第六周 | 567/1329 | 1/5 | 15/47 | |
第七周 | 22/1351 | 1/6 | 10/57 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:XX小时
-
实际学习时间:XX小时
-
改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)