20145227 《信息安全系统设计基础》第二周学习总结
20145227 《信息安全系统设计基础》第二周学习总结
教材学习内容总结
vim
VIM是一个非常好的文本编辑器,很多专业程序员使用VIM编辑代码。在实验楼中,只要在命令行中输入vimtutor,然后跟着教程练习就可以。
- 大写“K”可以用来查找函数的帮助信息:查看 man page,命令模式下,将光标放在函数名上,按"K"可以直接察看 man page。
- 几个设置
:set nu 显示行号
:set ai 自动缩行
:set ts=4 设置一个 TAB 键等于几个空格
- 移动光标
[[ 转到上一个位于第一列的"{"
]] 转到下一个位于第一列的"{"
{ 转到上一个空行
} 转到下一个空行
gd 转到当前光标所指的局部变量的定义
GCC
GNU CC(简称为gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C++和Object C等语言编写的程序。gcc又是一个交叉平台编译器,它能够在当前CPU平台上为多种不同体系结构的硬件平台开发软件,因此尤其适合在嵌入式领域的开发编译。
- 预处理:gcc –E hello.c –o hello.i;gcc –E调用cpp
- 编 译:gcc –S hello.i –o hello.s;gcc –S调用ccl
- 汇 编:gcc –c hello.s –o hello.o;gcc -c 调用as
- 链 接:gcc hello.o –o hello ;gcc -o 调用ld
GDB
GDB最基本的命令有:
- gdb programm(启动GDB)
- b 设断点(要会设4种断点:行断点、函数断点、条件断点、临时断点)
- run 开始运行程序
- bt 打印函数调用堆栈
- p 查看变量值
- c 从当前断点继续运行到下一个断点
- n 单步运行
- s 单步运行
- quit 退出GDB
Linux下C语言开发基础练习
教材第一章
- 信息就是位+上下文,系统中所有信息——包括磁盘文件、存储器中的程序、存储器中存放的用户数据以及网上传送的数据,都是由一串位表示的,区分不同数据对象的唯一方法是我们读到这些数据对象时的上下文。ASCII字符构成的文件是文本文件,所有其他文件都是二进制文件。
- Hello程序的生命周期从高级C语言程序开始,每条C语句被转化为一系列“低级机器语言”指令,然后这些指令按照“可执行目标程序”的格式打包,并以二进制磁盘文件的形式存放起来,目标程序也称为“可执行目标文件”。
- 源文件到目标文件的转化由编译器驱动程序完成,unix> gcc -o hello hello.c 这里GCC编译器驱动程序读取源文件并把它翻译成一个可执行目标文件。翻译过程分为四个阶段:预处理、编译、汇编、链接,预处理器、编译器、汇编器、链接器一起构成编译系统。
- 系统的硬件组成:总线、I/O设备、内存、处理器
- 并发:一个同时具有多个活动的系统。并行:用并发使一个系统运行地更快,并行可以在计算机系统多个抽象层次上运用。按照系统层次结构由高到低的顺序强调三个层次:线程级并发、指令级并行、单指令多数据并行
- 计算机系统是由硬件和系统软件组成的,程序被其他程序翻译成不同的形式,开始时是ASCII文本,然后被编译器和链接器翻译成二进制可执行文件
- 处理器读取并解释存放在主存里的二进制指令
教材第七章
-
静态链接器主要任务:符号解析、重定位
-
目标文件形式:可重定位目标文件、可执行目标文件、共享目标文件
-
每个可重定位目标模块m都有一个符号表,它包含m所定义和引用的符号的信息。有三种不同的符号:
①由m定义并能被其他模块引用的全局符号
②由其他模块定义并被模块m引用的全局符号
③只被模块m定义和引用的本地符号
Vim编辑器
Vim共有六种模式:
- 普通模式(Normal mode)
- 插入模式(Insert mode)
- 可视模式(Visual mode)
- 选择模式(Select mode)
- 命令行模式(Command line mode)
- Ex模式(Ex mode)
三种常用模式的切换
vim启动进入普通模式,处于插入模式或命令行模式时只需要按Esc或者Ctrl+[(这在vim课程环境中不管用)即可进入普通模式。普通模式中按i(插入)或a(附加)键都可以进入插入模式,普通模式中按:进入命令行模式。命令行模式中输入wq回车后保存并退出vim。
-
输入以下命令进入Vim
$ vim practice_1.txt
-
直接使用vim也可以打开vim编辑器,但是不会打开任何文件。
$ vim
-
进入vim后,按下i键进入插入模式。在该模式下可以输入文本信息。
-
按Esc进入普通模式,在该模式下使用方向键或者h,j,k,l键可以移动游标。
-
在普通模式下使用下面的键将进入插入模式,并可以从相应的位置开始输入。
-
从普通模式输入:进入命令行模式,输入w回车,保存文档。
-
从普通模式输入:进入命令行模式,输入wq回车,保存并退出编辑。
-
其它几种退出方式:
-
普通模式使用下列命令可以进行文本快速删除:
Vim文档编辑
-
行间跳转小技巧:在完成依次跳转后,可以使用Ctrl+o快速回到上一次(跳转前)光标所在位置,这个技巧很实用,比如当你在写代码时,忽然想起有个bug,需要修改,这时候你跳过去改好了,只需要按下Ctrl+o就可以回到你之前的位置。
-
复制及粘贴文本
普通模式中使用y复制
普通模式中,yy复制游标所在的整行(3yy表示复制3行)
普通模式中,y^ 复制至行首,或y0。不含光标所在处字符。
普通模式中,y$ 复制至行尾。含光所在处字符。
普通模式中,yw 复制一个单词。
普通模式中,y2w 复制两个单词。
普通模式中,yG 复制至文本末。
普通模式中,y1G 复制至文本开头。
普通模式中使用p粘贴
普通模式中,p(小写)代表粘贴至光标后(下)
普通模式中,P(大写)代表粘贴至光标前(上)
- 剪切及粘贴
前面讲得dd删除命令就是剪切,每次dd删除文档内容后,便可以使用p来粘贴,这一点可以让我们实现一个很爽快的功能——交换上下行:ddp
,就这么简单,即实现了快速交换光标所在行与它下面的行。
Linux系统编程
- gcc的使用
1.预处理阶段:一般格式为:gcc [选项] 要编译的文件 [选项] 目标文件 gcc -E hello.c -o hello.i
2.编译阶段:gcc将代码翻译成汇编语言,使用选项-S只进行编译而不进行汇编,结果生成汇编代码。gcc -S hello.i -o hello.s
3.汇编阶段:将.s文件转成目标文件,使用选项-c可以看到汇编代码转换为二进制目标代码。gcc -c hello.s -o hello.o
4.链接阶段:默认搜索链接到libc.so.6函数库当中,调用库文件中已经实现的函数。
-
编译结果
-
gdb的使用
gdb主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的 -g 参数即可。如:
$ gcc -g hello.c -o hello
$ g++ -g hello.cpp -o hello
- 启动gdb的方法有以下几种:
gdb <program> program也就是执行文件,一般在当前目录下。
gdb <program> core 用gdb同时调试一个运行程序和core文件,core是程序非法执行后,core dump后产生的文件。
gdb <program> <PID> 如果程序是一个服务程序,那么可以指定这个服务程序运行时的进程ID。gdb会自动attach上去,并调试它。program应该在PATH环境变量中搜索得到。
- Makefile使用
- Makefile的一般写法
test(目标文件): prog.o code.o(依赖文件列表)
tab(至少一个tab的位置) gcc prog.o code.o -o test(命令)
- 使用带宏的 Makefile
Makefile还可以定义和使用宏(也称做变量),从而使其更加自动化,更加灵活,在Makefile中定义宏的格式为:macroname = macrotext
使用宏的格式为:$(macroname)
学习中的问题和解决过程
问题1:在xfce用vim的时候, 输入10x,却没有反应,没有像教程说的那样 可以删除10个连续字符。
解决:之前之所以不行,是因为在我指定的那一行上,光标后面已经没有内容了。 由于 10x(小写)命令是删除光标后面的内容的,并且不会删除到下一行的内容。 所以在这种情况下使用该命令时,只会删除光标下的一个字符。10X(大写)则是往光标前面删除。
问题2:在实验环境中,按Esc 无法退回普通界面,刷新界面后也没用。
解决:搜索了一下好像很多人都会有这种问题,有可能是电脑和按键的问题,也有可能是浏览器的原因。后面换了Chrome浏览器就可以了。
问题3:在用Gvim编辑代码时,一开始我储存文件名为hello,并在下方选项里选择保存为.c/.h文件,但是这样保存并不能在Xfce终端里运行打印代码。
解决:需要将文件名直接保存为hello.c,这样就可以运行了。
本周代码托管截图
其他(感悟、思考等,可选)
- 本周的学习任务主要是通过对vim编辑器、GCC以及GDB的应用,了解Linux下C语言编程基础,我在本周的学习中了掌握了vim编辑器的基本模式、保存退出、光标跳转、删除复制等基本功能,初步了解到vim编辑器的优势。这次学习过程还是比较费劲的,首先是接触练习一个全然陌生的东西,对于我来说还是有很大困难的。其实是我看书,与做实验,这两者有一定部分重复的内容,然而我没有很好地联系在一起,导致练习vim全部实验内容练习了多遍才明白大概。以后我会在一周周的作业中,充分联系与使用教材,辅导书,讲解视频,实验指导书等教学资源,掌握自学能力,这样将会使以后的人生中获益无穷。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 0 | 2/2 | 20/20 | |
第二周 | 100/100 | 1/ 3 | 20/40 |