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

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

教材学习内容总结

VIM编辑器

  • 大写“K”可以用来查找函数的帮助信息:查看 man page,命令模式下,将光标放在函数名上,按"K"可以直接察看 man page。

  • 几个设置

  • :set nu 显示行号

  • :set ai 自动缩行

  • :set ts=4 设置一个 TAB 键等于几个空格

  • 移动光标

  • [[ 转到上一个位于第一列的"{"

  • ]] 转到下一个位于第一列的"{"

  • { 转到上一个空行

  • } 转到下一个空行

  • gd 转到当前光标所指的局部变量的定义

  • 练习vimtutor

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的参数连起来是“ESc”,相应输入的文件的后缀是“iso”

GCC编译器的使用

  1. Linux的可执行文件并没有像 Windows 那样有明显的.exe后缀名, 只需向其分配x(可执行)权限即可 sudo chmod u+x excutefile
  2. 作为Linux程序员,我们可以让gcc在编译的任何阶段结束,以便检查或使用该阶段的输出(这个很重要)
  3. 执行hello
  • $gcc hello.c -o hello,第二个hello为程序名
  • -o选项可以省略很多中间步骤一次性输出可执行文件

gdb调试程序工具

  • gdb主要调试的是C/C++的程序。要调试C/C++的程序,首先在编译时,必须要把调试信息加到可执行文件中。使用编译器(cc/gcc/g++)的 -g 参数即可。
  • 如果没有-g,将看不见程序的函数名和变量名,代替它们的全是运行时的内存地址。

cgdb

  • gdb programm(启动GDB)
  • b 设断点(要会设4种断点:行断点、函数断点、条件断点、临时断点)
  • run 开始运行程序
  • bt 打印函数调用堆栈
  • p 查看变量值
  • c 从当前断点继续运行到下一个断点
  • n 单步运行
  • s 单步运行
  • quit 退出GDB
  • GDB的n(next)命令让GDB执行下一行,然后暂停。 s(step)命令的作用与此类似,只是在函数调用时step命令会进入函数,所以优先使用n
  • display 跟踪变量值的改变
  • until 跳出循环
  • finish 跳出函数
  • help 帮助

Makefile自动化编译

通过合理有效的划分,将一个项目分解为多个易于处理的文件,是非常明智的做法,多文件的管理方式是非常正确的选择。一个工程中的源文件不计其数,按其类型、功能、模块分别放在若干个目录中。makefile带来的好处就是——“自动化编译”,一但写好,只需要一个make命令,整个工程完全编译,极大的提高了软件的开发效率。make是一个命令工具,是一个执行makefile中命令的工具程序。

一个Makefile文件主要含有一系列的规则,每条规则包含一下内容:

  • 一个目标,即make最终需要创建的文件,如可执行文件和目标文件;目标也可以是要执行的动作,如‘clean’;
  • 一个或多个依赖文件的列表,通常是编译目标文件所需要的其他文件。
  • 之后的一系列命令,是make执行的动作,通常是把指定的相关文件编译成目标文件的编译命令,每个命令占一行,并以tab开头(初学者务必注意:是tab,而不是空格)

( 执行以上Makefile后就会自动化编译)

C语言程序编译过程

  • 预处理:gcc –E hello.c –o hello.i;gcc –E调用cpp(加上C语言的库,成为另一个C语言文件)
  • 编 译: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 (加上函数文件)

运行程序

  • 初始时,外壳程序执行它的指令,等待我们输入命令;
  • 输入命令后,shell把命令读入,放在存储器中;
  • 然后。shell将目标文件从磁盘复制到主存
  • cpu开始执行main程序中的机器语言指令
  • 这些指令将字符串从主存复制到寄存器,再从寄存器复制到显示设备上,显示中屏幕上。

计算机系统

  1. 高速缓存可以被用来提高程序性能;存储器层次结构的主要思想是上一层作为第一次存储器的高速缓存。
  2. 操作系统进行硬件管理,为程序服务。
  3. 进程是操作系统对一个正在运行的程序的一种抽象。
  4. 一个进程可以有很多线程
  5. 虚拟存储器(汇编里面的存储器)
  6. 系统是硬件和系统软件相互交织的集合体

链接

链接是将各种代码和数据部分搜集起来并组合成为一个单一文件的过程,这个文件可以被加载到存储器并执行。

  • 怀疑有多重定义错误时,用GCC-fno-common这样的选项调用连接器,这样连接器在遇到多重定义的全局符号时,输出警告。

教材学习中的问题和解决过程

git失败,更换目录,添加密钥,更换地址后解决

git的一般步奏

  • git add .
  • git commit -m "提交的描述信息"
  • git push origin master

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 20/200 1/2 20/20
第二周 30/500 2/4 28/38
第三周 0/1000 0/4 0/60
第四周 0/1300 0/4 0/90

参考资料

原文地址:https://www.cnblogs.com/5315hejialei/p/5906999.html