posts - 63, comments - 82, trackbacks - 0, articles - 0
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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

Posted on 2017-12-29 09:06 20155217杨笛 阅读(...) 评论(...) 编辑 收藏

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

每周作业链接汇总

第一周作业

  • 内容总结:
  1. 计算机系统是由硬件和软件组成的,操作系统内核是应用程序和硬件之间的媒介。提供三种基本抽象:1)文件是对I/O设备的抽象;2)虚拟内存是对主存和磁盘的抽象;3)进程是处理器、主存和I/O设备的抽象。
  2. 链接可以在编译时由静态编译器完成,也可以在加载时和运行时由动态链接器完成。
  3. 链接器的两个主要任务是符号解析重定位,符号解析将目标文件中的每一个全局符号都绑定到一个唯一的定义,而重定义确定每一个符号的最终内存地址,并修改对那些目标的引用。
  4. 静态链接器将多个可重定位目标文件合并成一个单独的可执行的目标文件。多个目标文件可以被链接到一个单独的静态库中。加载器将部分链接的可执行文件映射到内存,然后调用动态链接器,通过加载共享库重定位程序中的引用来完成链接任务。同时为了加载,链接和访问共享库的函数和数据,应用程序可以在运行时使用动态链接库。
  • 二维码

第二周作业

  • 内容总结
  1. 使用C语言完成od命令的功能。
  2. 完成课上没有完成的内容。
  • 二维码

第三周作业

  • 内容总结
  1. 无符号编码表示大于或等于0的数字。补码编码是表示有符号整数最常见的方式,有符号整数是可以为正或为负的数字。浮点数编码是表示实数的科学计数法的以2为基数的版本。大多数64位机器可以运行32位机器编译的程序。
  2. 逻辑运算认为所有非零的参数都表示true,而参数0表示false。他们返回0或1,分别表示结果为true或false。而按位运算只有在特殊情况下,也就是参数被限制为0或1时,才和与其对应的逻辑运算有相同的的行为。
  3. 处理同样字长的有符号数和无符号数之间相互转换的一般规则:1)数值可能会改变,但是模式不变。2)c语言允许无符号数和有符号数之间的转换。转换的原则是底层的位表示不变。3)当从无符号数转换为有符号数时,效果是应用函数U2T,从有符号数转化为无符号数时,应用函数T2U,其中w表示数据类型的位数。4)负数和正数相等的情况:u=2147483648 =-2147483648(当输出分别为无符号形式和有符号形式时)
  4. IEEE浮点数表示:V = (-1)^s * M * 2^E.
  5. 浮点运算中浮点加法不满足结合性、满足单调性。浮点乘法不满足结合性、满足单调性,在加法上不满足分配性。
  • 二维码

第四周作业

  • 内容总结
  1. 输入、输出是在主存和外部设备之间拷贝数据的过程。输入操作是从I/O设备拷贝数据到主存,输出操作是从主存拷贝数据到I/O设备
  2. open函数将filename转换为一个文件描述符,并且返回描述符数字。应用程序是通过分别调用read和write函数来执行输入和输出的。
  3. 应用程序能够通过调用stat和fstat函数来检索文件信息(元数据)
  4. Unix外壳提供了I/O重定向操作符,允许用户将磁盘文件标准输入输出联系起来。标准I/O库将一个打开的文件模型化为一个流,一个流就是一个指向FILE类型的结构指针。每个ANSIC程序开始都有三个打开的流stdin、stdout和stderr,分别对应于标准输入、标准输出、标准错误
  5. 完成head,tail的使用,相关API的分析,伪代码,产品代码,测试代码的编写
  • 二维码

第五周作业

  • 内容总结
  1. 栈的特点:1)遵循后进先出的原则;2)push压栈,pop出栈;3)总是从栈顶插入和删除元素;4)栈顶元素的地址是最低的;5)栈指针%esp保存着栈顶元素的地址
  2. 将有效地址写入目的操作数,目的操作数必须是寄存器
  3. 机器用来传递过程参数、存储返回信息、保存寄存器用于以后恢复,以及本地存储。为单个过程分配的那部分栈称为栈帧。最顶端的栈帧以两个指针界定,寄存器%ebp为帧指针,寄存器%esp为栈指针。
  4. call指令、ret指令、leave指令用于转移控制。
  • 二维码

