20155219 《信息安全系统设计基础》课程总结

每周作业链接汇总

第1周作业:针对课本十二章的内容提出自己的问题,并在之后的学习中慢慢思考与解答;温习了相关虚拟机知识。学习了gcc与gdb的使用,熟悉vi的基本操作,熟悉gcc编译器的基本原理,学习使用gcc编译器的常用选项,学习使用gdb调试技术,熟悉makefile基本原理及语法规范,掌握静态库和动态库的生成与调用方法。

第2周作业:完成课堂实践的内容补充

第3周作业:学习了三种数字、进制转换、 gcc -m32 生成32位的代码、字节顺序、逻辑运算和位运算、掩码、0扩展和符号扩展、整数运算溢出、IEEE浮点标准、浮点数运算的不精确性与舍入、 整数与浮点数转换规则

第4周作业:补充完成课上没有完成的内容。
掌握两个重要命令:
man -k key1 | grep key2| grep 2 : 根据关键字检索系统调用
grep -nr XXX /usr/include :查找宏定义,类型定义
完成head,tail的使用,相关API的分析,伪代码,产品代码,测试代码的编写

第5周作业:理解逆向的概念
掌握X86汇编基础,能够阅读(反)汇编代码
了解ISA(指令集体系结构)
理解函数调用栈帧的概念,并能用GDB进行调试

第6周作业:了解异常及其种类
理解进程和并发的概念
掌握进程创建和控制的系统调用及函数使用:fork,exec,wait,waitpid,exit,getpid,getppid,sleep,pause,setenv,unsetenv,
理解数组指针、指针数组、函数指针、指针函数的区别
理解信号机制:kill,alarm,signal,sigaction
掌握管道和I/O重定向:pipe, dup, dup2

第7周作业:了解ISA抽象的作用
掌握ISA,并能举一反三学习其他体系结构
了解流水线和实现方式

第8周作业:掌握三种并发的方式:进程、线程、I/O多路复用
掌握线程控制及相关系统调用
掌握线程同步互斥及相关系统调用

第9周作业:了解常见的存储技术(RAM、ROM、磁盘、固态硬盘等)
理解局部性原理
理解缓存思想
理解局部性原理和缓存思想在存储层次结构中的应用
高速缓存的原理和应用

第10周作业:完成课上测试的可以不写博客(本周因完成课上测试没有博客)
补充完成课上实践内容
完成课下作业并提交博客

第11周作业:理解虚拟存储器的概念和作用
理解地址翻译的概念
理解存储器映射
掌握动态存储器分配的方法
理解垃圾收集的概念
了解C语言中与存储器有关的错误

第12周作业:试题总结,博客改进(没有博客)

第13周作业:找出全书你认为最重要的一章,深入重新学习一下。

第14周作业:找出全书你认为学得最差的一章,深入重新学习一下。

第15周作业:课程总结

实验报告链接汇总

实验一 开发环境的熟悉

简要内容:

熟悉Linux开发环境,学会Linux开发环境的配置和使用,使用Linux的arm编译,使用基于NFS方式的下载调试,了解嵌入式开发的基本过程。

实验二 固件开发

简要内容:

学习、读懂02_pthread、03_tty中的代码,配置实验环境完成实验指导书中的实验2、3。

实验三 实时系统的移植

简要内容:

根据实验指导书进行实时软件的安装(ADS、GIVEIO驱动、JTAG驱动),配置实验环境并对软件进行测试,运行测试程序。

实验四 驱动程序设计

简要内容:

1)学习资源中全课中的“hqyj.嵌入式Linux应用程序开发标准教程.pdf”中的第十一章

2)提交康奈尔笔记的照片

1)在Ubuntu完成资源中全课中的“hqyj.嵌入式Linux应用程序开发标准教程.pdf”中的第十一章的test试验

2)提交编译,加载模块,卸载模块,测试运行的截图(要多张,全屏,体现学号信息)

实验五 网络通信

简要内容:
安装OpenSSL环境,并编写测试代码验证无误

研究OpenSSL算法,测试对称算法中的AES,非对称算法中的RSA,Hash算法中的MD5

在Ubuntu中实现对实验二中的“wc服务器”通过混合密码系统进行防护

