20145218 《信息安全系统设计基础》第2周学习总结
20145218 《信息安全系统设计基础》第2周学习总结
教材学习内容总结
实验楼实验知识总结
编辑器(vim)
- 完成对所录入文字的编辑功能,最常用的是vi(vim)和emacs
- vi的三种模式及用法
- 命令行模式:最初进入的默认模式,可上下移动光标进行删除字符或整行删除,也可进行复制粘贴,但无法编辑
- 插入模式:可以编辑,按[Esc]键回到命令行模式
- 底行模式:可以进行保存或退出,或设置编辑环境
- vim教程简要总结
- :q!会舍弃所做的任何改动;
- 按下A以启用编辑,按下esc退出;
- 光标放在欲删除的单词处,按下dw可以删除单词;c$可以删除到行末;输入d$,删除从当前光标到文末;数字+dd,删除几行;
- w,表示向前移动几个单词(不含该单词),而e表示移动到前面第几个单词(含本词);
- 按下p将最后一次删除的内容插入到光标所在位置的上方;
- 输入r和一个字符,替换光标所在位置的字符;
- 输入cw或者ce之后,可以改变单词直到单词末尾(ce是把光标所在的位置上的单词也删除);
- Ctrl +g可以查询当前行,用G跳到文末或者gg跳到文首之后,输入行号+G就可以返回;
- /后输入字符即可查找,按下n进行下一次查找;光标放在某{,(,[处,按下%可以查找配对的另一半乎可以输;
- 😒/old/new/g可以将整行中的单词进行替换;:%s/old/new/g可以将整个文档中的单词进行替换;
- :!后加上外部命令,即在vim中执行外部命令;
- 按下v后,就可以选中部分文本了;:r FILENAME就可将文本内容粘贴到光标方;
- 输入大写的O,将在光标上方打开一行并进入插入模式,输入小写的o,将在光标下方打开一行并进入插入模式;
- 输入a可在光标之后插入;按下R后,就可以连续替换多个字符;按下v后,可以在高光状态下选中文本,然后按下y复制,按下p粘贴;也可以直接在正常状态下按yw选中一个单词;在:set hls is之后,输入/单词 可以显示出文件中所有的待查找单词;
- :set ic之后,则不区分查找的大小写;
- 按下tab键可以补全文件名。
编译链接器(gcc)
- 指源代码转化成生成可执行代码的过程,最常用的编译器是gcc。
- gcc的编译流程
-
预处理阶段:头文件和宏定义,—E可以让gcc在预处理结束之后停止编译过程,因此可以看到预处理的过程。
一般格式为:gcc [选项] 要编译的文件 [选项] 目标文件 `gcc -E hello.c -o hello.i`
-
编译阶段:gcc将代码翻译成汇编语言,使用选项-S只进行编译而不进行汇编,结果生成汇编代码。
gcc -S hello.i -o hello.s
-
汇编阶段:将.s文件转成目标文件,使用选项-c可以看到汇编代码转换为二进制目标代码。
gcc -c hello.s -o hello.o
-
链接阶段:默认搜索链接到libc.so.6函数库当中,调用库文件中已经实现的函数。
-
gcc编译选项分析:常用选项 -I dir :在头文件的搜索路径列表中添加dir目录,当用户希望添加放置在非默认位置的头文件时可以通过该选项来指定。
-
使用gcc编译:
-
使用gcc进行模块化编译:
编译链接器(gdb)
- gdb调试器,可方便的设置断点、单步跟踪。
- gdb的使用流程
- 查看文件:键入l(list)查看所载入的文件
- 设置断点
- 按行设置断点:b+对应行号即可,可设置多个断点,运行到设置断点的一行程序会自动停止
- 函数断点:按函数设置断点只需把函数名列在命令“b”之后
- 条件断点:b 行数或函数名 if 表达式
- 查看断点情况:info b,在断点键入bt可查到调用函数(堆栈)的情况。
- 运行代码:r+行号可从指定行开始运行代码,默认从头执行
- 查看变量值:p+变量值即可
- 单步运行
- 恢复程序运行
- gdb基本命令,可通过help选项查看:
help all:
项目管理器(makefile)
- 一个工程中的源文件不计其数,按其类型、功能、模块分别放在若干个目录中。makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至进行更复杂的功能操作(因为makefile就像一个shell脚本一样,可以执行操作系统的命令)。
- makefile带来的好处就是——“自动化编译”,一但写好,只需要一个make命令,整个工程完全编译,极大的提高了软件的开发效率。make是一个命令工具,是一个及时makefile中命令的工具程序。
- make工具最主要也是最基本的功能就是根据makefile文件中描述的源程序至今的相互关系来完成自动编译、维护多个源文件工程。而makefile文件需要按某种语法进行编写,文件中需要说明如何编译各个源文件并链接生成可执行文件,要求定义源文件之间的依赖关系。
- makefile基本结构
- 需要由make工具创建的目标体(target),通常是目标文件或可执行文件
- 要创建的目标体所依赖的文件(dependency_file)
- 创建每个目标体时需要运行的命令(command),这一行必须以制表符开头,格式为
target:dependency_files command
- makefile变量
- makefile规则
- make管理器的使用
- 创建静态库 gcc -c 目标文件(.c)——>ar rcsv libname.a 目标文件.o (编译主程序)gcc -o 主程序名 主程序名.c -L lname
- 创建动态库 gcc -fPIC -Wall -c 目标文件.c——> gcc -shared -o libname.so 目标文件.o 编译主程序的命令同上 此外,还要注册动态路径 cp libname.so /lib
课本知识总结
第一章
1.信息就是位+上下文,系统中所有信息——包括磁盘文件、存储器中的程序、存储器中存放的用户数据以及网上传送的数据,都是由一串位表示的,区分不同数据对象的唯一方法是我们读到这些数据对象时的上下文。ASCII字符构成的文件是文本文件,所有其他文件都是二进制文件。
2.Hello程序的生命周期从高级C语言程序开始,每条C语句被转化为一系列“低级机器语言”指令,然后这些指令按照“可执行目标程序”的格式打包,并以二进制磁盘文件的形式存放起来,目标程序也称为“可执行目标文件”。
3.源文件到目标文件的转化由编译器驱动程序完成,unix> gcc -o hello hello.c 这里GCC编译器驱动程序读取源文件并把它翻译成一个可执行目标文件。翻译过程分为四个阶段:预处理、编译、汇编、链接,预处理器、编译器、汇编器、链接器一起构成编译系统。
4.系统的硬件组成:总线、I/O设备、内存、处理器
5.文件就是字节序列
6.并发:一个同时具有多个活动的系统。并行:用并发使一个系统运行地更快,并行可以在计算机系统多个抽象层次上运用。按照系统层次结构由高到低的顺序强调三个层次:线程级并发、指令级并行、单指令多数据并行
7.在处理器里,指令集结构提供了对实际处理器硬件的抽象
8.计算机系统是由硬件和系统软件组成的,程序被其他程序翻译成不同的形式,开始时是ASCII文本,然后被编译器和链接器翻译成二进制可执行文件
9.处理器读取并解释存放在主存里的二进制指令
10.操作系统内核是应用程序和硬件之间的媒介,提供三个基本的抽象:
-
文件是对I/O设备的抽象
-
虚拟存储器是对主存和磁盘的抽象
-
进程是对处理器、主存和I/O设备的抽象
11.网络提供了计算机系统之间通信的手段
第七章
1.静态链接器主要任务:符号解析、重定位
2.目标文件形式:可重定位目标文件、可执行目标文件、共享目标文件
3.每个可重定位目标模块m都有一个符号表,它包含m所定义和引用的符号的信息。有三种不同的符号:
- 由m定义并能被其他模块引用的全局符号
- 由其他模块定义并被模块m引用的全局符号
- 只被模块m定义和引用的本地符号
课后作业中的问题和解决过程
1.在做makefile实验时,按照要求打了代码但是无法输出正确结果
并且在Makefile中,提示遗漏了分隔符,但具体哪里遗漏不清楚
2.设置断点时,按照实验楼步骤输出,有的与正确答案一致,有的不一样,但不知道具体原因,对于gdb仍然不是很理解。
3.这里对gcc hello_print.c hello_main.c –o hello的解释中,最后一个命令的意思是什么?
4.课本第七章动态库与静态库的创建和链接应用较好理解,但7.6符号解析,7.7重定位以及7.12PIC和重定位相关知识较为抽象不好理解,希望老师在课堂上作系统讲解。
本周代码托管截图
其他(感悟、思考等,可选)
本周学习内容以练习为主,vim编辑器,gcc编译以及gdb调试和makefile项目管理都是C语言中的知识,只不过换到linux系统中用不同的工具以命令行的形式呈现。但是有的实验仍然不能成功,且找不出问题所在,对于gdb和makefile的理解还不是很深刻,争取多加练习,早日熟悉。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 200/200 | 2/2 | 20/20 | |
第二周 | 300/500 | 3/4 | 18/38 |