2017-2018-1 20155302 《信息安全系统设计基础》第1周学习总结
2017-2018-1 20155302 《信息安全系统设计基础》第1周学习总结
教材学习内容总结
课堂所讲:
vi hello.c
(建立进入.c)。
gcc hello.c
(编译.c)=>出现a.out
=>输入./a.out
(当前目录运行)。
echo
$?(查看返回值)。
存储程序:内存(可以运行)字节数组=>CPU。
信息=二进制位半+上下文。
od(查看文件) -tc(查看文本文件)
(gcc -E hello.c -o hello.i
)hello.c
=>(预处理)hello.i
。
(gcc -S hello.i -o hello.s
)hello.i
=>(编译)hello.s
。
objdump -d hello.o
=>文件信息包括汇编码。
hello.s
=>(汇编)hello.o
hello.o
=>(链接)hello
步骤:1.vi进入创建 2.gcc编译运行 3.gdb调试
cgdb先安装=>用cgdb a.out调试=>finish结束函数
断点:函数断点(b fxx)、行断点(b 行号)、临时断点(tb 行号)、条件断点(b if)。
第一章教材学习:
C语言的起源:
由Dennis Ritchie在1969年~1973年创建的。
美国国家标准学会(American National Standards Institute,ANSI)在1989年颁布了ANSI C标准,后来由国际标准化组织(International Standards Organization,ISO)负责C语言的标准化工作。
Kernaghan和Ritchie合著的经典书被程序“K&R”。
从源文件到目标文件的转化是由GCC编译器驱动程序完成的:
程序运行步骤大致如下:
- 初始时,外壳程序执行它的指令,等待我们输入一个命令;
- 当我们在键盘上输入字符串“./hello”后 , 外壳程序将字符逐一读入寄存器 , 再把它存放到存储器中;
- 当我们在键盘上敲回车键时 , 外壳程序就知道我们已经结束了命令的输入;
- 然后外壳执行一系列指令来加载可执行的hello文件, 将 hello目标文件中的代码和数据从磁盘复制到主存。 数据包括最终会被输出的字符串“ hello, world\n ”。
- 一旦目标文件 hello 中的代码和数据被加载到主存, 处理器就开始执行 hello 程序的 main 程序中的机器语言指令;
- 这些指令将“ hello, world\n ”字符串中的字节从主存复制到寄存器文件 , 再从寄存器文件中复制到显示设备 , 最终显示在屏幕上 。
操作系统有两个基本功能 :1)防止硬件被失控的应用程序滥用。2)向应用程序提供简单一致的机制来控制复杂而又通常大相径庭的低级硬件设备。
操作系统通过几个基本的抽象概念(进程、虚拟存储器和文件)来实现这两个功能。如图示:
数字计算机的整个历史中,有两个需求是驱动进步的而持续动力:
•我们想要计算机做得更多
•我们想要计算机运行的更快
并发(concurrency):指一个同时具有多个活动的系统;
并行(parallelism):指用并发使一个系统运行得更快。
计算机系统中抽象的重要性:
在处理器里,指令集结构 提供了对实际处理器硬件的抽象。使用这个抽象,机器代码程序表现得就好像它是运行在一个一 次只执行一条指令的处理器上。底层的硬件比抽象描述的要复杂精细得多,它并行地执行多条指 令,但又总是与那个简单有序的模型保持一致。只要执行模型一样,不同的处理器实现也能执行 同样的机器代码,而又提供不同的开销和性能。
第七章教材学习:
编译器和汇编器生成可重定位目标文件(包括共享目标文件)。链接器生成可执行目标文件。从技术上来说,一个目标模块就是一个字节序列,而一个目标文件就是一个存放在磁盘文件中的目标模块。
静态链接器:以一组可重定位目标文件和命令行参数作为输入,生成一个完全链接的可以加载和运行的可执行目标文件作为输出。
为了构造可执行文件,链接器必须完成两个主要任务:
1.符号解析:目标文件定义和引用符号。符号解析的目的是将每个符号的引用刚好和一个符号定义联系起来。
2.重定位:编译器和汇编器生成从地址0开始的代码和数据节。链接器通过把每个符号定义与一个存储器位置联系起来,然后修改所有对这些符号的引用,使得它们指向这个存储器位置,从而重定位这些节。
编译器向汇编器输出每个全局符号,或者是强或者是弱,而汇编器把这个信息隐含地编码在可重定位目标文件的符号表里。函数和已初始化的全局变量时强符号,未初始化的全局变量是弱符号。
根据强弱符号的定义,Unix链接器使用下面的规则来处理多重定义的符号:
规则1:不允许有多个强符号。
规则2:如果有一个强符号和多个弱符号,那么选择强符号。
规则3:如果有多个弱符号,那么从这些弱符号中任意选择一个。
浏览教材提问题
第一章:一个程序编译成可执行程序需要哪些步骤?
第二章:算术移位和逻辑移位有什么区别?
第三章:汇编代码与反汇编代码有什么不同?
第四章:精简指令集RISC和复杂指令集CISC的区别?
第五章:投机执行的优劣?
第六章:如果一个块在较高层中,如何找到它?
第七章:同时存在静态库和动态库应如何编译?
第八章: Try catch 是怎样跳转的?
第九章:虚拟地址与编译程序和连接程序有什么关系?
第十章:什么叫从流中读取下一个字符?
第十一章:什么是超时控制?
第十二章:多线程与单线程的进程相比有那些优势呢?为什么要使用多线程呢?
教材学习中的问题和解决过程
本周的学习内容是第一章和第七章,第一章主要讲述了计算机的内部工作原理以及硬件的组成和管理,较为好理解,只是不太懂Amdahl定律不太会使用其中的公式。另外第七章讲链接,就不是很好理解了,概念很模糊而且静态链接和动态链接的差别和作用及使用范围不太明白,第七章中多次用了汇编代码,不太看得懂。
代码调试中的问题和解决过程
不知道遭遇了什么,上学期一直好好的,可这次在原文件夹里面git push运行脚本时明明显示文件已经上传过去了,可是代码行数始终是零,如图试验了四次可都是这样。
后来在同学的指导下,我把脚本中的.java改成了.c于是成功了。
代码托管
https://gitee.com/bestiisjava2017/yxc20155302
上周考试错题总结
上周无考试。
结对学习
本周我与秦诗茂同学共同学习了第一章以及第七章的知识点,并做了讨论,他给我讲了一些动静态链接库的理解,我给他讲了一些存储器结构层次的掌握,互相学习,共同进步。
其他(感悟、思考等,可选)
一个假期没有使用虚拟机以及命令行指令了,于是很是生疏,许多指令和操作都已忘记,于是只能打开实验楼重新学习了一下相关知识,但虚拟机和统计代码脚本出了很多问题,经过不断的学习和改进,我觉得学习之路还很漫长啊。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 |
尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。
耗时估计的公式
:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。
-
计划学习时间:XX小时
-
实际学习时间:XX小时
-
改进情况:
(有空多看看现代软件工程 课件
软件工程师能力自我评价表)