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小时

  • 改进情况:

(有空多看看现代软件工程 课件
软件工程师能力自我评价表
)

参考资料

原文地址:https://www.cnblogs.com/elevator/p/7788857.html