20145311 《信息安全系统设计基础》第二周学习总结
教材学习内容总结
重新学习了一下上周的一部分命令:
grep main wyx.c(grep的全文检索功能)
ls > ls.txt :ls内容输出到文本
find pathname -mtime -n/+n
find -size -n/+n (find的功能还是比较强大)
简单地学习了一下vim编辑器,跟着vimtutor简单地学了一些,在linux bash中使用vim能够极大地提高效率, vim的用法比较多,只学习了其中简单的一部分,必要时可以查阅相关手册
学习了一下如何使用vim+gcc+gdb,将这三者进行结合从而在linux bash的环境下进行c语言编程
vim:一种文本编辑器,用来在其中编写c语言代码(不需要鼠标许多快捷操作)
gcc:编译器,对代码进行预处理、编译、汇编、生成可执行文件
预处理:-E hello.i
编译:-s hello.s
汇编:-c hello.ogcc :支持编译的一些源文件后缀名
后缀 源文件
.c C语言源文件
.C .cc .cxx C++源文件
.m Object-C源文件
.i 经过预处理后的C源文件
.ii 经过预处理后的C++源文件
.s .S 汇编语言源文件
.h 预处理文件(头文件)
.o 目标文件
.a 存档文件
Tips: gcc预处理源文件的时候(第一步),不会进行语法错误的检查 语法检查会在第二步进行,比如花括号不匹配、行末尾没有分号、关键字错误......
实验楼的例子:
gdb:调试工具
最基本的命令有: gdb programm(启动GDB) gdb+可执行文件
b 设断点(4种断点:行断点、函数断点、条件断点、临时断点)
run(r) 开始运行程序
bt 打印函数调用堆栈
p 查看变量值
c 从当前断点继续运行到下一个断点
n(next) 单步运行
s(step) 单步运行
display
跟踪变量值的改变先next再step
until:直到循环结束
finish:运行结束函数
quit 退出GDB开始调试:
调试中列出代码(l):
查看断点(info break):
多模块编程:
Makefile: 多文件的好处:可以将一个大项目分成多个小的部分,独立开来,利于结构化管理。在修改和维护的时候,优势就更明显了 可以将一个大项目分成多个小的部分,独立开来,利于结构化管理。在修改和维护的时候,优势就更明显了
例子:
makefile
教材第一章:
信息就是位+上下文:源程序实际上就是由01比特组成的位序列,由ASCII码组成的文件称为文本文件, 其他文件都称为二进制文件 所有的信息实际上都是由位表示的,区分不同数据对象的唯一方法是上下文。
了解编译系统如何工作的好处:优化程序性能、理解链接是出现的问题、避免安全漏洞 外壳在处理命令时,如果命令行的第一个单词不是一个内置的外壳命令,那么外壳就会假设这是一个 可执行文件的名字,它会加载并运行这个文件。
系统的硬件组成: 总线、I/O设备、主存、处理器(加载(主存到寄存器)、存储(寄存器到主存)、操作(ALU)、跳转(程序计数器PC))
存储器层次结构:上一层的存储器作为第一层存储器的高速缓存
虚拟存储器:程序代码和数据、堆、共享库、栈、内核虚拟存储器
教材第七章:
链接是将各种代码和数据部分收集起来并组合成一个单一文件的过程 ,这个文件可被加载(或被拷贝)到存储器并执行 链接由被叫做链接器的程序自动执行,链接分为静态链接和动态链接
为了构造可执行文件,链接器必须完成两个主要任务:符号解析、重定位
目标文件的三种形式:可重定位目标文件、可执行目标文件、共享目标文件 重定位由两步组成:重定位节和符号定义、重定位节中的符号引用
处理目标文件的工具: AR:创建静态库,插入、删除、列出和提取成员
STRINGS:列出一个目标文件中所有可打印的字符串。
STRIP:从目标文件中删除符号表信息
READELF:显示一个目标文件的完整结构,包括ELF头中编码的所有信息,包含了size和nm的功能
OBJDUMP:二进制工具之母,能够显示一个目标文件中所有的信息,有反汇编的作用
LDD:列出一个可执行文件在运行时所需要的共享库静态链接器是由像GCC这样的编译驱动器调用的
教材学习中的问题和解决过程
第七章链接那部分没怎么看懂
本周代码托管(一部分)
参考资料
- 《深入理解计算机系统V2》学习指导
- ...