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 main
或gcc -static main.c ./libmath.a -o main
两种格式
- 编写.h文件和.c文件,注意.h文件的格式以及
结对及互评
点评模板:
- 博客中值得学习的或问题:
- 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小时
-
改进情况:将本周学习内容模块简化,重点放在问题及其解决上。
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)