20145231熊梓宏《信息安全系统设计基础》第二周学习总结
20145231信息安全系统设计基础第2周学习总结
教材学习内容总结
第一章 计算机系统漫游
(每小节基本内容概括)
1.1 信息就是位+上下文
文本文件:由ASCII字符构成的文件
二进制文件:其他文件
在不同的上下文中,一个同样的字节序列可能表示不同信息
1.2 程序被其他程序翻译成不同的格式
从源文件到目标文件的转化是由编译器驱动程序完成gcc -o hello hello.c
编译系统:预处理器、编译器、汇编器和链接器
预处理阶段:.c->.i
,根据以字符#开头的命令,修改原始的C程序
编译阶段:.i->.s
,汇编语言程序
汇编阶段:.s->
机器语言指令,打包成可重定位目标程序
链接阶段:可重定位目标程序->可执行目标程序
1.3 了解编译系统如何工作是大有益处的
知道编译系统是如何工作的:优化程序性能、理解链接时出现的错误、避免安全漏洞
1.4 处理器读并解释存储在存储器中的指令
shell命令行解释器,输入的命令行第一个单词不是内置的外壳命令,那么外壳就会假设这是一个可执行文件的名字
1.4.1 系统的硬件组成
总线:贯穿整个系统的一组电子管道,携带信息字节并负责在各个部件间传递
I/O设备: 系统与外界的联系通道,通过一个控制器或适配器与I/O总线相连
主存:临时存储设备,处理器执行程序时,用来存放程序和程序处理的数据,由一组动态随机存取存储器(DRAM)芯片组成
处理器:中央处理单元(CPU),解释(或执行)存储在主存中的指令的引擎
1.4.2 运行hello程序
1.5 高速缓存至关重要
高速缓存存储器:静态随机访问存储器(SRAM)实现
1.6 存储设备形成层次结构
每个计算机系统中的存储设备都被组织成了一个存储器层次结构
一层上的存储器作为低一层存储器的高速缓存
1.7 操作系统管理硬件
操作系统两个基本功能:1)防止硬件被失控的应用程序滥用 2)向应用程序提供简单一致的机制来控制复杂而大相径庭的低级硬件设备
操作系统通过几个基本的抽象概念(进程、虚拟存储器和文件)来实现这两个功能
1.7.1 进程
对处理器、主存和I/O设备的抽象表示
进程是操作系统对一个正在运行的程序的的一种抽象
并发运行:一个进程的指令和另一个进程的指令是交错进行的
上下文切换:操作系统实行交错执行的机制
1.7.2 线程
一个进程实际上可以由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据
1.7.3 虚拟存储器
虚拟存储器是一个抽象概念,为每个进程提供了一个假象,即每个进程都在独占地使用主存
每个进程看到的是一致的存储器,称为虚拟地址空间
程序代码和数据:代码和数据区是直接按照可执行目标文件的内容初始化的
堆:堆可以在运行时动态地扩展和收缩
共享库:存放共享库的代码和数据的区域
栈:位于用户虚拟地址空间顶部的是用户栈,编译器用他实现函数调用,用户栈在程序执行期间可以动态地扩展和收缩
内核虚拟存储器:内核总是驻留在内存中,是操作系统的一部分,地址空间顶部区域为内核保留
1.7.4 文件
文件是字节序列,I/O设备的虚拟表示
系统中的所有输入输出都是通过使用一小组称为Unix I/O的系统函数调用读写文件来实现的
1.8 系统之间利用网络通信
1.9 重要主题
1.9.1 并发和并行
并发:一个同时具有多个活动的系统
并行:用并发使一个系统运行得更快
线程级并发:多处理器系统(由单操作系统内核控制的多处理器系统)要求程序是以多线程的方式来书写的,这些线程也可以并行的高效执行
指令级并行:现代处理器可以同时执行多条指令的属性 超标量处理器:处理器可以达到比一个周期一条指令更快的执行速率
单指令、多数据并行:允许一条指令产生多个可以并行执行的操作
1.9.2 计算机系统中抽象的重要性
第七章 链接
链接:将各种代码和数据部分收集起来并组合成为一个单一文件的过程,文件可以被加载到存储器并执行
7.1 编译器驱动程序
7.2 静态链接
链接器两个主要任务:符号解析、重定位
7.3 目标文件
可重定位目标文件:包含二进制代码和数据
可执行目标文件:可直接被拷贝到存储器并执行
共享目标文件:特殊类型的可重定位目标文件,可以在加载或者运行时被动态地加载到存储器并链接
目标文件格式:a.out COFF
(一般目标文件格式) PE
(可移植可执行) ELF
(可执行可链接)
7.4 可重定位目标文件
7.5 符号和符号表
全局符号
外部符号
本地符号
7.6 符号解析
7.6.1 链接器如何解析多重定义的全局符号
强符号:函数和已初始化的全局变量
弱符号:未初始化的全局变量
处理多重定义符号规则:1.不允许有多个强符号 2.一个强符号和多个弱符号,选择强符号 3.多个弱符号,从弱符号中任意选择一个
7.6.2 与静态库链接
静态库:编译系统将所有相关目标文件打包成一个单独文件,可用作链接器的输入
静态库以一种称为存档的特殊文件格式存放在磁盘中,存档文件名由后缀.a标识
创建静态库:使用AR工具gcc -c XX.c ar rcs libXX.a
(静态库名) XX.o
(添加的程序)
使用静态库:编译连接输入文件和静态库gcc -O2 -c XX.c
(调用静态库程序名) gcc -static -o p2 XX.o
(调用静态库程序名) libXX.a
(静态库)
7.6.3 链接器如何使用静态库来解析引用
7.7 重定义
合并输入模块并为每个符号分配运行时的地址
重定义时两步:重定位节和符号定义 重定位节中的符号引用
7.7.1 重定位条目
汇编器遇到对最终位置未知的目标引用
7.7.2 重定位符号引用
重定位符号引用
重定位绝对引用
7.8 可执行目标文件
7.9 加载可执行目标文件
7.10 动态链接共享库
共享库(共享目标):目标模块,在运行时,可以加载到任意的存储地址,过程称为动态链接,由动态链接程序执行
共享库的生成 gcc -fPIC -c xxx.c
gcc -shared -o libxxx.so xxx.o
共享库的使用:gcc -o main main.c -L. -lxxx
7.11 从应用程序中加载和链接共享库
分发软件
构建高性能的Web服务器
7.12 与位置无关的代码(PIC)
编译库代码:与位置无关的代码,使用-fPIC选项指示GNU编译系统生成PIC代码
PIC数据引用
全局偏移量表
PIC函数调用
7.13 处理目标文件的工具
AR
:创建静态库,插入、删除、列出和提取成员
STRINGS
:列出一个目标文件中所有可打印的字符串
STRIP
:从目标文件中删除符号表信息
NM
:列出一个目标文件的符号表中定义符号
SIZE
:列出目标文件中节的名字和大小
READELF
:显示一个目标文件的完整结构,包含SIZE和NM的功能
OBJDUMP
:所有二进制工具之母,显示一个目标文件的所有信息,反汇编
LDD
:列出一个可执行文件在运行时所需要的共享库
实验楼学习总结
vim学习总结
vim启动进入普通模式,处于插入模式或命令行模式时只需要按Esc或者Ctrl+[(这在vim课程环境中不管用)即可进入普通模式。普通模式中按i(插入)或a(附加)键都可以进入插入模式,普通模式中按:进入命令行模式。命令行模式中输入wq回车后保存并退出vim。
命令行模式(Command line mode)
在命令行模式中可以输入会被解释成并执行的文本。例如执行命令(:键),搜索(/和?键)或者过滤命令(!键)。在命令执行之后,Vim返回到命令行模式之前的模式,通常是普通模式。
在普通模式中,用的编辑器命令,比如移动光标,删除文本等等。这也是Vim启动后的默认模式。这正好和许多新用户期待的操作方式相反(大多数编辑器默认模式为插入模式)。
在这个模式中,大多数按键都会向文本缓冲中插入文本。大多数新用户希望文本编辑器编辑过程中一直保持这个模式。
使用vim命令进入vim界面
vim后面加上你要打开的已存在的文件名或者不存在(则作为新建文件)的文件名。 打开Xfce终端,输入以下命令
$ vim practice_1.txt
直接使用vim也可以打开vim编辑器,但是不会打开任何文件。
$ vim
进入命令行模式后输入:e 文件路径 同样可以打开相应文件。
.游标移动
在进入vim后,按下i键进入插入模式。在该模式下您可以输入文本信息,下面请输入如下三行信息:
12345678
abcdefghijk
shiyanlou.com
按Esc进入普通模式,在该模式下使用方向键或者h,j,k,l键可以移动游标。
按键 说明
h 左
l 右(小写L)
j 下
k 上
w 移动到下一个单词
b 移动到上一个单词
请尝试在普通模式下使用方向键移动光标到shiyanlou这几个字母上面。(附图)
.进入插入模式
在普通模式下使用下面的键将进入插入模式,并可以从相应的位置开始输入
命令 说明
i 在当前光标处进行编辑
I 在行首插入
A 在行末插入
a 在光标后插入编辑
o 在当前行后插入一个新行
O 在当前行前插入一个新行
cw 替换从光标所在位置后到一个单词结尾的字符(删除从当前光标后到单词结尾字母)
请尝试不同的从普通模式进入插入模式的方法,在最后一行shiyanlou前面加上www.,注意每次要先回到普通模式才能切换成以不同的方式进入插入模式(附图)
命令行模式下保存文档
从普通模式输入:进入命令行模式,输入w回车,保存文档。输入:w 文件名可以将文档另存为其他文件名或存到其它路径下
命令行模式下退出vim
从普通模式输入:进入命令行模式,输入wq回车,保存并退出编辑
以下为其它几种退出方式:
命令 说明
:q! 强制退出,不保存
:q 退出
:wq! 强制保存并退出
:w <文件路径> 另存为
:saveas 文件路径 另存为
:x 保存并退出
:wq 保存并退出
普通模式下退出vim
普通模式下输入Shift+zz即可保存退出vim
删除文本
普通模式下删除vim文本信息
进入普通模式,使用下列命令可以进行文本快速删除:
命令 说明
x 删除游标所在的字符
X 删除游标所在前一个字符
Delete 同x
dd 删除整行
dw 删除一个单词(不适用中文)
d$或D 删除至行尾
d^ 删除至行首
dG 删除到文档结尾处
d1G 删至文档首部
除此之外,你还可以在命令之前加上数字,表示一次删除多行,如:
2dd表示一次删除2行
GDB 常用命令实战
GDB 相关概念
GDB, 是 The GNU Project Debugger 的缩写, 是 Linux 下功能全面的调试工具。GDB 支持断点、单步执行、打印变量、观察变量、查看寄存器、查看堆栈等调试手段。在 Linux 环境软件开发中,GDB 是主要的调试工具,用来调试 C 和 C++ 程序。
如果要调试程序,需要在 gcc 编译可执行程序时加上 -g 参数,首先我们编译 bugging.c 程序,生成可执行文件:
1.gcc -g -o bugging bugging.c -m32
其中-o
指定输出文件名, -m32 表示构建32位可执行程序,实验楼的环境是 64 位的 Ubuntu 14.04,所以默认会编译为 64 位的程序。
2.输入 gdb bugging
进入 gdb 调试 bugging 程序的界面:
3.gdb bugging
在 gdb 命令行界面,输入run 执行待调试程序:
4.(gdb) run
在 gdb 命令行界面,输入quit 退出 gdb:
5.(gdb) quit
(附图)
GDB 命令行界面使用技巧
命令补全
任何时候都可以使用 TAB 进行补全,如果只有一个待选选项则直接补全;否则会列出可选选项,继续键入命令,同时结合 TAB 即可快速输入命令。
部分 gdb 常用命令一览表
命令 简写形式 说明
list l 查看源码
backtrace bt、where 打印函数栈信息
next n 执行下一行
step s 一次执行一行,遇到函数会进入
finish 运行到函数结束
continue c 继续运行
break b 设置断点
info breakpoints 显示断点信息
delete d 删除断点
print p 打印表达式的值
run r 启动程序
until u 执行到指定行
info i 显示信息
help h 帮助信息
查询用法
在 gdb 命令行界面,使用 (gdb) help command
可以查看命令的用法。
执行 Shell 命令
在 gdb 命令行界面可以执行外部的 Shell 命令:
(gdb) !shell
命令
例如查看当前目录的文件:
`(gdb) !l