代码托管

  • 链接20155219付颖卓代码托管

  • 代码量汇总



  • 代码驱动的学习做到没有?
    做到了。本学期刚开始的时候只是简单地上传了代码,没有分目录,描述也很简单。后来,看了老师发的《代码驱动的学习》博客后,我认识到了代码管理的重要性,之后在老师的引导下慢慢开始对代码进行分析,不懂的地方就通过man -k和grep -nr xxx /usr/include指令进行相关搜索,虽然是英文的,但是那些英语单词一般都能看懂,实在不懂的查一下也就知道了。

  • 加点代码,改点代码是理解的最好方式,谈谈你的心得
    我们看到代码的时候总会下意识的觉得太难懂了,看上去就很难理解,所以从来都是会去躲避学习代码,能不看就不看,能少看就少看,更别提加减代码了。但其实我们静下心去一行行得读下去,就会发现其实并没有很难理解,反而因为能多懂一点而感到开心。当然,我觉得所谓的代码驱动不仅仅是指将代码运行出来就可以了,更加重要的是要去对代码进行分析,真正的读懂代码。一开始我觉得读懂代码应该就是能把代码每一句看懂,然后知道这个代码在做什么,后来我发现做到这个依然是远远不够的,因为就算你看懂了每一句代码,让你重新编一个类似的程序你依然是不会。但是当你真正花了时间去学习,得到的也远比你想象的要多。

  • 实践上有什么经验教训?
    在做实验的时候,经常花了很久改出来的代码还是不能用,还是会出错,这样很打击我的自信心,往往做着做着既不想做了。但在现实中你还是要继续硬着头皮去改正你的错误,我觉得关于实践最重要的一点就是不要怕出错,很多人可能运行代码时一看到错误就会有些慌,不知道应该怎么办。我感觉最有效的办法其实是自己在阅读完代码之后,先想一下可能导致错误的原因是什么,再根据你的想法去进行相应的修改,如果真的和你想的一样,修改完之后能够成功运行,那么你可能也会对自己解决问题的能力有了自信。

回答一下第0周作业中自己提出的总题:

  • 第一章

什么是计算机系统?它包括什么?研究它有什么意义?

答:计算机系统由计算机硬件和软件两部分组成。硬件包括中央处理机、存储器和外部设备等;软件是计算机的运行程序和相应的文档。计算机系统具有接收和存储信息、按程序快速计算和判断并输出处理结果等功能。

  • 第二章

计算机中的数据和平常我们生活中的数据有什么异同?

答:在计算机系统中,各种字母、数字符号的组合、语音、图形、图像等统称为数据,数据经过加工后就成为信息。

  • 第三章

为什么要学习汇编?

答:用高级程序语言编程时,机器屏蔽了程序的细节,抽象级别高,而汇编代码可以很好的规避这一点,帮助我们更好的分析代码中隐藏的低效率。

  • 第四章

ISA是什么?

答:ISA即指指令集架构(Instruction Set Architecture)是与程序设计有关的计算机架构的一部分,包括本地数据类型、指令、寄存器、地址模式、内存架构、中断和意外处理和外部 I/O 。一个 ISA 包括一系列 opcodes(机器语言)的一个规格,本地命令由一个特定的 CPU 设计来实现。

  • 第五章

如何优化程序性能?

答:第一,消除不必要的内容,包括函数调用、条件测试和存储器引用。第二,利用处理器提供的指令级并行能力,同时执行多条指令。

  • 第六章

存储系统层次结构分为什么?

答:高速缓冲存储器、主存储器、辅助存储器。

  • 第七章

链接是如何进行的?

答:将各种代码和数据部分收集起来并组合成为一个单一文件,由链接器自动执行。

  • 第八章

常见异常怎么解决?

答:

1.使用标准C库提供了abort()和exit()两个函数,它们可以强行终止程序的运行,其声明处于<stdlib.h>头文件中。
2.使用assert(断言)宏调用,位于头文件<assert.h>中,当程序出错时,就会引发一个abort()。
3.使用errno全局变量,由C运行时库函数提供,位于头文件<errno.h>中。
4.使用goto语句,当出错时跳转。
5.使用setjmp,longjmp进行异常处理。
  • 第九章

虚拟存储器如何工作?它有什么特性?

答:虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。

  • 第十章

Unix I/O是什么?

答:Unix下共有五种I/O模型

a. 阻塞I/O 
b. 非阻塞I/O 
c. I/O复用(select和poll) 
d. 信号驱动I/O(SIGIO) 
e. 异步I/O(Posix.1的aio_系列函数) 
  • 第十一章

网络编程步骤?

答:客户端:

1、通过socket函数获取一个socket文件描述符。程序通过这个文件描述符与内核的tcp/ip架构通讯联系。

2、通过该描述符请求与服务器的连接(connect函数),此时需要事先知道服务器的ip和服务器上的应用程序的端口

3、当connect函数成功返回,则表示连接达成,则可通过该文件描述符或者recv,send该文件描述符,即可实现与某服务器端的通信

服务器端:

1、通过socket函数获取一个socket文件描述符。程序通过这个文件描述符与内核的tcp/ip架构通讯联系。

