20155232 《信息安全系统设计基础》课程总结
20155232 《信息安全系统设计基础》课程总结
每周作业链接汇总
- 第一周作业:学习课本第一章和第七章内容--预处理 编译 汇编 链接 四者的关系和具体用法,并且对每章提出问题
- 第二周课堂实践补充:gcc测试gdb测试,静态库,共享库的测试,myod实现。
- 第三周学习总结:学习第二章
主要内容就是信息的表示和处理,信息的存储,16进制表示法,寻址,c语言中的运算以及数据的表示。
- 第四周学习总结以及课上myod练习补充博客
- 本周学习第十章和附录A--系统编程错误处理的方式;掌握Unix/Linux系统级I/O: open close read write seek stat和I/O重定向的方法以及myod 实现Linux下od -tx -tc XXX的功能。
-
学习第三章。汇编相关知识,指令集体系结构,函数调用栈帧过程。
-
使用fork,exec,wait实现mybash
-
学习了异常及其种类,理解进程和并发的概念,掌握进程创建和控制的系统调用及函数使用。
-
学习了ISA抽象的作用,掌握ISA,了解流水线。
-
课本第十一章和第十二章内容,网络编程和并发程序。课下补做:完成家庭作业4.47,4.48,4.49,将X86-64汇编翻译成Y86汇编。基于socket 使用教材的csapp.h csapp.c,实现daytime服务器。
-
学习课本第六章:了解常见的存储技术(RAM、ROM、磁盘、固态硬盘等),局部性原理,缓存思想,高速缓存的原理和应用。
-
实现pwd命令
-
第六章内容测试
-
研究Linux下IPC机制:原理,优缺点
-
主要学习第九章:虚拟存储器的概念和作用,地址翻译的概念,存储器映射,动态存储器分配的方法。
-
选择最重要的一章内容学习:我选择第12章主要讲了程序的并发编程,一个并发编程是由在时间上重叠的一组逻辑流组成的。这章主要学习了三种不同的并发机制:进程,I/O多路复用和线程。
-
对学习最差的一章重新学习,我选择第八章异常控制流这里学习。异常控制流-ECF理解ECF将帮助我们理解重要的系统概念。更能帮助理解并发。
实验报告链接汇总
-
开发环境的熟悉
-
简要内容:熟悉linux开发环境,学会使用交叉编译环境。
-
固件程序设计
-
简要内容:安装MDK,JLink驱动,破解MDK,UART,LED,MDK,国密算法。
-
实时系统
-
简要内容:学习使用Linux命令wc(1)
基于Linux Socket程序设计实现wc服务器和客户端。使用多线程实现wc服务器并使用同步互斥机制保证计数正确。
-
外设驱动程序设计
-
简要内容:学习资源中全课中的“hqyj.嵌入式Linux应用程序开发标准教程.pdf”中的第十一章。测试test试验,提交编译,加载模块,卸载模块。
-
通讯协议设计
-
简要内容:OpenSSL的安装与使用。测试对称算法中的AES,非对称算法中的RSA,Hash算法中的MD5。实现对实验二中的“wc服务器”通过混合密码系统进行防护。
二维码:
截图 git log --pretty=format:"%h - %an, %ar : %s" 的结果
代码量汇总提交statistics.sh的支持截图
代码驱动的学习做到没有?
不能说做得很好,但是在学习。刚开始就只是搬运课本上的代码,不求甚解,只为了求代码量,后来发现这样的学习方式没有作用,我记得在管道通信学习那里,会自己尝试编写代码,并且会在网上查询一些相关代码,去学习,发现很多内容都是书上没有的,可以通过这种方式学到。并且在每周的课堂实践练习的过程中,逐渐有意识的学会查看帮助文档,用命令帮助查找所需要的函数和函数相关的参数,在这个过程中,也学习了很多英语单词。
加点代码,改点代码是理解的最好方式,参考编程的智慧,谈谈你的心得
在实践了代码的基础上,再对代码进行一些修改就更能让自己深入的理解代码了。比如在学习线程的时候,我刻意地加上一些线程或者减少一些线程就会发现程序运行的结果是不同的。修改代码也会让学代码变成一件有趣的事情。这是看懂并运用所学代码的最好方式,实践出真知,只有自己不断的试与探索才可以真正转化为自己的知识。
实践上有什么经验教训
实践的时候要记着做一些准备,万一代码被修改或者不小心更改就会运行不出来,所以要有备份,并且要记着保存文档以免数据不幸丢失降低效率。而且还很重要的是要勇于实践。在平常测试的时候都是直接编写代码,对于平常学习只是看课本,是不够的。所以要多动手编写代码。
整体评价一下第1周作业中自己提出的问题是不是抓住了学习重点
当时只是粗略的浏览这本书,所以只有一小部分抓住了重点,、其余都是很基础的问题。
回答一下第1周作业中自己提出的问题
1.编译器如何运行工作?
源码要运行,必须先转成二进制的机器码。这是编译器的任务。预处理之后,编译器就开始生成机器码。对于某些编译器来说,还存在一个中间步骤,会先把源码转为汇编码(assembly),然后再把汇编码转为机器码。这种转码后的文件称为对象文件(object file)。
对象文件还不能运行,必须进一步转成可执行文件。编译器的下一步工作,就是把外部函数的代码(通常是后缀名为.lib和.a的文件),添加到可执行文件中。这就叫做连接(linking)。下一步,必须将可执行文件保存到用户事先指定的安装目录。表面上,这一步很简单,就是将可执行文件(连带相关的数据文件)拷贝过去就行了。但是实际上,这一步还必须完成创建目录、保存文件、设置权限等步骤。这整个的保存过程就称为"安装"(Installation)。
可执行文件安装后,必须以某种方式通知操作系统,让其知道可以使用这个程序了。
2.计算机的表示法是用有限数量的位来对一个数字编码,当运算结果太大导致溢出时会出现什么后果?
计算机的表示法是用有限数量的位来对应一个数字编码,当结果太大不能表示时就会发生溢出。人为的溢出是有一定企图的,攻击者写一个超过缓冲区长度的字符串,植入到缓冲区这时可能会出现两种结果:一是过长的字符串覆盖了相邻的存储单元,引起程序运行失败,严重的可导致系统崩溃;另一个结果就是利用这种漏洞可以执行任意指令,甚至可以取得系统root特级权限。
3.能否在c中插入汇编代码?具体是什么方法?
由于C语言在定时方面的缺陷,在某些场合下,C程序中需要嵌入汇编代码,以弥补C的缺陷。通常,在C语言程序中嵌入汇编的方法,无外乎两种 。在C程序中填入#asm和#endasm的编译命令,在之中填入汇编代码。 编写汇编函数,通过链接定位器和特殊的编译方式链接方式加入到 所有程序的目标代码中。
4.存储器的层次结构是怎样的?
存储器系统是一个由具有不同容量,不同成本,不同访问时间的若干存储设备组成的层次结构,从上到下依次是:寄存器,高速缓存存储器,主存,硬盘,网络文件。层次越高,容量越小,成本越高,访问时间越短,高层的存储设备是底层存储设备的缓存区。这样,一个编写良好的程序总是倾向于频繁的访问某一个层次上的存储设备。这样,整体效果就是一个大的存储池,其单位成本与最底层的存储设备相当,但是访问速度却可以达到最高层的存储设备。
5.在程序优化的过程中,程序员应该考虑哪些?
1. 掌握常用的高效的数据结构和算法。 至少要熟悉模板的使用。
2.消除循环的低效率, 尽量减少循环次数。 尽量不要在循环里 循环计算一些不会改变的值。
3.消除不必要的存储器引用。 尽量使用临时变量来暂存要多次使用的引用值,避免寻址开销。
4.防止寄存器溢出。 临时变量也并不是越多越好,因为寄存器总是有限的,如果需要同时使用的临时变量数超过了可用的寄存器数量,编译器会把临时值存放到栈中。 一旦出现这种情况,性能会急剧下降。
5.循环展开。通俗的说就是利用分治的策略来减小循环的迭代次数。
6.提高并行性。大多数情况下,程序的代码都不是按部就班的一步一步从上往下执行的,它会适当的并行一些不相依赖的代码行。所以尽量编写不相依赖的代码,能够提高运行效率。
7.编写利于分支预测的代码。 在 CPU执行分支时,会预测程序朝哪一个分支方向执行。
6.存储器山具体指什么,有什么功能?
存储器山是一种综合研究存储器层次结构的工具。它反映了存储器层次结构中不同层次的带宽。也反映了具有不同的时间局部性与空间局部性的程序的性能。通过分析存储器山的数据,还可以看出存储器系统的部分硬件参数。
7.学习链接的知识有什么用途?
一个函数或变量的声明,实际上就是在向 C 编译器承诺:这个函数或变已在程序中的别处定义了,而链接器的工作就是兑现这一承诺。
参考此篇文章更能理解透彻之间的关系:
8.异常处理具体如何实现,会发生什么情况?
,异常都被认为是一种很优雅的处理错误的机制。我们可以使用c语言中强大的setjmp和longjmp函数实现异常处理机制。异常处理的核心思想是,把功能模块代码与系统中可能出现错误的处理代码分离开来,以此来达到使我们的代码组织起来更美观、逻辑上更清晰,并且同时从根本上来提高我们软件系统长时间稳定运行的可靠性。首先设置一个跳转点(setjmp() 函数可以实现这一功能),然后在其后的代码中任意地方调用 longjmp() 跳转回这个跳转点上,以此来实现当发生异常时,转到处理异常的程序上。
9.内存泄露和内存溢出有何不同??
内存泄漏也称作“存储渗漏”,用动态存储分配函数动态开辟的空间,在使用完毕后未释放,结果导致一直占据该内存单元。直到程序结束。有人比喻是“操作系统可提供给所有进程的存储空间正在被某个进程榨干”,最终结果是程序运行时间越长,占用存储空间越来越多,最终用尽全部存储空间,整个系统崩溃。所以“内存泄漏”是从操作系统的角度来看的。这里的存储空间并不是指物理内存,而是指虚拟内存大小,这个虚拟内存大小取决于磁盘交换区设定的大小。由程序申请的一块内存,如果没有任何一个指针指向它,那么这块内存就泄漏了。
内存溢是指在一个域中输入的数据超过它的要求而且没有对此作出处理引发的数据溢出问题,多余的数据就可以作为指令在计算机上运行。通常在运行大型软件或游戏时,软件或游戏所需要的内存远远超出了你主机内安装的内存所承受大小,就叫内存溢出。此时软件或游戏就运行不了,系统会提示内存溢出,有时候会自动关闭软件,重启电脑或者软件后释放掉一部分内存又可以正常运行该软件或游戏一段时间。
10.系统级I/O重定向是如何工作的?
所谓I/O重定向简单来说就是一个过程,这个过程捕捉一个文件,或者命令,程序,脚本,甚至脚本中的代码块(codeblock)的输出,然后把捕捉到的输出,作为输入发送给另外一个文件,命令,程序,或者脚本。如 果谈到I/O重定向,就涉及到文件标识符(File Descriptor)的概念,在Linux系统中,系统为每一个打开的文件指定一个文件标识符以便系统对文件进行跟踪,文件标识符是一个数字,不同数字代表不同的含义,默认情况下,系统占用了3个,分别是0标准输入(stdin),1标准输出(stdout),2 标准错误(stderr),另外3-9是保留的标识符,可以把这些标识符指定成标准输入,输出或者错误作为临时连接。通常这样可以解决很多复杂的重定向请求。
11.HTTP事务具体包含了什么内容?
域名解析 --> 发起TCP的3次握手 --> 建立TCP连接后发起http请求 --> 服务器响应http请求,浏览器得到html代码 --> 浏览器解析html代码,并请求html代码中的资源(如js、css、图片等) --> 浏览器对页面进行渲染呈现给用户
12.如何构造并发程序?
基于进程的并发编程:构造并发编程最简单的方法就是用进程,使用那些很熟悉的函数,像fork、exec和waitpid。
基于I/O多路复用的并发编程:面对困境——服务器必须响应两个互相独立的I/O事件:网络客户端发起的连接请求。用户在键盘上键入的命令 ,解决的办法是I/O多路复用技术。基本思想是,使用select函数,要求内核挂起进程,只有在一个或多个I/O事件发生后,才将控制返回给应用程序。可以使用select、poll和epoll来实现I/O复用。
基于线程的并发编程:在使用进程并发编程中,我们为每个流使用了单独的进程。内核会自动调用每个进程。每个进程有它自己的私有地址空间,这使得流共享数据很困难。在使用I/O多路复用的并发编程中,我们创建了自己的逻辑流,并利用I/O多路复用来显式地调度流。因为只有一个进程,所有的流共享整个地址空间。而基于线程的方法,是这两种方法的混合。线程就是运行在进程上下文的逻辑流。线程由内核自动调度。每个线程都有它自己的线程上下文,包括一个唯一的整数线程ID、栈、栈指针、程序计数器、通用目的寄存器和条件码。所有的运行在一个进程里的线程共享该进程的整个虚拟地址空间。基于线程的逻辑流结合了基于线程和基于I/O多路复用的流的特性。同进程一样,线程由内核自动调度,并且内核通过一个整数ID来标识线程。同基于I/O多路复用的流一样,多个线程运行在单一进程的上下文中,因此共享这个线程虚拟地址空间的整个内容,包括它的代码、数据、堆、共享库和打开的文件。
你有什么项目被加分,谈谈你的经验
经验不仅要对书上的代码进行实践,还要自己进行拓展,上网搜索资料进行深入学习。
你有什么项目被扣分,谈谈你的经验
无扣分项目
课程收获与不足
- 自己的收获
和比上个学期,我每周投入在课程学习上的时间多了许多,而且本学期代码也比上学期多,编程实践更主动了一些。每周老师发布学习任务之后,就会先大概地、看一下学习内容是什么,事先做好规划,每天都学一点,不把博客拖到周日在写,每天都会传一些代码。有时候课上没有完成的实践内容,课下去补充的时候,反而会觉得学习到了更多,因为时间会更充分,可以上网多查询一些相关的资料,多扩展一些,多深入学习一些,而不是只停留在表面,为了去完成任务而完成任务。
在一整个学期的学习中,我最大的收获应该是学习方法。不会再像以前,每次因为要写博客就很抓狂,现在好像已经习惯了这种学习方式,对自主学习的能力提高了很多,不是只停止于完成作业去完成作业,而是会进行深一步的学习。如果遇到问题,也会先尝试自己解决,再求助同学或者老师,自己上网搜索看是否别人也和我遇到了同样的问题,查看解决方法自己尝试着解决。每次上课老师都会强调
man -k
和
grep
命令,刚开始觉得不以为然,后面在学习的过程中发现这两个命令出奇的好用,在每次遇到不认识的函数或者系统调用的时候,都可以查看他的API进行学习,非常方便,也提高了英语单词饿词汇量,很多单词不认识,在查过中文意思之后,就会有意识的去记忆。
- 自己需要改进的地方
有时候在学习的时候,容易走神,然后会去干一些别的事情,导致原本计划的一些事情没有在规定时间内做完,就会拖延,然后影响后面的一些计划,所以要改掉这个坏毛病,养成专心致志做一件事情,并且同样的时间高效率的完成。
- 给学弟学妹们的学习建议
首先应该是勇于实践。刚开始在接触这种自学方法的时候很不适应,很多东西都无法自己独立的去完成,在这个过程中慢慢就会养成自己动手实践去解决的能力,在这个过程中,会遇到很多问题,但是正是因为这些问题,才会让你记忆深刻,达到学习的目的。其次就是应该合理分配时间,每天有计划的去学习,而不是周末才想起来去补博客。
- 如果有结对,写一下你提供的帮助或接受了什么帮助,并对老师提供参考建议
本学期有结对学习,在学习的过程中,遇到问题可以两个人一起讨论并解决,这个学习的氛围是相对轻松的,更有助于增加学习的动力。
- 如果重新学习这门课,怎么做才可以学的更好
提高自己的效率和有计划有安排的去学习。效率高无外乎就是在你去完成一个事情的时候是全身心投入的,只有这样才可以完成的又快又好。
问卷调查
- 你平均每周投入到本课程多长时间?
20多个小时左右,这些时间就是先看课本内容,然后总结课本内容写到博客的知识总结部分,然后对课本上的代码进行运行调试,总结出现的问题并找到解决办法,最后在做课本习题进行课外拓展。
- 每周的学习效率有提高吗?
前面几周的学习效率不高,因为在最初接触这个新的学习内容的时候,有些疑惑,不知道从哪里下手,在后面就很熟悉了。效率慢慢就在提高了。
- 学习效果自己满意吗?
比较满意,如果能减少一些学习中的惰性就更好了。
- 课程结束后会继续一周至少一篇博客吗?(如果能做到,毕业时我把你的博客给你集结成一本书送给你作纪念)
我会去尝试,因为这是一个很好的习惯。
- 你觉得这门课老师应该继续做哪一件事情?
继续讲解课本内容,并且每过一段使劲就进行一次考核。
- 你觉得这门课老师应该停止做哪一件事情?
没有什么应该停止的,因为都安排的很合理妥当。
- 你觉得这门课老师应该开始做什么新的事情?
新的事情就是讲一些错题吧,或者对实验的项目进行提前的预习或者材料的讲解,能够帮助我们在做实验的时候更好的去理解。
本文链接
http://www.cnblogs.com/lsqsjsj/p/8127814.html
二维码