20155322 2017-2018-1《信息安全系统设计基础》课程总结
2017-2018-1 《信息安全系统设计基础》 20155322 课程总结
[博客目录]
一、每周作业链接汇总
第一周作业
- 在Linux环境下C语言程序的gcc编译运行汇编方法,使用gdb进行调试、设置断点等方法。
第二周作业:
- 有关设置gdb断点,建立静动态库等课上未提交的题目补充,以及自主编程制作MYOD的实现。
第三周作业:
- 教材内容第二章《信息的表示和处理》的自主学习,教材内容总结,以及教材和代码学习中遇到的问题和解决。
第四周作业:
- 课上未提交题目命令行传入文件实现myod,第十章教材内容学习以及两个重要命令
man -k key1 | grep key2| grep 2
和grep -nr XXX /usr/include
的掌握。
第五周作业:
- 教材内容第三章《程序的机器级表示》的自主学习,教材内容总结,以及教材和代码学习中遇到的问题和解决。
- Mybash 实现
第六周作业:
- 教材内容第八章《异常控制流》,第十章《系统级I/O》的自主学习,教材内容总结,以及教材和代码学习中遇到的问题和解决。
- 课上有关汇编代码的转换和删除的未提交题目的补充,以及教材 p97 2.96 2.97,完备的测试。
- 课上相关未提交题目的补充,在自己的电脑中完成https://www.shiyanlou.com/courses/231缓冲区溢出漏洞实验的详细实验过程。
第七周作业:
- 教材内容第四章《处理器体系结构》的自主学习,教材内容总结,以及教材和代码学习中遇到的问题和解决。
第八周作业:
- 教材内容第十一章《网络编程》简单过一下,教材第十二章《并发编程》的自主学习,教材内容总结,以及教材和代码学习中遇到的问题和解决。
- 课上有关X86转Y86和代码反汇编的相关未提交题目的补充,以及课下实践书后习题的实践测试和多线程并发服务器的制作与测试。
第九周作业:
- 教材内容第六章《存储器层次结构》的自主学习,教材内容总结,以及教材和代码学习中遇到的问题和解决。
- 加分项目MYPWD的自主设计与编写测试。
- homebrew/pipe学习博客
- homebrew
- pipe
第十周作业:
- 课上未提交题目有关stat指令的学习及编写的提交以及课下自主学习IPC相关知识。
第十一周作业:
- 教材内容第九章《虚拟存储器》的自主学习,教材内容总结,以及教材和代码学习中遇到的问题和解决。
第十三周作业:
- 重新精学第十章,对课本内容反复学习,并且全部家庭作业的编写制作,以及蓝墨云中的试题总结,结对学习,给同伴讲解收获和疑惑,共同学习,共同进步。
第十四周作业:
- 重新精学之前学得最差的一章,第四章处理器系统相关内容,之前学习学习Y86时候没有学的很好,详细重新回顾了课本内容。
二、实验报告链接汇总
实验一 开发环境的熟悉:
交叉编译环境,目标机与宿主机的联通,目标机运行程序以及最后的清理工作,实验一为小组共同完成。
实验二 固件程序设计:
要用系统管理员身分运行uVision4,破解MDK(破解程序中target一定选ARM),KEIL-MDK 中添加 Z32 SC-000 芯片库,打开Z32的电源开关前,按住Reboot按键不放,两次打开电源开关,Z32即可被电脑识别,进行下载调试。网上找一下国密算法标准的代码和标准测试代码,在Ubuntu中分别用gcc和gcc-arm编译,并回答四个算法的用途。小组共同完成。
实验三 实时系统:
基于Linux Socket程序设计实现wc(1),使用多线程实现wc服务器并使用同步互斥机制保证计数正确。个人完成。
实验四 外设驱动程序设计:
学习资源中全课中的“hqyj.嵌入式Linux应用程序开发标准教程.pdf”中的第十一章,在Ubuntu完成资源中全课中的“hqyj.嵌入式Linux应用程序开发标准教程.pdf”中的第十一章的test试验。个人完成。
实验五 通信协议设计:
了解学习Linux下openssl,测试对称算法中的AES,非对称算法中的RSA,Hash算法中的MD5,在Ubuntu中实现对实验二中的“wc服务器”通过混合密码系统进行防护。个人完成。
三、代码托管链接和二维码
-
截图 git log --pretty=format:"%h - %an, %ar : %s" 的结果
-
代码量汇总提交statistics.sh的支持截图
返回目录
四、学期学习整体评价
代码驱动的学习做到没有?
做到了,在每次学习新知识或者出现不理解的地方,都会上网或者看书,查阅相关资料,不断循环这个过程,是的自己对于代码的理解和分析能力进一步增加。
加点代码,改点代码是理解的最好方式,参考编程的智慧,谈谈你的心得
在我学习实现Linux相关命令的时候,开始都是懵懵懂懂的,我摸索着使用老师的man命令学习法,总结出一下学习步骤:
- man命令查看命令的实现函数、结构体等
- 结合网络搜索其代码实现,阅读并理解
- 并在此基础上编写自己需要的代码
- 测试及运行
实践上有什么经验教训
花费时间较多,但是熟练后会比较熟练,同时了解了一些比较好的学习网站和平台。
整体评价一下第1周作业中自己提出的问题是不是抓住了学习重点
在第一周作业中出的问题都是每一章讲解的重点,在每章的学习中都能够解决我的理解问题。
回答一下第1周作业中自己提出的问题
-
第1章 计算机系统漫游:一个程序从编写到执行的过程在计算机中是什么实现的
- 答:经由一下四个部分:
预处理器:根据以#开头的命令,将包含的头文件加载进入源程序源程序。预处理器读取系统头文件stdio.h中的内容,代替此行内容。源程序经过预处理后,得到另一个c程序,此程序通常以.i为后缀保存。
编译器:将预处理后的.i文件转换成汇编程序。编译器将不同的高级语言(如c语言,C++语言)转换成严格一致的汇编语言格式进行输出。汇编语言以标准的文本格式确切的描述每机器语言指令。编译器得到的文件通常以.s为后缀保存。
汇编器:将汇编语言(.s文件)翻译成机器语言指令,并将这些指令打包成一种可定位目标程序格式。汇编后得到的文件即为二进制文件,通常以.o为后缀。
链接器:程序中调用的函数,存放在一个*.o的单独预编译的文件中。而这个文件必须以适当的方式并入到我们的程序中,这个工作由链接器完成。将外部的.o文件并入后,得到一个完整的可执行文件。可执行文件加载到存储器后,由系统复制执行。
- 答:经由一下四个部分:
-
第2章 信息的表示和处理:如何理解计算机的算术运算?
- 答:计算机不能像人一样理解1,2,3,只能借助材料的物理特性通过1、0来进行记录和运算,所以计算机的算术运算其实就是2进制的运算,并通过各种码来表示不同的符号。
-
第3章 程序的机器级表示:如何理解汇编在计算机运算中的地位?
- 答:汇编语言介于机器级代码和高级语言之间,及不会让人觉得迷糊,具有较好的文本格式表达形式,也比较便于计算机的理解和执行,可以说是一个承接两者的中介。
-
第4章 处理器体系结构:为什么要虚构出Y86指令系统?
- 答:Y86指令集的数据类型、指令和寻址方式较少,字节级编码也比较简单。但是它仍然足够完整,能够写一些简单的处理证书的程序,有助于我们理解指令集的原理。
-
第5章 优化程序性能:如何根据处理器的原理优化程序?
- 答:这个问题比较复杂,涉及的知识比较广范,简单的来说,面向处理器结构的优化可以从以下几个方向入手:缓存命中,指令预测,数据预取,数据对齐,内存拷贝优化,ddr访问延迟,硬件内存管理优化,指令优化,编译器优化等级以及性能描述工具。
-
第6章 存储器层次结构:存储器为何要采取这种分层结构?
- 答:为了解决对存储器要求容量大,速度快,成本低三者之间的矛盾,使用分级结构能够降低成本,提高效率,简单的来说就是性价比较高,不会造成过多的资源浪费。
-
第7章 链接:链接的原理及实现
- 答:将各种代码和数据片段收集并组合成为一个单一文件的过程,其实现是在编译过中实现的。
-
第8章 异常控制流:为什么计算机要使用进程这个概念?
- 答:进程是资源分配和调度的基本单位,是OS结构的基础,引入了进程后才使得处理机利用率和内存利用率大大提高。
进程是一个具有独立功能的程序关于某个数据集合的一次运行活动。它可以申请和拥有系统资源,是一个动态的概念,是一个活动的实体。它不只是程序的代码,还包括当前的活动,通过程序计数器的值和处理寄存器的内容来表示。
- 答:进程是资源分配和调度的基本单位,是OS结构的基础,引入了进程后才使得处理机利用率和内存利用率大大提高。
-
第9章 虚拟内存:虚拟内存的优点的?
- 答:
使用虚拟地址可以更加高效的使用物理内存:在访问后边的地址空间的时候就可以将前边当前没有在访问的物理页释放掉,或者交换到硬盘中。这样这个物理页又可以去对应新的虚拟地址,从而使物理内存可以充分的利用。
使用虚拟地址可以使内存的管理更加便捷:在程序编译的时候就会生成虚拟地址,对于不同的机器或者对于同一台机器的不同时间,该虚拟地址可以对应不同的物理页。
可以提高系统安全性:在使用虚拟地址的时候,暴露给程序员永远都是虚拟地址,而具体的物理地址在哪里,这个只有系统才了解。这样就提高了系统的封装性。
- 答:
-
第10章 系统级I/O:C的标准I/O库与Linux 文件I/O的区别?
- 答:
文件I/O:文件I/O称之为不带缓存的IO(unbuffered I/O)。不带缓存指的是每个read,write都调用内核中的一个系统调用。也就是一般所说的低级I/O——操作系统提供的基本IO服务,与os绑定,特定于linix或unix平台。
标准I/O:标准I/O是ANSI C建立的一个标准I/O模型,是一个标准函数包和stdio.h头文件中的定义,具有一定的可移植性。标准I/O库处理很多细节。例如缓存分配,以优化长度执行I/O等。标准的I/O提供了三种类型的缓存。
(1)全缓存:当填满标准I/O缓存后才进行实际的I/O操作。
(2)行缓存:当输入或输出中遇到新行符时,标准I/O库执行I/O操作。
(3)不带缓存:stderr就是了。
- 答:
-
第11章 网络编程:Web服务器是通过什么原理实现的?
- 答:额,这个还是看书吧,一只半会儿说不清楚。
-
第12章 并发编程:指令级并行,线程级并行,数据级并行的区别?
- 答:
指令级并行:是一种隐式并行,通过流水线和超标量,使得一个程序的指令序列中共有多条同时乱序运行,顺序提交。
线程级并行:是一种显示并行,需要写多线程程序,主要指同时多线程(SMT)/超线程(HT)以及多核和多核处理器。
数据级并行:是一种显式并行,主要指单指令多数据(SIMD)
返回目录
- 答:
五、作业评价
你有什么项目被加分,谈谈你的经验
- 这个……不太清楚。
- 经验就是有自己的思考过程和操作实例吧。
你有什么项目被扣分,谈谈你的教训
- 第一周学习博客没有写每章提问
- 教训:学会合理安排时间,每周的东西都要在时间内完成,否则拖到后面会忘记
- 已经补完,并优化了博客内容,新增了内容,改善排版。
六、课程收获与不足
自己的收获(投入,效率,效果等)
- 课本知识
- Linux系统的使用
- 如何学习Linux命令的方法:man
- 嵌入式系统编程
- 网络编程
- 密码算法
- 博客写作习惯
自己需要改进的地方
- 需要学会掌握学习方法
- 合理安排时间
- 更多的代码量
如果有结对,写一下你提供的帮助或接受了什么帮助,并对老师提供参考建议
- 我主要为结对对象讲解代码,让同伴读懂代码,也让我加深对代码的理解
- 我建议老师能够就如何结对学习提供一点参考或者讲解
给开学初的你和学弟学妹们的学习建议
- 勤练习,少哔哔
- 学会自学
- 尽量独立完成
如果重新学习这门课,怎么做才可以学的更好
- 如果重新学习,我会注重系统学习。
- 因为现在回想感觉知识点过于零散,很难糅合在一起。
问卷调查
- 你平均每周投入到本课程多长时间?
平均每周20个小时左右。
- 每周的学习效率有提高吗?
每周学习效率还行,我是一个投入的人,一开始了就很难停下来。
- 学习效果自己满意吗?
学习效果不太满意,因为在查找资料上花费很多时间,感觉自己学习的知识点都是东平西凑,难以整合成系统的知识体系。
- 课程结束后会继续一周至少一篇博客吗?
我平时会使用博客记录我在学习或者使用电脑的一些知识,不能保证每周,但是一个月大概会有两篇这样。
- 你觉得这门课老师应该继续做哪一件事情?
继续给我们推荐好的教学资料以及视频。
- 你觉得这门课老师应该停止做哪一件事情?
目前还算适应,没有什么需要停止的。
- 你觉得这门课老师应该开始做什么新的事情?
在博客方面多和学生互动,及时反馈意见,这样我们才知道怎样才能做得更好。
七、期末总结
结对学习情况
- 结对学习博客
20155302 - 结对感想
我的结对学习对象是一个热爱学习的男生,平时学习认真,经常催促我和他一起学习,我受他影响颇深,也敬佩他的精神。
和他结对学习效果很好,经常点出我平时遗漏或者不关注的地方,查漏补缺,受益颇丰。
学习感想
- 本学期感想:活动多,学习紧,任务重
- 就学习而言,感觉我有两个问题需要注意:
- 一是要学会安排时间,我总是想着找个时间空出来好好学,但是事实证明这是不可能的,永远会有下一件事情等着你做,要学会抽空学,有针对性的学,天天学。
- 二是要学会高效率学习。因为我总是花费大量的时间再搜索资料上,我觉得这样不行,时间宝贵,需要高效。所以我开始总结一些学习方法,比如首先是要把要学的知识理成一个系统,即我要做出这个作业,我需要掌握的东西,这些东西属于哪个领域,学习这个领域的知识需要的基础等等,这样循序渐进的去学习,永远比散漫乱找要高效的多。
学习展望
- 未来要学会学习方法了,不要再瞎摸乱闯。
- 重新学习Java、C语言
- 学习Java web/html/数据库相关知识,做一些小网站
- 学习PS/AI/PR/AE