2、绑定端口(bind函数),端口人为设置,本机IP自动获取即可(端口和IP设置通过sockaddr_in结构体实现)。

3、监听socket函数返回文件描述符(listen函数)

4、当listen函数返回时,表示有请求,则使用accept获取请求,accept函数产生一个新的文件描述符,用于和该请求通信。

5、读写该文件描述符或者recv,send该文件描述符,即可实现与某客户端的通信

6、服务器端还可以继续监听socket文件描述符,接受其他端口的请求
  • 第十二章

并发编程是什么?

答:并发编程是指在一台处理器上“同时”处理多个任务。并发是在同一实体上的多个事件。多个事件在同一时间间隔发生。

你有什么项目被加分,谈谈你的经验

  • myod的改进

  • pwd的简单实现

  • ch06课上测试题目补做

  • mybash的简单实现

  • 第八周课下作业

你有什么项目被扣分,谈谈你的教训

无扣分项目。

课程收获与不足

自己的收获(投入,效率,效果等)

  • 在这学期的学习中,我清晰的感受到了效率、投入的重要性。刚开始,可能是由于刚过完假期,我一直不太能进入状态,效率很低,收获也寥寥无几,感觉老师的要求太多了,而自己却完全觉得是在浪费时间。后来,我逐渐进入了状态,学习效率大大提高,也更加能体会到老师的每一项要求的意义所在,于是,读书、理解、做练习题,读代码、理解、编译运行,这一个体系下来,觉得自己对于这门课的知识得到了掌握,而使用的时间也没有比之前更长。

  • 老师不断的在强调让我们使用man -k和grep指令去检索系统调用以及查询宏定义,不得不说现在我感觉自己的搜索能力得到了很大的提高。

  • 这个学期深入理解计算机系统的学习更像是把之前两年所学的知识重新串联了一遍,重新复习了计算机导论、汇编、c语言的相关知识,在复习旧的知识同时,又掌握了许多新的知识和技巧,感觉自己对知识的理解有了更深的认识。

自己需要改进的地方

争取进入状态更快,我进入状态慢可能是自身的问题,所以,我觉得我应该在假期的末尾就开始逐渐开始读书,这样可以早日进入状态。多读书读好书,利用自己的空闲时间来读一些好书来丰富自己的内在修养,而不是整天刷手机。

给学弟学妹们的学习建议

  • 如果重新学习这门课,怎么做才可以学的更好

我觉得我的最大问题就是进入学习应有的状态太慢了,我最开始的几周学习效率太低,每周的博客都要做很久很久,收获却不大。如果重新学习的话,我应该想办法让自己尽快进入这种学习模式,尽量从假期进入到学习中去,提高学习效率。

分配好学习时间,尽量把学习任务平铺开,每天学一部分,周末时间多的话可以多学一点,但是不要把所有的任务都留在最后一天,这样会给自己造成很大压力。

问卷调查

  • 你平均每周投入到本课程多长时间?

20小时左右,平时课下有时间就看看书、画下来重点,周末把它们总结成一篇博客,并进行实践操作。

  • 每周的学习效率有提高吗?

相比于刚开学有了很大提高。

  • 学习效果自己满意吗?

刚开学的几周很不满意,觉得自己效率太低,学了很长时间却收获很小。后来逐渐进入了学习状态,学习效率提高了,在加上有之前知识做基础,学习效果相对来说较为满意。

  • 课程结束后会继续一周至少一篇博客吗?(如果能做到,毕业时我把你的博客给你集结成一本书)

我很希望自己能保持这个习惯,也会努力去做到。

  • 你觉得这门课老师应该继续做哪一件事情?

每周写博客,多理解、运行代码,期末总结,实验闭卷考试,上课讲解一些必要内容。

  • 你觉得这门课老师应该停止做哪一件事情?

感觉所有项目都有其存在的价值和意义,并且都是经过老师深思熟虑与反复斟酌筛选的,没有什么应该停止的。

  • 你觉得这门课老师应该开始做什么新的事情?

多与同学进行沟通,由此来知道自己做的有什么不足,来尽快改正,让同学有更好的学习条件。

  • 本学期你与老师和同学交互最多的一篇博客是哪篇?
    myod的实现
  • 本学期被阅读最多的博客是哪一篇?有何经验

实践题目实现od命令
这篇是本学期的第一篇实践题目博客,我写的比较详细,花了比较多的时间去写,之后还有一篇是改进版,也得到了加分,在此也给出链接。经验就是只要努力去学一定可以学会,并且得到回报。

期末总结博客链接

[期末总结博客链接](http://www.cnblogs.com/paypay/p/8124040.html