第七周作业

  • 内容总结
  1. Y86包括定义各种状态元素、指令集和它们的编码、一组编程规范和异常事件处理。Y86指令和IA32代码的主要区别在于,它可能需要多条指令来执行一条IA32指令能完成的所有功能。Y86程序中的每条指令都会读取或修改处理器状态的某些部分。具体包括:8个程序寄存器3个条件码ZF\SF\OF程序计数器(PC)。Y86用虚拟地址引用存储器位置。程序状态的最后一个部分是状态码Stat,它表明程序执行的总体状态
  2. 指令编码中高4位是代码部分,低4位是功能部分,功能只有在一组相关指令共用一个代码时才有用。
  3. 实现所有Y86指令所需要的计算可以组织成6个阶段:取值、译码、执行、访存、写回和更新PC。在SEQ中,所有硬件单元的处理都在一个时钟周期内完成。SEQ的实现包括组合逻辑和两种存储器设备。每个时钟周期,程序计数器都会装载新的指令地址;只有在执行整数运算指令时,才会装载条件码寄存器;只有在执行rmmovl、pushl或call指令时,才会写数据存储器;寄存器文件的两个写端口允许每个时钟周期更新两个程序寄存器。
  • 二维码

第八周作业

  • 内容总结
  1. 三种基本的构造并发程序的方法:1)进程,用内核来调用和维护,有独立的虚拟地址空间,显式的进程间通信机制。2)I/O多路复用,应用程序在一个进程的上下文中显式的调度控制流。逻辑流被模型化状态机。3)线程,运行在一个单一进程上下文中的逻辑流。由内核进行调度,共享同一个虚拟地址空间。
  2. echo服务器必须响应两个相互独立的I/O时间:1)网络客户端发起连接请求;2)用户在键盘上键入命令行。I/O多路复用技术的基本思路是使用select函数,要求内核挂起进程,只有在一个或多个I/O事件发生后,才将控制返回给应用程序。
  3. 在任何一个时间点上,线程是可结合的或者是分离的。一个可结合的线程能够被其他线程收回其资源和杀死;一个可分离的线程是不能被其他线程回收或杀死的。它的存储器资源在它终止时由系统自动释放。默认情况下,线程被创建成可结合的,为了避免存储器漏洞,每个可集合的线程都应该要么被其他进程显式的回收,要么通过调用pthread _detach函数被分离。
  4. 线程不安全的类:1)不保护共享变量的函数;2)保持跨越多个调用状态的函数;3)返回指向静态变量指针的函数。解决办法:重写函数和加锁拷贝;4)调用线程不安全的函数。
  5. daytime服务器分别用多进程和多线程实现成并发服务器并测试.
  • 二维码

第九周作业

  • 内容总结
  1. 存储器系统是一个具有不同容量、成本和访问时间的存储器设备的层次结构。
  2. 机访问存储器分为静态的SRAM、动态的DRAM。SRAM的特点是存储器单元具有双稳态特性,只要有电就会永远保持它的值,干扰消除时,电路就会恢复到稳定值。而DRAM的特点是每一位的存储是对一个电容的充电,且对干扰非常敏感。
  3. 局部性包括时间局部性空间局部性。时间局部性是指被引用过一次的存储器位置很可能在不远的将来再被多次引用。空间局部性是指一个存储器位置被引用了一次,那么程序很可能在不远的将来引用附近的一个存储器位置。
  4. 高速缓存的大小(容量)C指的是所有块的大小的和。标记位和有效位不包括在内,C=SES。高速缓存确定一个请求是否命中,然后抽取出被请求的字的过程,分为三步:1)组选择2)行匹配3)字抽取
  5. 用递归深入理解文件系统实现mypwd.
  • 二维码

第十周作业

  • 内容总结
  1. 课堂测试没有按时提交
  • 二维码

第十一周作业

  • 内容总结
  1. 物理地址PA:计算机系统的主存被组织成一个由M个连续的字节大小的单元组成的数组,每字节都有一个唯一的物理地址PA。根据物理地址寻址的是物理寻址。地址翻译:使用虚拟寻址时,CPU通过生成一个虚拟地址VA来访问主存,这个虚拟地址在被送到存储器之前先转换成适当的物理地址,相关硬件为存储器管理单元MMU。虚拟存储器的基本思想:主存中的每个字节都有一个选自虚拟地址空间的虚拟地址和一个选自物理地址空间的物理地址
  2. 按需页面调度和独立的虚拟地址空间的结合简化了链接和加载、代码和数据共享,以及应用程序的存储器分配。
  3. CPU中的一个控制寄存器页表基址寄存器指向当前页表,n位的虚拟地址包含两个部分:一个p位的虚拟页面偏移(VPO)和一个(n-p)位的虚拟页号,页表条目中的物理页号和虚拟地址中的VPO串联起来,就得到了相应的物理地址。
  4. PTE的三个权限位:R/W位、U/S位、XD位
  5. 当运行时需要额外虚拟存储器时,使用动态存储器分配器维护一个进程的虚拟存储器区域。分配器有两种风格。
  6. 系统调用malloc函数,从堆中分配块;成功返回指针,指向大小至少为size字节的存储器块,失败返回NULL。系统调用free函数来释放已分配的堆块;无返回值,ptr参数必须指向一个从malloc、calloc或者reallov获得的已分配块的起始位置。使用动态存储器分配原因:经常直到程序实际运行时,才知道某些数据结构的大小。
  • 二维码

