第一章 计算机系统漫游shell
(每小节基本内容归纳)vim
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