2017-2018-1 20155306 《信息安全系统设计基础》课程总结
(按顺序)每周作业链接汇总
•第一周作业:学习第一章和第七章。初步了解各种指令来通过原始文件得到二进制文件、文本文件、以及可执行文件。了解到何为链接,如何链接,链接后得到什么。
•第三周作业:学习第二章。了解到三种数字:无符号数、有符号数(2进制补码)、浮点数,以及有符号数和无符号数的相互转换,整数与浮点数的相互转换,IEEE浮点标准。
•第四周作业:学会使用man、grep指令来通过帮助文档了解编写代码所需函数及其头文件、参数等。实现了head、tail的产品代码。
•第五周作业:学习第三章。汇编相关知识,指令集体系结构,函数调用栈帧过程。
•第六周作业:学习第八章,第十章。对异常及其种类、进程及信号的相关函数代码进行分析学习。同时,对I/O主存和外部设备之间拷贝数据的过程进行了学习,包括打开关闭,读写文件以及重定向等。
•第七周作业:学习第四章。理解了Y86指令集体系结构,Y86顺序实现以及Y86模拟器的安装。
•第八周作业:学习第十一章,第十二章。学习了三种并发的方式:进程、线程、I/O多路复用,线程控制及相关系统调用以及线程同步互斥及相关系统调用。
•第九周作业:学习第六章。了解了常见的存储技术(RAM、ROM、磁盘、固态硬盘等)、局部性原理、缓存思想,以及高速缓存的原理和应用。
•第十一周作业:学习第九章。学习了虚拟存储器的概念和作用、地址翻译的概念、存储器映射以及动态存储器分配的方法。
•第十三周作业:深入学习第六章。深入学习了常见的存储技术(RAM、ROM、磁盘、固态硬盘等)以及这些技术在生活中的实际应用和优缺点、局部性原理在存储技术中的应用、缓存思想,以及通过课后习题更加明白高速缓存的相关原理。
•第十四周作业:深入学习第八章。除去学习常见异常的种类,深入学习了进程控制,包括如何创建、终止进程,回收子进程等函数。进程如何接受发送信号,阻塞和解除阻塞信号。
实验报告链接汇总
课堂补充实践链接
•mypwd的实现
学习pwd命令,研究pwd实现需要的系统调用(man -k; grep),写出伪代码,并实现和测试mypwd。
•第8周课上测试+课下实践
基于socket,使用教材的csapp.h和csapp.c,实现daytime(13)服务器(端口我们使用13+后三位学号)和客户端。
•第6周课上测试总结
理解汇编代码中的开关代码,以及函数栈帧的形成和销毁的代码。
•Mybash的实现
使用fork,exec,wait实现mybash,并写出伪代码,产品代码和测试代码。
•第二周课堂测试以及myod的实现
课上实践:gcc编译命令的使用、调试命令的使用,以及静态库和共享库的生成和使用。
Myod的实现:通过编写makefile实现Linux下od -tx -tc XXX的功能。
代码托管链接和二维码:
- 截图 git log --pretty=format:"%h - %an, %ar : %s" 的结果【之前的Virtualbox蓝屏,修不好,所以后面的学习用的是VMware,导致没有Git的完整历史记录】
- 代码量汇总提交statistics.sh的支持截图
- 代码驱动的学习做到没有?
在努力学习着,但是不能说自己做的有多好。在学期初,学习的内容也没有多少代码,还是停留在原原本本敲到电脑上编译运行,出现了问题才会去调试。我记得大概到第四周,有一个关于head、tail的实践,这才真正让我通过查找帮助文档,用命令帮助我查找所需要的函数,函数相关的参数,虽然有些单词不认识,但是谷歌翻译一下,看懂关键部分是没有问题的。同时,遇到不懂的函数调用,也可以通过man 、grep来查询,非常方便实用,是一个非常值得掌握的技能。
- 加点代码,改点代码是理解的最好方式,参考编程的智慧,谈谈你的心得
看到书上的代码,第一反应都是我可以把代码读懂就已经满足了。但是这学期考的实践操作比较多,每次上课都交不上代码,我意识到自己应该改变看书的方法。停留在看懂和自己编代码是两码事。好在这学期相对来说每两周学一章节内容,可以有更多的时间去琢磨代码,通过改变一个或几个语句,结果会有什么变化,和预期是否相同;若不同又是因为什么。出现不能解决的也可以请教我的搭档,及时商量讨论。
- 实践上有什么经验教训
我觉得关于实践重要的是自己平时学习要勇于实践,不要害怕麻烦,不要害怕错误。平时偷得懒,在考试时都可以体现出来。因为测试并不是照搬书本的内容,书本内容要掌握,在测试时才能在有限的时间内利用书本内容做出实践题目。
课上实践做不出来,其实学期初的时候会很不开心,觉得课下还得写博客很麻烦。但后来发现,有时候就算自己课上做出来了,也不是对这个问题完全了解。反而课下的博客让我更加透彻的去了解一个知识点,从分析题意,从题目的某一个命令开始去查资料,不仅可以了解到题目的知识,还可以了解到相关分支的知识。所以,我觉得就算课上做出来,课下也可以再看看相关的内容,不要一旦交了作业就感觉一劳永逸,什么都不再做了。
整体评价一下第1周作业中自己提出的问题是不是抓住了学习重点
有一小部分抓住了重点,整体还是比较基础的问题,现在基本可以解决这些问题了。
回答一下第1周作业中自己提出的问题
1. 怎么得到一个可执行文件,过程是什么?
预处理器通过修改hello.c原始文件,得到hello.i,编译器将文本文件hello.i翻译为文本文件hello.s,汇编器把hello.s翻译成机器语言指令hello.o,是一个二进制文件。最后通过链接器得到hello文件,是一个可执行目标文件。
2.关于计算机内信息具体的处理如何处理,怎么表示?
信息就是“位+上下文”,计算机系统中的所有信息都是以二进制形式存储的,计算机系统规定了三种重要的编码方式:无符号编码、补码编码、浮点数编码。有符号数和无符号数以及整数和浮点数都可以相互转换。
3反汇编是什么?反汇编后,我们可以从中知道什么信息?
编写程序是利用高级语言如C等高级语言进行编程的,然后再经过编译程序生成可以被计算机系统直接执行的文件(机器语言)。反汇编即是指将这些执行文件反编译还原成汇编语言或其他高级语言。但通常反编译出来的程序与原程序会存在些许不同,虽然执行效果相同,但程序代码会发生很大的变化。学习和理解反汇编语言对软件调试、漏洞分析、OS的内核原理及理解高级语言代码都有相当大的帮助。
4.之前只听过X86,那么Y86指令体系具体是什么?
Y86指令是不存在的。IA32指令,也就是“x86”的启发,所假想出来的一种处理器体系结构,与 "x86"相比,Y86指令集的数据类型、指令和寻址方式都要少一些,字节级编码也比较简单。
在Y86当中,寄存器也是有8个,每一个寄存器可以存储一个字,也就是一个32位二进制。条件码是一个一位二进制的寄存器,保存着最近的算术或逻辑运算所造成的影响的信息。PC则是程序计数器,记录当前正在执行的指令的地址。存储器则是一个很大的字节数组,保存着程序和数据,Y86的程序可以使用虚拟地址(类似于数组的下标)来访问存储器,硬件和操作系统会将虚拟地址翻译为实际的地址。
6.高速缓存是怎么运作的?
缓存技术就是采用速度较快但容量较小的存储器来提高速度较慢但容量较大的存储 器的速度。 使用缓存时,必须先查看缓存中是否有需要的项目。如果有,则称之为缓存命中。 如果没有,则称之为缓存失误,这时计算机就必须等待往返一次读取庞大而又缓慢的存储器。 最大的缓存也远远小于庞大的存储区
7.什么是链接,有什么作用?链接器和链接又有什么关联?
链接相当于一个整合,将各部分整合成一个单一的可执行的文件的过程。
链接器(Linker)是一个程序,将一个或多个由编译器或汇编器生成的目标文件外加库链接为一个可执行文件。目标文件是包括机器码和链接器可用信息的程序模块。简单的讲,链接器的工作就是解析未定义的符号引用,将目标文件中的占位符替换为符号的地址。链接器还要完成程序中各目标文件的地址空间的组织,这可能设计重定位工作。
8.如何并发,产生子进程?
进程就是执行的流程活动。关于fork函数,功能就是产生子进程,那么fork产生子进程的表现就是它会返回2次。
9. 虚拟内存的地址映射的两种方式有什么不同?
映射虚拟地址的形式可以分成静态虚拟地址映射和动态虚拟地址映射.所谓静态,就是在OEMAddressTable中定义映射关系或者是OS启动后调用CreateStaticMapping和NKCreateStaticMapping来实现从虚拟地址到物理地址的映射;动态则是通过VirtualAlloc和VirtualCopy(或者调用MmmapIoSpace函数).这两种映射虚拟地址的形式区别在于静态虚拟地址只能由内核使用,用于ISR访问外设存储.而动态虚拟地址可以在应用程序里访问物理地址(比如在驱动中操作寄存器).
10.标准I/O库与Unix I/O有什么区别?
在C程序设计中,经常要用会对文件进行操作,对文件的操作可以使用C语言提供的标准库I/O,也可以使用linux系统的I/O。无论是使用哪一种I/O操作文件,其过程都是一样,打开文件操作文件关闭文件。C标准库操作文件需要依赖文件指针FILE*类型,linux系统API则依赖文件描述符int类型。
1,在linux环境中,C库I/O只能操作普通文件;linux的I/O可以操作所有的文件(普通文件,管道文件,套接字文件等)2,C库I/O既可以文本方式格式化的写入读取文件,也可以采用二进制的方式写入读取文件;Linux的I/O只能以二进制方式写入读取文件。3,在操作文件,读取写入过程中linux中的I/O在速度和性能上优于C库I/O。4,linux文件I/O更偏向于底层,是系统内核实现的,C库I/O是基于系统I/O的基础上,通常一些方法进行封装而成,即C库I/O在实现时调用了系统I/O。
11.服务器和客户端之间如何进行通信?
通过TCP和UDP两种协议实现通信。客户。端:能向服务器发送信息,提出请求。服务务器:能接收客户端发来的请求,并能发送数据给客户端以做出回应。
12.有了多线程,多进程,I/O多路复用又是什么功能应用?
与多线程和多进程相比,I/O多路复用的最大优势是系统开销小,系统不需要建立新的进程或者线程,也不必维护这些线程和进程。主要应用:(1)客户程序需要同时处理交互式的输入和服务器之间的网络连接(2)客户端需要对多个网络连接作出反应(3)TCP服务器需要同时处理多个处于监听状态和多个连接状态的套接字(4)服务器需要处理多个网络协议的套接字(5)服务器需要同时处理不同的网络服务和协议
你有什么项目被加分,谈谈你的经验
- 优秀作业(给出链接和二维码)
•加分题——Mypwd的实现
学习pwd命令,研究pwd实现需要的系统调用(man -k; grep),写出伪代码,并实现和测试mypwd。
•加分题——Mybash的实现
使用fork,exec,wait实现mybash,并写出伪代码,产品代码和测试代码。
- 竞赛
全国密码技术竞赛决赛获得三等奖
课程收获与不足
- 自己的收获(投入,效率,效果等)
在这个学期当中,我觉得很重要的收获就是对man -k和grep指令的使用。老师从始至终不断强调用这两个命令去检索调用编程所需要的函数,从一开始生疏到现在,感觉自己的搜索能力有了很大进步。相比以往编程,不知道自己该用什么函数,只会在百度上搜索我们该用什么函数,大多时候我们得不到自己想要的结果,搜索到的函数也比较局限,不全面。所以强烈建议学弟学妹们从学期一开始就要加强对这两个命令的应用,孰能生巧,最后会发现真的很好用。
- 自己需要改进的地方
觉得自己最需要改进的还是课本上家庭作业的做的不是很多。一般看书的时候只是把例题做了。后来最后两周深入学习两章的时候,发现家庭作业的重要性。家庭作业是对课本重要内容的巩固和深入,题虽然很多但是都是一类型的题有好多道。同样的问题放在不同的代码中去思考分析会有很大收获。而且实际例题会帮助我们更加理解一些书中相对抽象的描述。
- 如果有结对,写一下你提供的帮助或接受了什么帮助,并对老师提供参考建议
平常学习中,同学之间有什么不懂得问题也都是互相帮助。结对更是给人一种责任感和使命感,搭档问我问题,如果我不会,我会有很强烈的想要学会这个知识点,来教会她。还要很明显的是最后两周的学习,很多习题不怎么会做,两个人一起去研究,商量到底怎么去分析,去计算。
所以希望老师以后可以对家庭作业有明确的规定要至少做多少题,或者规定做哪些重要的题。看了50到100多页的课本,我觉得及时练几道题除了巩固知识,还可以真正明白这个知识点是如何在实际中应用。
给开学初的你和学弟学妹们的学习建议
- 如果重新学习这门课,怎么做才可以学的更好
- 从不要想着自己可以应付一学期,踏踏实实跟着老师一步一个脚印走下去,只要认真付出,就会有回报。
- 关注课本例题和家庭作业。看书不明白的时候做题可以帮助自己理解,看明白书做题可以巩固知识。
- 多实践,多去思考。看着老师给的教材学习重点,尽可能的去思考老师提出的问题。
问卷调查
- 你平均每周投入到本课程多长时间?
根据每周的学习内容不同,投入的时间也不同。如果学习课本内容基本在30小时左右。
- 每周的学习效率有提高吗?
到中后阶段,学习效率相对提升。
- 学习效果自己满意吗?
基本满意,除了知识技能,还掌握了自学知识的方法。
- 课程结束后会继续一周至少一篇博客吗?(如果能做到,毕业时我把你的博客给你集结成一本书送给你作纪念)
我觉得博客可以用来记录任何课程学习,如果可以,我会尽量坚持去写。
- 你觉得这门课老师应该继续做哪一件事情?
把期末考试的分数分配到平常一点一滴的的测验中,这样相对来说能能保证学习过程的质量。
上课讲一些重点的,难理解的知识点。
康奈尔笔记继续坚持。因为大家难免有惰性,上课做笔记很大一部分同学不检查笔记,一节课肯定是没有多少收获的,但是一旦记录下来,效果肯定更好。
- 你觉得这门课老师应该停止做哪一件事情?
我觉得每周20几道的课下测试,可以放在上课用短暂的10几分钟来测试。课下测试大家可能会抄答案。
- 你觉得这门课老师应该开始做什么新的事情?
根据每周学习的章节,勾选几道课后的家庭作业必须完成并且在博客体现出来。
- 其他任意发挥