20145219 《信息安全系统设计基础》第02周学习总结
教材学习内容总结
vi的基本操作
对Vim的基本介绍
Vim是一个超级超级强大的文本编辑器,是跨平台的。特点:历史悠久、有模式、可以实现复杂需求、一能百能、无限灵活。vim的模式
1、6种基本模式
普通模式(Normal mode)(常用) 插入模式(Insert mode)(常用) 可视模式(Visual mode) 选择模式(Select mode) 命令行模式(Command line mode)(常用) Ex模式(Ex mode)
2、3种常用模式的切换:vim启动进入普通模式,处于插入模式或命令行模式时只需要按Esc或者Ctrl+[(这在vim课程环境中不管用)即可进入普通模式。普通模式中按i(插入)或a(附加)键都可以进入插入模式,普通模式中按:进入命令行模式。命令行模式中输入wq回车后保存并退出vim。
3、进入vim:vim后面加上你要打开的已存在的文件名或者不存在(则作为新建文件)的文件名。 命令
vim 文件名
或vim
。
4、退出与保存:
:q! 强制退出,不保存
:q 退出
:wq! 强制保存并退出
:w <文件路径> 另存为
:saveas 文件路径 另存为
:x 保存并退出
:wq 保存并退出
普通模式下输入Shift+zz即可保存退出vim
建立vim文件并进入
vim <文件名><回车> 新建文件(可同时创建多个文件,默认进入第一个) :e 3.txt 打开新文件3.txt :e# 回到前一个文件 :ls 可以列出以前编辑过的文档 :b 2.txt(或者编号) 可以直接进入文件2.txt编辑 :bd 2.txt(或者编号) 可以删除以前编辑过的列表中的文件项目 :e! 4.txt 新打开文件4.txt,放弃正在编辑的文件 :f 显示正在编辑的文件名 :f new.txt 改变正在编辑的文件名字为new.txt
恢复文件
输入vim -r 1.txt
进入文件,然后输入:ewcover 1.txt
来恢复移动光标
上、下、左、右:k、j、h、l进入和退出
退出:按下
进入:输入
键,输入:q!<回车>
(无保存退出)vimtutor<回车>
行内跳转
w 到下一个单词的开头 e 到下一个单词的结尾 b 到前一个单词的开头 ge 到前一个单词的结尾 0或^ 到行头 $ 到行尾 f<字母> 向后搜索<字母>并跳转到第一个匹配的位置(非常实用) F<字母> 向前搜索<字母>并跳转到第一个匹配的位置 t<字母> 向后搜索<字母>并跳转到第一个匹配位置之前的一个字母(不常用) T<字母> 向前搜索<字母>并跳转到第一个匹配位置之后的一个字母(不常用)
文本编辑
删除命令:
d 操作对象
w 当前光标位置至下一单词起始处,不包括第一个字符 e 当前光标处至单词末尾,包括最后一个字符 $ 当前光标位置至行末
删除光标所在位置字符:按下
x
键删除当前行:输入
dd
键在光标前插入字符:按下
i
键输入字符,按下
键返回正常模式在一行后添加文本:按下
a
键输入必要内容,按下
键返回正常模式保存并退出:输入
:wq<回车>
移动光标至行首:按下
0
键将最后一次删除的内容至于光标之后:按下
p
键重复上一次的命令操作:按下
快速交换光标所在行与它下面的行:输入.(小数点)
ddp
快速调整缩进
>> 整行将向右缩进 << 整行向左回退
- 计数:动作前面输入数字可使其重复多次,可以与命令相结合使用
定位:按下
Ctrl g
键显示当前行信息跳转至文件最后一行:按下
G
键跳转至文件第一行:按下
gg
键跳转至文件某一行:输入
回到之前位置:输入行号 G
键Ctrl o
,输入Ctrl I
跳转到较新位置查找
/icmp 查找字符串icmp n 查找下一个icmp ?tcp 向上查找字符串tcp N 查找上一个出现的tcp \* 寻找游标所在处的单词 \# 同上,但 \* 是向前(上)找,#则是向后(下)找 g\* 同\* ,但部分符合该单词即可 g\# 同\# ,但部分符合该单词即可 % 查找配对的括号
替换
r+<待替换字母> 将游标所在字母替换为指定字母 R 连续替换,直到按下Esc cc 替换整行,即删除游标所在行,并进入插入模式 cw 替换一个单词,即删除一个单词,并进入插入模式 ce 改变文本直至一个单词末尾,并进入插入模式 C(大写) 替换游标以后至行末 ~ 反转游标所在字母大小写 u{n} 撤销一次或n次操作 U(大写) 撤销当前行的所有修改 Ctrl+r redo,即撤销undo的操作
替换匹配串
替换光标所在行的第一个匹配串:输入
s/被替换字符串/替换为的字符串
替换全行匹配串:输入
s/被替换字符串/替换为的字符串/g
替换两行之间所有匹配串:输入
#,#s/被替换字符串/替换为的字符串/g
(#位置为行号)替换文件中所有匹配串:输入
找到文件中所有匹配串,并提示是否替换:输入%s/被替换字符串/替换为的字符串/g
%s/被替换字符串/替换为的字符串/gc
执行外部命令
:!ls 用于显示当前目录的内容 :!rm FILENAME用于删除名为 FILENAME 的文件 :w FILENAME可将当前 VIM 中正在编辑的文件另存为 FILENAME 文件
- 将对文件的改动保存到文件中:输入
v:w 文件名
- 向当前文件中插入另外文件的内容:输入
:r 文件名
- 读取dir命令的输出并将其放置到当前文件的光标位置之后:输入
:r !dir
在光标下面打开新一行并进入插入模式:按下
在光标上面打开新一行并进入插入模式:按下o
键O
键复制和粘贴
普通模式中使用y复制
p(小写)代表粘贴至光标后(下),P(大写)代表粘贴至光标前(上)调整文本位置
:ce(center) 命令使本行内容居中 :ri(right) 命令使本行文本靠右 :le(left) 命令使本行内容靠左
设置
要永久保存配置需要修改vim配置文件
~/.vimrc
,可以打开文件进行修改,不过务必小心不要影响vim正常使用!:set或者:se 显示所有修改过的配置 :set all 显示所有的设定值 :set option? 显示option的设定值 :set nooption 取消当期设定值 :set nu 显示行号 :set ai 自动缩行 :set autowrite(aw) 设置自动存档,默认未打开 :set ts=4 设置一个 TAB 键等于几个空格 :set shiftwidth=10 设置缩进字符数为设置数值 :set background=dark或light 设置背景风格 :set backup(bk) 设置自动备份,默认未打开 : set cindent(cin) 设置C语言风格缩进
可视模式
在普通模式下输入v(小写) 进入字符选择模式,就可以移动光标,光标走过的地方就会选取。再次按下v会后就会取消选取。 在普通模式下输入Shift+v(小写) 进入行选择模式,按下V之后就会把整行选取,您可以上下移动光标选更多的行,同样,再按一次Shift+v就可以取消选取。 在普通模式下输入 Ctrl+v(小写) 这是区域选择模式,可以进行矩形区域选择,再按一次Ctrl+v取消选取。 在普通模式下输入d 删除选取区域内容 在普通模式下输入y 复制选取区域内容
视窗操作
命令行模式下输入:new 打开一个新的vim视窗,并进入视窗编辑一个新文件 命令行模式下输入:sp 1.txt 打开新的横向视窗来编辑1.txt 命令行模式下输入:vsp 2.txt 打开新的纵向视窗来编辑1.txt 普通模式下Ctrl-w s 将当前窗口分割成两个水平的窗口 普通模式下Ctrl-w v 将当前窗口分割成两个垂直的窗口 普通模式下Ctrl-w q 即 :q 结束分割出来的视窗。如果在新视窗中有输入需要使用强制符!即:q! 普通模式下Ctrl-w o 打开一个视窗并且隐藏之前的所有视窗 普通模式下Ctrl-w j 移至下面视窗 普通模式下Ctrl-w k 移至上面视窗 普通模式下Ctrl-w h 移至左边视窗 普通模式下Ctrl-w l 移至右边视窗 普通模式下Ctrl-w J 将当前视窗移至下面 普通模式下Ctrl-w K 将当前视窗移至上面 普通模式下Ctrl-w H 将当前视窗移至左边 普通模式下Ctrl-w L 将当前视窗移至右边 普通模式下Ctrl-w - 减小视窗的高度 普通模式下Ctrl-w + 增加视窗的高度
- 文档加密:输入
vim -x file1
查看帮助文档
普通模式下按F1 打开vim自己预设的帮助文档 命令行模式下输入:h shiftwidth 打开名为shiftwidth的帮助文件 命令行模式下输入:ver 显示版本及参数
gcc编译器
- GNU CC(简称为gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C++和Object C等语言编写的程序。
编译
预处理: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
使用gcc编译一个c程序
1、打开的gvim环境中输入i进入编辑模式,输入代码,保存为hello.c文件
2、在XfceTerminal打开后的界面中输入:
gcc hello.c -o hello
,编译成功,将会在当前目录生成一个可执行文件 hello
gdb调试技术
gdb主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,必须要把调试信息加到可执行文件中。如:
gcc -g hello.c -o hello g++ -g hello.cpp -o hello
- 使用GCC编译时要加“-g”参数,如果没有-g,将看不见程序的函数名和变量名,代替它们的全是运行时的内存地址。
GDB最基本的命令:
gdb programm(启动GDB) b 设断点(要会设4种断点:行断点、函数断点、条件断点、临时断点) run 开始运行程序 bt 打印函数调用堆栈 p 查看变量值 c 从当前断点继续运行到下一个断点 n 单步运行 s 单步运行 quit 退出GDB display 跟踪变量值的改变 until 跳出循环 finish 跳出函数 help 帮助
- GDB的n(next)命令让GDB执行下一行,然后暂停。 s(step)命令的作用与此类似,只是在函数调用时step命令会进入函数。
- 在 gdb 命令行界面可以执行外部的 Shell 命令:输入
(gdb) !shell 命令
list:显示源文件中的代码
list 行号 显示某一行附近的代码 list 文件名 : 行号 显示某一个文件某一行附近的代码 list 函数名 显示某个函数附近的代码
break:用来设置断点
break 行号 断点设置在该行开始处,注意:该行代码未被执行 break 文件名 : 行号 适用于有多个源文件的情况。 break 函数名 断点设置在该函数的开始处,断点所在行未被执行 break 文件名 : 函数名 适用于有多个源文件的情况
使用gdb调试c程序
1、打开的gvim环境中输入i进入编辑模式,输入代码,保存为gdb.c文件
2、在XfceTerminal打开后的界面中输入:
gcc –g gdb.c -o testgdb
,生成一个可执行文件testgdb3、输入
gdb testgdb
启动gdb4、键入 l命令
(gdb) l
相当于list命令,从第一行开始列出源码5、设置断点:
(gdb) break 16
:设置断点,在源程序第16行处;(gdb) break func
:设置断点,在函数func()入口处。6、输入
(gdb) info break
查看断点信息。7、输入
(gdb) r
运行程序,run命令简写8、输入
(gdb) n
单条语句执行,next命令简写。9、输入
(gdb) c
继续运行程序,continue命令简写。10、输入
(gdb) p i
打印变量i的值,print命令简写。11、输入
(gdb) bt
查看函数堆栈。12、输入
(gdb) finish
退出函数。
makefile
- Makefile带来的好处就是——“自动化编译”,一但写好,只需要一个 make 命令,整个工程便可以完全编译,极大的提高了软件的开发效率。
- make工具最主要也是最基本的功能就是根据makefile文件中描述的源程序至今的相互关系来完成自动编译、维护多个源文件工程。而makefile文件需要按某种语法进行编写,文件中需要说明如何编译各个源文件并链接生成可执行文件,要求定义源文件之间的依赖关系。
Makefile 基本规则
1、打开的gvim环境中输入i进入编辑模式,输入代码,保存为prog.c、 code.c、 code.h文件
2、输入
vim Makefile
,输入i进入编辑模式,输入代码并保存3、输入
make
,进行自动化编译
Makefile还可以定义和使用宏(也称做变量),从而使其更加自动化,更加灵活,在Makefile中定义宏的格式为:
macroname = macrotext
,使用宏的格式为:(macroname)
计算机系统
- 信息就是位+上下文,都是由一串位表示的,区分不同数据对象的唯一方法是我们读到这些数据对象时的上下文。ASCII字符构成的文件是文本文件,所有其他文件都是二进制文件。
- 文件是字节序列
- Hello程序的生命周期从高级C语言程序开始,每条C语句被转化为一系列“低级机器语言”指令,然后这些指令按照“可执行目标程序”的格式打包,并以二进制磁盘文件的形式存放起来,目标程序也称为“可执行目标文件”。
- 源文件到目标文件的转化由编译器驱动程序完成:
gcc -o hello hello.c
GCC编译器驱动程序读取源文件并把它翻译成一个可执行目标文件。翻译过程分为四个阶段:预处理、编译、汇编、链接,预处理器、编译器、汇编器、链接器一起构成编译系统。 - 计算机系统是由硬件和系统软件组成的,程序被其他程序翻译成不同的形式,开始时是ASCII文本,然后被编译器和链接器翻译成二进制可执行文件
- 系统的硬件组成:总线、I/O设备、内存、处理器
- 并发:一个同时具有多个活动的系统。
- 并行:用并发使一个系统运行地更快,并行可以在计算机系统多个抽象层次上运用。按照系统层次结构由高到低的顺序强调三个层次:线程级并发、指令级并行、单指令多数据并行
- 处理器读取并解释存放在主存里的二进制指令
操作系统内核是应用程序和硬件之间的媒介,提供三个基本的抽象:
文件是对I/O设备的抽象 虚拟存储器是对主存和磁盘的抽象 进程是对处理器、主存和I/O设备的抽象
网络提供了计算机系统之间通信的手段
链接
- 静态链接器主要任务:符号解析、重定位
- 目标文件形式:可重定位目标文件、可执行目标文件、共享目标文件
每个可重定位目标模块m都有一个符号表,它包含m所定义和引用的符号的信息。有三种不同的符号:
由m定义并能被其他模块引用的全局符号 由其他模块定义并被模块m引用的全局符号 只被模块m定义和引用的本地符号
课后作业中的问题和解决过程
问题1:点开
《深入理解计算机系统V2》学习指导
的链接后,打开的目录是《深入理解计算机系统V2》这本书的,但是内容却都是上学期使用的《Java学习笔记(第8版)》的……
- 问题3:点开
GDB 简明教程
的链接发现是会员课程,然而我不是会员,所以只能预览一部分课程。 问题4:在用gcc编译c程序时输入
解决方法:后来发现是因为和前一个可执行文件重名了,改变命令为gcc hello_print.c hello_main.c -o hello
后再查看主文件夹时发现没有多出来新的可执行文件hello,也没有报错。gcc hello_print.c hello_main.c -o hello_2
后生成了一个可执行文件hello_2,运行正确。
本周代码托管截图
其他(感悟、思考等,可选)
本周主要是学习了vim的使用方法、gcc的使用方法、gdb的使用方法、makefile的基础、计算机系统和链接。其中,vim的使用方法重点在于练习,只有经过不断地练习才能熟练掌握并使用。gcc、gdb和makefile的使用方法有一定的命令格式和规则,只要遵循其规则格式就能够简单编译、运行、调试程序。计算机系统的相关知识重点在于记忆和理解,链接里面的用语有些生涩,一下子我并不能完全理解,还需要再仔细看看并理解。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第零周 | 0/0 | 1/1 | 15/15 | 虚拟机 |
第一周 | 0/0 | 1/2 | 25/40 | Linux命令 |
第二周 | 62/62 | 1/3 | 25/65 | vim、gcc、gdb、makefile |
参考资料
- 《深入理解计算机系统V2》学习指导
- 《深入理解计算机系统》实验楼课程
- 《Vim编辑器》实验楼课程
- 《 Linux系统编程》实验楼课程
- ...