第十三周作业

  • 内容总结
  1. 栈的特点:1)遵循后进先出的原则;2)push压栈,pop出栈;3)总是从栈顶插入和删除元素;4)栈顶元素的地址是最低的;5)栈指针%esp保存着栈顶元素的地址
  2. 将有效地址写入目的操作数,目的操作数必须是寄存器
  3. 根据操作数的不同类型,寻址方式可分为以下三种:1)操作数为常数值,写作$后加一个整数。2)寄存器寻址方式:操作数为某个寄存器中的内容。3)存储器寻址方式:根据计算出来的地址访问某个存储器的位置。
  4. 两种结合不同类型的对象来创建数据类型的机制:结构(structure)、联合(union)
  5. 机器用来传递过程参数、存储返回信息、保存寄存器用于以后恢复,以及本地存储。为单个过程分配的那部分栈称为栈帧。最顶端的栈帧以两个指针界定,寄存器%ebp为帧指针,寄存器%esp为栈指针。
  6. call指令、ret指令、leave指令用于转移控制。
  • 二维码

第十四周作业

  • 内容总结
  1. 异常,就是控制流中的突变,用来响应处理器状态中的某些变化。状态的变化称为事件,在任何情况下,当处理器检测到有事件发生时,会通过一张叫做异常表的跳转表,进行一个间接过程调用到专门处理程序异常处理程序。当异常处理程序完成之后,根据引起引起异常的事件类型,会发生以下三种情况之一:1)处理程序将控制返回给当前指令,即事件发生之时正在执行的指令。2)处理程序将控制返回给如果没有异常将会执行的下一条指令。3)处理程序终止被中断的程序。
  2. 异常的类别:中断、陷阱、故障、终止。初始模式是用户模式,进入内核模式的唯一方法是通过诸如中断、故障或者陷入系统调用这样的异常。
  3. 用户级异常控制流形式,称为非本地跳转,它将控制直接从一个函数转移到另一个当前正在执行的函数,而不需要经过正常的调用返回序列。
  • 二维码

实验报告链接汇总

实验一:交叉编译;目标机宿主机连通;目标机运行程序;目标机模块分解。

  • 二维码:

实验二:固件程序设计

  • 二维码:

实验三:实现(多线程)传送文本文件的客户端和服务器。

  • 二维码:

实验四:学习Linux设备驱动编程。

  • 二维码:

实验五:通信协议设计;Linux下OpenSSL的简单使用;混合密码系统的编写。

  • 二维码:

代码托管链接和二维码:

截图 git log --pretty=format:"%h - %an, %ar : %s" 的结果(因中途重新安装虚拟机所以没有之前上传的时间)

代码量汇总提交statistics.sh的支持截图

代码驱动的学习做到没有?

  • 随着课程的深入,对代码驱动的学习的方法也越来越得心应手,感受到了对我们日常学习的帮助之大,每周学习一部分,每周都有不同的进步,但还有很多地方需要继续学习。

加点代码,改点代码是理解的最好方式,参考编程的智慧,谈谈你的心得

  • 若想彻底搞懂一个代码,编译运行修改测试都是必不可少的,除了单纯的运行,后期修改则更考验是否对代码真正的有更加深刻的理解,不仅仅停留在表面,单纯的读懂而已。

实践上有什么经验教训

  • 一开始几周还没有养成独立修改代码的习惯,总是运行完掌握功能及主要代码后就觉得没事了,但发现课堂测试的题目稍微灵活一点就会不知所措,不知道如何运用所学知识。最后逐渐学会使用man指令等相关指令,对指令以及代码的学习有了更深刻的了解。

整体评价一下第1周作业中自己提出的问题是不是抓住了学习重点

  • 很多章节并没有抓住重点,而且现在看来还很幼稚。

