man -k
格式:man -k k1||grep k2 ||grep 2
最后的数字意味着帮助手册中的区段,man手册共有8个区段,最常用的是123,含义如下:
1.Linux
2.系统调用
3.c语言
grep -nr
这条语句可以用来查找关键字,全文搜索,并且可以直接查找文件内的内容。其中:
n:为显示行号
r:为递归查找
如果想查找某个宏,我们已知宏保存在include文件夹中,所以可以使用下列语句:
grep -nr XXX /usr/include(XXX为所要找的宏)
cheat:cheat是在GNU通用公共许可证下,为Linux命令行用户发行的交互式备忘单应用程序。它提供显示Linux命令使用案例,包括该命令所有的选项和简短但尚可理解的功能。
find:查找文件或目录。
locate:查找文件位置。
whereis:查找文件。
which:查找文件。
apt-get:安装软件或更新。
groups:查找当前登录用户所属的用户组。
chmod:修改文件的权限。
*rm:删除文件。
cat:查看文件。
vim是一种非常好用的编辑器,总共有六种基本模式,最常用的是普通模式、插入模式和命令行模式。需要熟悉这三种模式之间的切换方式:
普通→插入: i 或 a
插入→普通: Esc 或 Ctrl + [
普通→命令行: :
命令行→普通:Esc 或 Ctrl + [
常用的进入、保存和退出指令:
进入:vim 文件名
保存:命令行模式 :w
退出:命令行模式 :q
常用动作:
删除:dd删除整行
复制:yy复制整行
粘贴:p
※实用功能:交换上下行——ddp,快速交换光标所在行与它下面的行。
vim的功能很强大,并且可以移植到很多种不同的程序中,但是我们现在使用的过程中真正用到的命令很少也很简单,更多的技巧参见第二周笔记。
gcc
常用选项
-c 只编译不链接,生成目标文件.o
-S 只编译不汇编,生成汇编代码
-E 只进行预编译,不做其他处理
-g 在可执行程序中包含标准调试信息
-o file 将file文件指定为输出文件
-v 打印出编译器内部编译各过程的命令行信息和编译器的版本
-I dir 在头文件的搜索路径列表中添加dir目录
编译过程
预处理: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** 创建可执行目标文件
-o后面是接的你给生成的文件指定的名字,如果不指定,则默认为a.out
在命令行上运行这个可执行目标文件需要输入它的名字:
./a.out
其中./代表当前目录。
gdb
注意:使用GCC编译时要加“-g”参数,然后才能够用gdb调试
GDB最基本的命令有:
gdb programm(启动GDB)
l 查看所载入的文件
b 设断点
info b 查看断点情况
run 开始运行程序
bt 打印函数调用堆栈
p 查看变量值
c 从当前断点继续运行到下一个断点
n 单步运行(不进入)
s 单步运行(进入)
quit 退出GDB
四种断点:
1.行断点
b [行数或函数名] <条件表达式>
2.函数断点
b [函数名] <条件表达式>
3.条件断点
b [行数或函数名]
4.临时断点
tbreak [行数或函数名] <条件表达式>
另外的调试工具:
cgdb,有单独的debug窗口,更方便查看
ddd,图形页面
Make和Makefile
这是实现自动化编译的好方法。
Makefile的一般写法:
一个Makefile文件主要含有一系列的规则,每条规则包含以下内容:
•需要由make工具创建的目标体,通常是可执行文件和目标文件,也可以是要执行的动作,如‘clean’;
•要创建的目标体所依赖的文件,通常是编译目标文件所需要的其他文件。
•创建每个目标体时需要运行的命令,这一行必须以制表符TAB开头
格式为:
test(目标文件): prog.o code.o(依赖文件列表)
tab(至少一个tab的位置) gcc prog.o code.o -o test(命令)
.......
即:
target: dependency_files
command
定义变量的两种方式:
(1)递归展开方式
VAR=var
(2)简单方式
VAR:=var
使用变量的格式为:
$(VAR)
静态库(以linux为例)
创建该库:
gcc -c addvec.c multvec.c
ar rcs libvector.a addvec.o multvec.o
涉及到的参数所做动作:
gcc -c只编译,不连接成为可执行文件。
即:把.c文件编译成.o文件
ar -r:在库中插入模块(替换)
-c:创建一个库
-s:写入一个目录文件索引到库中
即:把两个.o文件归档成静态库存档文件.a并且写入目录文件索引到库中
创建它的可执行文件
gcc -02 -c main2.c
gcc -static -o p2 main2.o ./libvector.a
相关参数含义:
gcc -02 和-0都是代码优化指令,可以减少编译时间
-c 只编译,不连接成为可执行文件
-static 告诉编译器驱动程序,链接器应该构建一个完全链接的可执行目标文件
-o 命名生成文件
动态库(linux)
构造创建共享库:
gcc -shared -fPIC -o libvector.so addvec.c multvec.c
参数解析:
-fPIC 指示编译器生成与位置无关的代码
-shared 指示链接器创建一个共享的目标文件
-o 命名生成文件
把.c文件编译成为.o文件,放入新建的共享库中,并且命名。
链接程序
gcc -o p2 main2.c ./libvector.so
创建一个可执行目标文件p2,在运行时可以和动态库libverctor.so链接。
存储器层次结构的主要思想是上层存储器作为下层存储器的 高速缓存 。
操作系统中最基本的四个抽象是 虚拟机、进程、虚拟存储器、文件 。
抽象是CS中一个重要的概念,在出来器里, 指令集结构 提供了对实际处理器的抽象。
并行的三个层次包含A 线程级并发 B指令级并行 C SIMD
从i386开始,x86体系结构扩展到了32位,增加了 平坦 寻址模式
在64位机器上,要用gcc编译出32位机器码,需要使用 -m32 选项
对于机器级编程来说,两种重要的抽象是 ISA,虚拟地址
Linux中,对目标代码code.o进行反汇编的命令是 objdump -d code.o
IA32指令中,操作数的三种类型是 立即数、寄存器、存储器
C语言中的条件表达式在汇编中是结合 有条件跳转和无条件跳转 实现的。
C语言中的循环结构可以用 条件测试和跳转组合起来 实现。
栈用来 A 传递参数 B 存储返回信息 C保存寄存器 D本地存储。
Linux汇编中,形成空调用栈帧的语句是 push %ebp movl %esp %ebp
Linux汇编中,函数有返回值存在 %eax 寄存器中。
Y86中,使用时钟寄存器保存程序计数器PC、条件代码CC和 程序状态Stat
实现一个数字系统需要三组成部分 组合逻辑、存储器元素、时钟信号 。
Y86中,指令执行分为六个阶段 取指、译码、执行、访存、写回、更新PC
创建Y86代码唯一的工具是 汇编器 or YAS
存储层次结构的中心思想是 上层作为下层的缓存 。
缓存不命时,决定哪个块是牺牲块由 替换策略 来控制。
空缓存的不命中叫 强制性不命中或冷不命中
容量不命中的原因是 缓存太小
高速缓存结构可以用元组 S,E,B,m 来描述。
逻辑磁盘块的逻辑块号可以翻译成一个 盘面、磁道、扇区 三元组。
CPU使用 存储器映射I/O 技术向I/O设备发出命令。
局部性有两种形式 时间局部性、空间局部性 。
根据携带信号不同,总线可分为 数据总线、地址总线、控制总线 三种。
对磁盘扇区的访问时间包括三个部分 寻道时间、旋转时间、传送时间 。
gcc -f PIC xxx.c 中的PIC的意思是 位置无关的代码 or Position-Independent Code
链接器的两个主要任务是 符号解析和重定位 。
加载器 将可执行文件的内容映射到存储器,并运行这个程序。
Linux中,反汇编.text节中的二进制指令使用的工具是 objdump
参考资料:http://www.cnblogs.com/20135202yjx/p/4926597.html和http://group.cnblogs.com/topic/73060.html以及自己以前的博客
通过半个学期的学习,首先认识了自己的不足和知识的欠缺,其中包括对学习过得知识的掌握程度的匮乏,以及自我学习能力的薄弱。然后正视了自己的学习态度,就像老师说过得“教练与学员的关系”,听说了一些新鲜的知识,比如学习源知识等等,对我们学习,思考以及生活都有许多启示吧。两个月的学习是有点痛苦的,但回头看确实学到了些许知识,随没有完全深入理解计算机系统,但也掌握了一些学习的基本方法,Linux完全是一个新的开始,掌握了gcc,vim 的基本操作,以及没有学好的c语言,汇编的知识的回顾。从二级制开始到汇编一步一步深入的了解了计算机,还了解的处理器一级存储器的简单知识。总的来说还是很有收获。
收获中不足还是很多:时常后悔自己没有学习好以前的知识,和及时的复习,并且自己的学习模式有问题,对知识缺少一种打破砂锅问到底的执著,比如程序的机器级表示中的条件码和一些语句指令还不是很通透的,对存储器的机构也没有系统了解。同时缺少主动学习的积极性吧,可能跟性格有关吧。但是自己在后的学习中会更加努力的,增加学习的主动性,毕竟掌握一种知识还是很有用途。