20145221 《信息安全系统设计基础》第2周学习总结
教材学习内容总结
Linux系统下的开发环境
- Teiminal终端(Bash环境)
- vim编辑器
- git托管工具
- gcc,gdb,makefile等编译调试工具
vim概述
vim编辑器
vim概述:
- 从vi演生出来的Vim具有多种模式,这种独特的设计容易使初学者产生混淆。几乎所有的编辑器都会有插入和执行命令两种模式,并且大多数的编辑器使用了与Vim截然不同的方式:命令目录(鼠标或者键盘驱动),组合键(通常通过control键(CTRL)和alt键(ALT)组成)或者鼠标输入。Vim和vi一样,仅仅通过键盘来在这些模式之中切换。这就使得Vim可以不用进行菜单或者鼠标操作,并且最小化组合键的操作。对文字录入员或者程序员可以大大增强速度和效率。
vim三种常用模式介绍:
- 普通模式(Normal mode)
- 在普通模式中,用的编辑器命令,比如移动光标,删除文本等等。
- Vim强大的编辑能来自于其普通模式命令。普通模式命令往往需要一个操作符结尾。例如普通模式命令dd删除当前行,但是第一个"d"的后面可以跟另外的移动命令来代替第二个
d
,比如用移动到下一行的"j"键就可以删除当前行和下一行。另外还可以指定命令重复次数,2dd
(重复dd两次),和dj
的效果是一样的。用户学习了各种各样的文本间移动/跳转的命令和其他的普通模式的编辑命令,并且能够灵活组合使用的话,能够比那些没有模式的编辑器更加高效的进行文本编辑。 - 在普通模式中,有很多方法可以进入插入模式。比较普通的方式是按a(append/追加)键或者i(insert/插入)键。
- 插入模式(Insert mode)
- 在这个模式中,大多数按键都会向文本缓冲中插入文本。大多数新用户希望文本编辑器编辑过程中一直保持这个模式。
- 在插入模式中,可以按
ESC
键回到普通模式。
- 命令行模式(Command line mode)
- 在命令行模式中可以输入会被解释成并执行的文本。例如执行命令(
:
键),搜索(/
和?
键)或者过滤命令(!
键)。在命令执行之后,Vim返回到命令行模式之前的模式,通常是普通模式。
- 在命令行模式中可以输入会被解释成并执行的文本。例如执行命令(
- 三种模式的切换
- vim启动进入普通模式,处于插入模式或命令行模式时只需要按
Esc
或者Ctrl+[
(这在vim课程环境中不管用)即可进入普通模式。普通模式中按i
(插入)或a
(附加)键都可以进入插入模式,普通模式中按:进入命令行模式。命令行模式中输入wq
回车后保存并退出vim。
- vim启动进入普通模式,处于插入模式或命令行模式时只需要按
基本操作
- 游标移动(在普通模式下,按Esc进入普通模式)
按键 | 说明 |
---|---|
h | 左 |
l | 右 |
j | 下 |
k | 上 |
w | 移动到下一个单词 |
b | 移动到上一个单词 |
- 进入插入模式(在普通模式下进入)
命令 | 说明 |
---|---|
i | 在当前光标处进行编辑 |
I | 在行首插入 |
A | 在行末插入 |
a | 在光标后插入编辑 |
o | 在当前行后插入一个新行 |
O | 在当前行前插入一个新行 |
cw | 替换从光标所在位置后到一个单词结尾的字符 |
-
命令行模式下保存文档
:
从普通模式输入:进入命令行模式,输入w
回车,保存文档。输入:w
文件名可以将文档另存为其他文件名或存到其它路径下。 -
退出vim(常用)
- 命令行模式下退出vim:从普通模式输入:进入命令行模式,输入wq回车,保存并退出编辑。
- 普通模式下退出vim:普通模式下输入Shift+zz即可保存退出vim。
-
普通模式下删除文本
命令 | 说明 |
---|---|
x | 删除游标所在的字符 |
x | 删除游标所在前一个字符 |
Delete | 同x |
dd | 删除整行 |
dw | 删除一个单词(不适用中文) |
d$或D | 删除至行尾 |
d^ | 删除至行首 |
dG | 删除到文档结尾处 |
d1G | 删至文档首部 |
ndd | 删除n行 |
- 替换和撤销(Undo)命令(只针对普通模式)
命令 | 说明 |
---|---|
r+<待替换字母> | 将游标所在字母替换为指定字母 |
R | 连续替换,直到按下Esc |
cc | 替换整行,即删除游标所在行,并进入插入模式 |
cw | 替换一个单词,即删除一个单词,并进入插入模式 |
C | 替换游标以后至行末 |
~ | 反转游标所在字母大小写 |
u{n} | 撤销一次或n次操作 |
U | 撤销当前行的所有修改 |
Ctrl+r | redo,即撤销undo的操作 |
-
快速缩进(普通模式)
- 使用命令进行快速调整缩进操作:通模式下输入
15G
,跳转到15行;普通模式下输入>>
整行将向右缩进(使用,用于格式化代码超爽);普通模式下输入<<
整行向左回退;普通模式下输入:
进入命令行模式下对shiftwidth
值进行设置可以控制缩进和回退的字符数。 shiftwidth
命令:shiftwidth
命令是指>>
命令产生的缩进(可以简写成sw
) 普通模式下输入:进入命令行模式;对shiftwidth
值进行设置可以控制缩进和回退的字符数。 获取目前的设定值:set shiftwidth?
;设置缩进为10个字符:set shiftwidth=10
。
- 使用命令进行快速调整缩进操作:通模式下输入
-
调整文本位置
- 命令行模式下输入:
ce
(center)命令使本行内容居中 - 命令行模式下输入:
ri
(right)命令使本行文本靠右 - 命令行模式下输入:
le
(left)命令使本行内容靠左
- 命令行模式下输入:
-
查找:
- 普通模式下输入
/
向下查找,输入?
向上查找,n
表示继续查找,N
反向查找 - 普通模式下输入
*
寻找游标所在处的单词 - 普通模式下输入
#
同上,但*
是向前(上)找,#
则是向后(下)找 - 普通模式下输入
g*
同*
,但部分符合该单词即可 - 普通模式下输入
g#
同#
,但部分符合该单词即可
- 普通模式下输入
GCC 使用
GCC 概述
- GNU CC(简称为gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C++和Object C等语言编写的程序。gcc又是一个交叉平台编译器,它能够在当前CPU平台上为多种不同体系结构的硬件平台开发软件,因此尤其适合在嵌入式领域的开发编译。
- gcc编译文件的流程:源文件—预处理—编译—汇编—链接—可执行文件
- 预处理: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
- 在.c->.i的时候不会进行语法检查,在.i->.o的时候才会进行
GCC 实践
-
使用gcc进行编译
-
使用gcc进行模块化编译
GDB 使用
GDB 概述
- 程序的运行状态有“运行”、“暂停”、“停止“三种
- 主要基本操作
- 查看文件:
l
- 设置断点:在
b
后加入相对应的行号。例b 6
- 查看断点情况:设置完断点后键入
info b
,在gdb中可以设置多个断点。bt
查询调用函数的情况 - 运行代码:默认从首行开始运行代码,键入
r
;r
+行号:从该行号开始运行 - 查看变量值:
p
变量。例:p n
- 单步运行:
n
或s
,s
会进入函数,n
不会进入函数 - 恢复程序运行:
c
- 帮助信息:
h
- 查看文件:
- 断点的设置
- 函数:
b 文件名.c:函数名
- 行:
b 行数
- 条件:
b 行数 if 表达式
(例如:b 9 if == 12) 临时:tb [文件名:]行号或函数名 <条件表达式>
- 函数:
GDB 实践
Makefile 使用
Makefile 概述
- 一个工程中的源文件不计其数,按其类型、功能、模块分别放在若干个目录中。
makefile
定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至进行更复杂的功能操作。其带来的好处就是——“自动化编译”,一但写好,只需要一个make
命令,整个工程完全编译,极大的提高了软件的开发效率。 makefile
文件编写规则:- 目标文件:由make创建,通常是目标文件或可执行文件
- 依赖文件:创建目标体所依赖的文件
- 运行命令:创建每个目标体时需要的运行命令,必须以tab键开头
- 格式为:
目标文件:依赖文件列表
[tab键]各目标体运行命令
(注意不是空格) - 使用make的格式:make 目标文件
makefile
变量的定义:- 递归展开方式:在引用该变量时进行替换(不能用于引用自己的情况),缺点:不能在变量后追加内容
- 格式定义:
VAR = var
- 展开方式:在定义处展开,并只展开一次。优点:消除变量的嵌套引用
- 格式定义:
VAR := var
- make中变量的使用格式: $(变量名)
- 变量名的命名:不包括“:”、“#”、“=”以及结尾空格的任何字符串;变量名大小写不敏感
Makefile 实践
Makefile
文件
test: prog.o code.o
gcc prog.o code.o -o test
prog.o: prog.c code.h
gcc -c prog.c -o prog.o
code.o: code.c code.h
gcc -c code.c -o code.o
clean:
rm -f *.o test
教材学习中的问题和解决过程
Ubuntu中git的配置
- 刚开始在纠结虚拟机中的代码怎样拖到实体机中进行git,又不会设置共享文件。最后,我觉得这种想法是很幼稚的。它之所以叫虚拟机,就是因为它可以虚拟实体的计算机。所以我干嘛不就在ubuntu中git呢?
- 依据上学期配置git的经验,在Linux Bash中对git进行配置,相关博文可参考:开源中国的代码托管
本周代码托管截图
其他(感悟、思考等,可选)
- 这周主要学习的内容就是vim,gcc,gdb以及makefile,学习环境为Linux。Linux系统下的开发环境不同于windows那样图形化可视化,对于C的调试编译都是基于Terminal终端Bash环境下操作的,是以指令的形式实现的。虽然看似没有VC6.0点2个按钮那样方便,但在gcc/gdb的使用过程中,更加能体会实现一个C代码的完整周期。
- 这周比较全面的接触到了Vim编辑器,学习之后觉得,他的强大在于丰富的键盘操作,不需要鼠标,仅需一个键盘,各种快捷键就可实现对文本的编辑。不过快捷键过多,刚开始学习过程中肯定很麻烦,记不住快捷键,所以我在实验楼中找到了一个键盘布局图,希望能在今后使用的过程中熟悉Vim的操作。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 200/200 | 2/2 | 20/20 | 学习了Linux常用命令 |
第二周 | 79/279 | 1/3 | 30/50 | 了解vim,gcc,gdb基本操作 |