回答一下第1周作业中自己提出的问题

从源文件到目标文件的转化,编译驱动程序是如何完成的?以hello.c为例

  • 过程是由编译器完成的,gcc的编译器驱动程序读取源文件hello.c,并把它翻译成一个可执行目标文件hello,这个过程是分为四个阶段完成的。
  1. 预处理阶段:将.c 文件转化成 .i文件,使用的gcc命令是:gcc –E,对应于预处理命令cpp;

  2. 编译阶段:将.c/.h文件转换成.s文件,使用的gcc命令是:gcc –S,对应于编译命令 cc –S;

  3. 汇编阶段:将.s 文件转化成 .o文件,使用的gcc 命令是:gcc –c,对应于汇编命令是 as;

  4. 链接阶段:将.o文件转化成可执行程序,使用的gcc 命令是: gcc,对应于链接命令是 ld;

各种进制及编码的转换及运算

  • 进制转化:x=2^n转化为十六进制
  • 将x写成x=2^n的形式,令n=i+4j,x的十六进制表示为:开头为2^i的值,后面补j个0。
  • 十进制转化为十六进制:十进制数x反复除以16,得十六进制数
  • 十六进制转化为十进制:十六进制数x反复乘以16,得十进制数

程序机器级代码的格式及指令的规范?

  • gcc -01 -o p p1.c
  1. -01 表示使用第一级优化。优化的级别与编译时间和最终产生代码的形式都有关系,一般认为第二级优化-02 是较好的选择。

  2. -o 表示将p1.c编译后的可执行文件命名为p

处理器的设计及体系结构?

  • 指令体系结构:一个处理器支持的指令和指令的字节级编码

优化编译器的功能?

  • 表示程序性能,消除循环的低效率,消除不必要的存储器引用。

存储器的层次结构??

  • 存储器系统是一个具有不同容量、成本和访问时间的存储器设备的层次结构。

  • 随机访问存储器层次结构:硬件和软件的这些基本属性(存储技术、计算机软件)互相补充得很完美,这种互相补充的性质使人想到一种组织存储器系统的方法。

  • 高速缓存存储器层次结构只有三层:CPU寄存器、DRAM主存储器和磁盘存储。

Unix中理解和处理目标文件的工具

  • AR :创建静态库,插入、删除、列出和提取成员。

  • STRINGS :列出目标文件中所有可以打印的字符串。

  • STRIP :从目标文件中删除符号表信息。

  • NM :列出目标文件符号表中定义的符号。

  • SIZE :列出目标文件中节的名字和大小。

  • READELF :显示一个目标文件的完整结构,包括ELF 头中编码的所有信息。

  • OBJDUMP :显示目标文件的所有信息,最有用的功能是反汇编.text节中的二进制指令。

  • LDD :列出可执行文件在运行时需要的共享库。

异常处理的方式?

  • 异常的一部分由硬件实现,一部分由操作系统实现,它就是控制流中的突变,用来响应处理器状态的某些变化。注意和语言中的应用级的异常概念区分。

  • 处理器中,状态被编码为不同的位和信号,状态变化被称为事件,事件不一定和当前指令的执行有关。处理器检测到有事件发生时,会通过异常表进行间接过程调用,到一个专门设计处理事件的操作系统子程序,称为异常处理程序。

  • 异常处理程序完成处理后,根据异常事件的类型会(执行一种):

  • 将控制返回给当前指令(事件发生时正在执行的)。

  • 将控制返回给下一条指令(没有异常将会执行的)。

  • 终止被中断的程序。

  • 异常表是一张跳转表,表目k包含异常k的处理程序的地址,在系统启动时由操作系统分配和初始化。系统中每种可能的异常都分配了一个唯一的非负整数的异常号。

虚拟存储器的功能?

  • 虚拟存储器3个重要的能力:
  1. 将主存看作是一个存储在磁盘上的地址空间的高速缓存,在主存中只保护活动的区域,并根据需要在磁盘和主存之间来回传送数据

  2. 为每个进程提供了一致的地址空间,从而简化了存储器管理

  3. 保护了每个进程的地址空间不被其它进程破坏。

如何检索文件夹的相关信息?

  • 运用ls -l指令

客户端-服务器编程模型的基本操作?

  • 一个应用是由一个服务器进程和一个或多个客户端进程组成。

并发现象的功能

访问慢速I/O设备,与人交互,通过推迟工作以降低延迟,服务多个网络客户端,在多个机器上进行并行计算。

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

优秀作业

第二周课堂实践
  • 二维码

