20145219 《信息安全系统设计基础》第02周学习总结

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

  • 进入和退出

    退出:按下<Esc>键,输入:q!<回车>(无保存退出)

    进入:输入vimtutor<回车>

  • 行内跳转

      w	到下一个单词的开头
      e	到下一个单词的结尾
      b	到前一个单词的开头
      ge	到前一个单词的结尾
      0或^	到行头
      $	到行尾
      f<字母>	向后搜索<字母>并跳转到第一个匹配的位置(非常实用)
      F<字母>	向前搜索<字母>并跳转到第一个匹配的位置
      t<字母>	向后搜索<字母>并跳转到第一个匹配位置之前的一个字母(不常用)
      T<字母>	向前搜索<字母>并跳转到第一个匹配位置之后的一个字母(不常用)
    
  • 文本编辑

    删除命令:d 操作对象

      w	当前光标位置至下一单词起始处,不包括第一个字符
      e	当前光标处至单词末尾,包括最后一个字符
      $	当前光标位置至行末
    

    删除光标所在位置字符:按下x

    删除当前行:输入dd

    在光标前插入字符:按下i键输入字符,按下<Esc>键返回正常模式

    在一行后添加文本:按下a键输入必要内容,按下<Esc>键返回正常模式

    保存并退出:输入: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

    3、继续输入:./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,生成一个可执行文件testgdb

    3、输入gdb testgdb 启动gdb

    4、键入 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退出函数。

    13、输入(gdb) q退出gdb

makefile

  • Makefile带来的好处就是——“自动化编译”,一但写好,只需要一个 make 命令,整个工程便可以完全编译,极大的提高了软件的开发效率。

  • make工具最主要也是最基本的功能就是根据makefile文件中描述的源程序至今的相互关系来完成自动编译、维护多个源文件工程。而makefile文件需要按某种语法进行编写,文件中需要说明如何编译各个源文件并链接生成可执行文件,要求定义源文件之间的依赖关系。

  • Makefile 基本规则

    1、打开的gvim环境中输入i进入编辑模式,输入代码,保存为prog.c、 code.c、 code.h文件

    2、输入vim Makefile,输入i进入编辑模式,输入代码并保存

    3、输入make,进行自动化编译

    4、执行./test查看结果

  • 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版)》的……

  • 问题2:练习vim的替换命令s/被替换字符串/替换为的字符串时不成功,输入之后没有任何反应。

  • 问题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,运行正确。

  • 问题5:用 “宏” 的方式,来改写 Makefile 例子时不成功,应该是我哪个步骤理解的不对,但是我不知道怎么改正。

本周代码托管截图

其他(感悟、思考等,可选)

本周主要是学习了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

参考资料

原文地址:https://www.cnblogs.com/20145219songge/p/5906602.html