2017-2018-1 20155202 《信息安全系统设计基础》第7周学习总结
教材学习内容总结
并发编程:
- 模块:.c文件
- 程序级编程:进程
- 函数级编程:线程
- POSIX规范:int sum(int a;int b;int *sum); *sum=a+b; 输入输出都在接口中
- Unix规范: int sum(int a;int b); sum=a+b; return sum; 输入在接口中
- void * 指针 :万能指针
- 互斥:一个资源多个人想用
- 同步:有多个资源多人用
第四章:
- 15个程序寄存器:%rax、%rcx、%rdx、%rbx、%rsp、%rbp、%rsi、%rdi、%r8-%r14。每个程序寄存器存储一个64位的字。%rsp被入栈、出栈、调用和返回指令作为栈指针。
- Y86-64指令集基本上是x86-64指令集的一个子集。它只包括8字节整数操作,寻址方式较少,操作数也较少,如图为其指令的描述:
- 每条指令的第一个字节表明指令的类型。这个字节分为两个部分,每部分4位:高4位是代码部分,低4位是功能部分。功能值只有在一组相关指令共用一个代码时才会有用。
- 指令的字节级编码规则:每条指令的第一个字节表明指令的类型。分为两个部分,高4位是代码部分,低4位是功能部分。代码值为0~0xB,功能值只有在一组相关指令共用一个代码时才有用。
movq指令分成了4个不同的指令:irmovq、rrmovq、mrmovq和rmmovq。分别显示地指明源和目的的格式: - 1.源操作数:立即数(i)、寄存器(r)或内存(m)。
- 2.目的操作数:寄存器(r)、内存(m)。
- 7个跳转指令:jmp、jle、jl、je、jne、jge、jg。
- 6个条件传送指令:cmovle、cmovl、cmove、cmovne、cmovge、cmovg。
- 一个处理器支持的指令和指令的字节级编码称为它的指令集体系结构ISA,ISA在编译器编写者和处理器设计人员之间提供了一个概念抽象层,编译器编写者只需知道允许哪些指令,以及它们是如何编码的;而处理器设计者必须建造出执行这些指令的处理器。
- Y86-64处理命令各阶段操作
- 1、取指:取指阶段从存储器读取指令字节,地址为程序计数器PC的值
- 2、译码:译码阶段从寄存器文件读入最多两个操作数
- 2、执行:在执行阶段,算数/逻辑单元要么根据ifun的值执行指令指明的操作,计算机存储器引用的有效地址,要么增加或减少栈指针
- 4、访存:访存阶段可以将数据写入存储器,或从存储器读出数据
- 5、写回:写回阶段最多可以写两个结果到寄存器文件
- 6、更新PC:将PC设置成下一条指令的地址
教材学习中的问题和解决过程
(一个模板:我看了这一段文字 (引用文字),有这个问题 (提出问题)。 我查了资料,有这些说法(引用说法),根据我的实践,我得到这些经验(描述自己的经验)。 但是我还是不太懂,我的困惑是(说明困惑)。【或者】我反对作者的观点(提出作者的观点,自己的观点,以及理由)。 )
-
问题1:SEQ是什么?
-
问题1解决方案:
-
SEQ是 Sequential CPU的实现,表现在指令的执行要依次经历各个阶段(Fetch->Decode->Execut->Memory->WriteBack->PC Update).每一个指令在一个时钟周期内完成
-
问题2:如何将一个字节序列转变成汇编代码?
-
问题2解决方案:我的理解是:汇编代码最左边是地址序列,所以一定要有首地址,然后根据表格规则 去寻找指令对应的格式,例如 练习题4.1中 irmovl $15,%ebx,根据指令描述
-
确定指令格式,开头为30F,然后看寄存器为%ebx,则对应数字3,所以为30F3,最后数字15的16进制输出为0x0000000f,根据小端原则汇编代码反过来写0f000000,所以完整汇编代码为30f30f000000,加上句首地址,为0x100: 30f30f000000
代码调试中的问题和解决过程
-
问题1:多线程编译时候线程间工作时间顺序?还有
pthread_join
函数中*retval指针返回值是什么? -
问题1解决方案:我编了一个多线程程序来直观表现:
由此看出线程之间执行顺序随机,每次变化不一样,pthread_join函数中*retval指针返回指向存储线程返回值的变量,如果成功返回,返回0,否则返回errcode
- 测试代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#define NLOOP 50
int counter;
void *doit( void * );
int main(int argc, char **argv)
{
pthread_t tidA, tidB;
pthread_create( &tidA ,NULL, &doit,(void *)"衛彥忻
");
pthread_create( &tidB ,NULL, &doit,(void *)"張旭");
pthread_join( tidA, NULL );
pthread_join( tidB, NULL );
return 0;
}
void * doit( void * vptr)
{
int i, val;
for ( i=0; i<NLOOP; i++ ) {
//val = counter++;
//printf("%x: %d
", (unsigned int) pthread_self(), val + 1);
//counter = val + 1;
printf("%s",vptr);
}
}
- 问题2:如何查看Y86-64汇编代码?
- 问题2解决方案:
安装一个Y86模拟器
一、下载Y86模拟器
二、安装词法分析工具
- 在终端输入
sudo apt-get install bison flex
三、安装Tcl/Tk 支持图形界面
继续输入:
sudo apt-get install tcl8.5-dev tk8.5-dev tcl8.5 tk8.5
四、解压sim.tar压缩包
- 终端输入:tar xf sim.tar
- 修改mkaefile文件(sim文件夹下) 用文档方式打开
- GUIMODE=-DHAS_GUI
- TKLIBS=-L/usr/lib/ -ltk8.5 -ltcl8.5
- TKINC=-I/usr/include/tcl8.5
五、编译
- 进入sim目录:cd sim
- 在sim目录下终端输入:make clean
- 在sim目录下终端输入:make
六、运行图形界面 - 以pism为例
- 进入pipe目录:cd pipe
- 运行图形界面:
./psim -t -g ../y86-code/asum.yo
进入Y86-code 测试一下是否可以使用
perfect,可以了
代码托管
本周结对学习情况
其他(感悟、思考等,可选)
- 这周学习处理器体系结构使我对处理器的工作原理理解又进了一步,让我知道了处理流程6个阶段:
取指——译码——执行——访存——写回——更新PC
加强了我对操作系统的兴趣。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第七周 | 1700/2000 | 10/9 | 30/20 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:15小时
-
实际学习时间:20小时
-
改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)