第四周作业
  • 二维码

课堂测试06
  • 二维码

第九周作业
  • 二维码

课程收获与不足

  • 深入理解了计算机系统,掌握了多种信息的表示和处理方法,安装了Y86模拟器,学习了使用方法,深入理解了栈帧,GDB代码的调试方法,学会了如何优化程序的性能,掌握了存储器的层次结构,异常的处理方法,管道和链接如何操作,网络编程、并发编程等许多新知识,最重要学习的内容是虚拟机,许多操作不当都可能造成电脑的损坏,注意保护及维护电脑。

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

  • 这一年来这样的学习方式,带给我很多收获,自己的努力里没有白费,能感受到确实通过自学学到了更多的东西,不仅仅局限于课本,更多的是在实践操作上。通过查阅大量资料、询问同学相关操作,自己动手解决问题的能力大大增强,对知识点的记忆也加深了不少。同时,通过每周一到两篇博客和每周测试,感觉自己的学习方式变得有规划有条理了许多,每周有一个学习目标使得自己学习起来也十分有动力。

自己需要改进的地方

  • 有的代码虽然运行了也学习了代码主要函数的作用,但动手该代码和编写代码的时间和次数这学期相对来说比较少,较短的程序可以轻松理解,对稍长的程序理解还是有点难度,但也尽力去做了。而且有时会对并不完美的代码选择放过,没有去继续深入修改使它变得更好。
  • 遇到问题也没有很好地利用提供的蓝墨云平台,经常只是自己死磕,或者百度,忽略向老师、同学寻求帮助的这一条途径。

如果有结对,写一下你提供的帮助或接受了什么帮助,并对老师提供参考建议

  • 结对实验时,两人合作会进行的更快,一个人来研读步骤,另一人进行操作,效率十分的高,写实验报告时两人再互相一起总结,分享经验,对本次实验的理解又会更进一步。
  • 结对学习章节内容时,有人陪伴比单纯自学多了很多乐趣,学习过程也有了很多动力。看到别人在努力地学习,会对自己产生很好的激励作用。

给开学初的你和学弟学妹们的学习建议

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

  • 保持良好的学习习惯很重要,一定要严格按照老师每周的要求,不要妄想偷懒,成绩不会欺骗你,而且后来会发现,如果一旦刚开始拉下了,后面很难补上,与别人的差距也会越来越大。不要妄想走捷径,脚踏实地认认真真的学习,这门课和其他课程还是有区别的,考试成绩是按照平时给分,对于其他门课程的期末突击对这门课没有意义,况且编程能力也不是一蹴而就的,所以按部就班的来,一步步地认真学。

问卷调查

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

  • 15、16个小时左右吧,平时有时间晚上会学习一些内容或者搞一下饰演的相关代码,周末总会留出一大块时间用做整理。

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

  • 后期掌握了学习效果之后整体效率明显提高了,可能是重新安装了更适合自己的虚拟机,不像之前虚拟机用的不那么顺手,慢慢地也就不怎么想打开了。

学习效果自己满意吗?

  • 该怎么说呢,整体来看肯定是比上学期的java学习令自己满意得多,但肯定也是有很多不足的。还是很爱玩,但学习的时间增加了,没有java带给我感觉的差距大,上课能听懂的感觉很好。而且老师也在听取我们的建议,开始迎合我们的学习节奏,课堂上的收获也蛮多的。

课程结束后会继续一周至少一篇博客吗?

  • 希望自己能坚持,因为将来会发现这是一件很有成就感的事情。

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

  • 每周测试和写博客是一个好方法。博客相当于我们学习的笔记,能够帮我们记录学习时遇到的问题。而且不管你是主动还是被动地学习,在写博客、运行代码的过程中总能或多或少地学到一些东西;结对学习也提供了一个平台让我们对学习产生动力。每周测试会增加我们翻阅课本的次数,提高学习效果。

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

  • 关于那个提交笔记的出门门票,有两个模块是让我们写这堂课的收获和产生的问题。说实话,在跟老师讲解的过程中,没有太多精力去关注和提出一些很有营养方面的问题,所以最后上传的文件中这两个内容都经常填写的很没有水平。

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

  • 可以更多地尝试前半节可测试,后半节课讲课这种方式。毕竟有时感觉两个小时全部用来测试,下课后整个人容易虚脱。

给出你的总结的链接和二维码

本文链接和二维码:http://www.cnblogs.com/yangdi0420/p/8142715.html

  • 二维码

Powered by .NET Core 3.0 Preview 8 on Linux