鲸鱼的抽屉  

2017-2018-1 20155312 《信息安全系统设计基础》第一周学习总结

教材学习内容总结

上周学习了计算机中信息的存储方式;了解了源程序如何被计算机一步步处理转化成目标文件,以及其对应的Linux指令(ESo iso);查看反馈的汇编码的指令objdump -d hello.o;了解编译系统如何工作的三大益处;了解系统的硬件组成;命令行下程序调试的方法;操作系统的功能、内涵;系统之间的通信;学习链接的意义;创建静态库;创建动态库。

教材学习中的问题和解决过程

  • 问题1:书中第6页图1-4中介绍了一个典型系统的硬件组成,I/O设备通过配适器或控制器与I/O总线相连,I/O总线又通过I/O桥与系统总线相连,那么这里I/O桥的作用是什么?I/O桥与I/O总线的关系?

  • 问题1解决方案:上网搜索了I/O桥的概念,发现没有明确的定义,学长说是“存储器结构”,知乎上的用户解释“有点像ARM 的AMBA”,但由于我对存储器和一些专业术语并不了解,所以还是没法理解I/O桥的概念。后来我在一篇博客里发现“系统总线是一组并行的导线,能携带地址、数据和控制信号。但是不同总线不能直接互通,这就用到了I/O桥”“一个计算机有多个不同类型的总线,这些总线由桥(bridge)链接起来。”,据此我分析I/O桥作用是联通系统总线与I/O总线。

  • 问题2:主存和内存是同一个概念吗?

  • 问题2解决方案:主存是主存储器的简称。“主存储器(Main memory),简称主存。是计算机硬件的一个重要部件,其作用是存放指令和数据,并能由中央处理器(CPU)直接随机存取。”内存是内部存储器的简称,包括RAM(主存)和ROM(只读存储器)。存在主存中的数据一旦断电就丢失了,存在ROM中的数据不会丢失。

  • 关系图如下:

  • 问题3:什么是标准的ELF-64目标文件格式?

  • 问题3解决方案:参考ELF文件格式分析
    我了解到目标文件有三种类型:1.可重定位文件(.o)2.可执行文件(.exe)3.共享目标文件(.so)。如下图所示,ELF目标格式一般包含 ELF 头部、程序头部表、节区、节区头部表几个部分。

浏览教材并针对每章提出一个问题

  • 第一章:数据和控制信息以不同的方式存储在栈上为什么会引发安全漏洞?
  • 第二章:无符号数和数的补码表示有哪些特性?
  • 第三章:寄存器的使用惯例提出依据是什么?
  • 第四章:组合和时序逻辑元素如何在数据通路中组合到一起?
  • 第五章:如何减少程序需要做的工作的变换?
  • 第六章:RAM、ROM、磁盘和固态硬盘是如何防止在层次结构中的?
  • 第七章:位置无关代码主要应用于什么情况?
  • 第八章:应用程序是如何与操作系统交互的?
  • 第九章:应用程序如何使用和管理虚拟内存?
  • 第十章:内核用什么数据结构来表示打开的文件?
  • 第十一章:getaddrinfo函数和getnameinfo函数有什么区别或联系?
  • 第十二章:如何理解互斥锁加锁顺序规则?

代码调试中的问题和解决过程

  • 本周没有代码方面的问题

代码托管

(statistics.sh脚本的运行结果截图包含克隆项目后的代码)

上周考试错题总结

课下测试ch01

满分15分,得分15分

课下测试ch07

满分18分,得分11分

错题及解析:

1.main.c 调用了静态库libmath.a中的函数,编译main.c的命令是(AB)

A .
gcc -static main.c ./libmath.a -o main

B .
gcc -static main.c -L. -lmath -o main

C .
gcc -static main.c -L. -llibmath.a -o main

D .
gcc -static main.o ./libmath.a -o main

  • 错因:误选了D,此处是将main.c文件编译为可执行文件main
  • 知识延展:

库有动态与静态两种,动态通常用.so为后缀,静态用.a为后缀。

对比一下两者:

  • 静态链接库:当要使用时,连接器会找出程序所需的函数,然后将它们拷贝到执行文件,由于这种拷贝是完整的,所以一旦连接成功,静态程序库也就不再需要了。
  • 动态库而言:某个程序在运行中要调用某个动态链接库函数的时候,操作系统首先会查看所有正在运行的程序,看在内存里是否已有此库函数的拷贝了。如果有,则让其共享那一个拷贝;只有没有才链接载入。在程序运行的时候,被调用的动态链接库函数被安置在内存的某个地方,所有调用它的程序将指向这个代码段。因此,这些代码必须使用相对地址,而不是绝对地址。在编译的时候,我们需要告诉编译器,这些对象文件是用来做动态链接库的,所以要用地址不无关代码(Position Independent Code (PIC))。
    • 注意:linux下进行连接的缺省操作是首先连接动态库,也就是说,如果同时存在静态和动态库,不特别指定的话,将与动态库相连接。
  • 使用静态库链接、编译步骤:
    • 编写.h文件和.c文件,注意.h文件的格式以及 #ifndef #define #endif的使用
    • 将头文件中包含的相关函数对应的.c文件编译生成 .o文件
    • 由 .o 文件创建静态库(.a 文件):ar cr lib静态库名.a XXX.o XXX.o
    • 在程序中使用静态库:gcc -static main.c -L. -lmath -o maingcc -static main.c ./libmath.a -o main两种格式

结对及互评

点评模板:

  • 博客中值得学习的或问题:
    • xxx
    • xxx
    • ...
  • 代码中值得学习的或问题:
    • xxx
    • xxx
    • ...
  • 其他

本周结对学习情况

-  [20155333]()
-  结对照片
-  结对学习内容
    -  第一章、第七章

其他(感悟、思考等,可选)

刚经历了大学两年里最忙碌的一周,总结起来其实是自己在有打把时间去做一些事的时候却选择了懈怠,结果现在事情都积压到了一起。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 19/0 1/0 15/0 了解计算机内部结构、程序执行过程中的具体过程、动态链接和静态链接
第二周 300/500 2/4 18/38
第三周 500/1000 3/7 22/60
第四周 300/1300 2/9 30/90

尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

参考:软件工程软件的估计为什么这么难软件工程 估计方法

  • 计划学习时间:20小时

  • 实际学习时间:15小时

  • 改进情况:将本周学习内容模块简化,重点放在问题及其解决上。

(有空多看看现代软件工程 课件
软件工程师能力自我评价表
)

参考资料

posted on 2017-09-24 21:36  鲸鱼的抽屉  阅读(194)  评论(1编辑  收藏  举报