知识点总结
第一周
l Man命令:man
是manul的缩写,我们可以通过man man来查看man
的帮助,如下图: man
有一个-k
选项用起来非常好,这个选项让你学习命令,编程时有了一个搜索引擎,可以举一反三。 我们通过一个例子来说明,比如数据结构中学过排序(sort),我不知道C语言中有没有完成这个功能的函数,可以通过“man -k sort”来搜索,因为是找C库函数,我们关注带3的,qsort好像是个好选项。
l Cheat命令:cheat是作弊,小抄的意思。cheat命令是在GNU通用公共许可证下,为Linux命令行用户发行的交互式备忘单应用程序。它提供显示Linux命令使用案例,包括该命令所有的选项和简短但尚可理解的功能。
l find查找一个文件在系统中的什么位置,locate是神速版本的find(Windows下有个Everything工具和locate类似).grep 可以对文件全文检索,支持正则表达式,正则表达式也是一个重要的元知识whereis,which告诉你使用的命令工具装在什么地方。
Linux基础:1)重要快捷键:
l [tab]补全命令,补全目录,补全命令参数等等
l [Ctrl+c]强行终止当前程序,不退出终端
l [Ctrl+d] 键盘输入结束或退出终端
l [Ctrl+s] 暂定当前程序,暂停后按下任意键恢复运行
l [Ctrl+z] 将当前程序放到后台运行,恢复到前台为命令fg
l [Ctrl+a] 将光标移至输入行头,相当于Home键
l [Ctrl+e] 将光标移至输入行末,相当于End键
l [Ctrl+k] 删除从光标所在位置到行末
l [Alt+Backspace] 向前删除一个单词
l [Shift+PgUp] 将终端显示向上滚动
l [Shift+PgDn] 将终端显示向下滚动
2) 历史输入命令
l ↑可以恢复你输入过的指令
3) 通配符
l 通配符是一种特殊语句,主要有星号(*)和问号(?),用来对对字符串进行模糊匹配(比如文件名,参数名)。当查找文件夹时,可以使用它来代替一个或多个真正字符;当不知道真正字符或者懒得输入完整名字时,常常使用通配符代替一个或多个真正的字符。
l grep命令的常用参数:
参数 说明
-b 将二进制文件作为文本来进行匹配
-c 统计以模式匹配的数目
-i 忽略大小写
-n 显示匹配文本所在行的行号
-v 反选,输出不匹配行的内容
-r 递归匹配查找
-A n n为正整数,表示after的意思,除了列出匹配行之外,还列出后面的n行
-B n n为正整数,表示before的意思,除了列出匹配行之外,还列出前面的n行
--color=auto 将输出中的匹配项设置为自动颜色显示
第二周
l Vim编辑器:
1.普通模式
Vim的普通模式用的编辑器命令,比如移动光标,删除文本等等。这也是Vim启动后的默认模式,而不是大多数编辑器的插入模式。
普通模式命令往往需要一个操作符结尾。
普通模式进入插入模式的方法:a键(append/追加)键或者i(insert/插入)键。
2.插入模式
在这个模式中,大多数按键都会向文本缓冲中插入文本。大多数新用户希望文本编辑器编辑过程中一直保持这个模式。
插入模式中回到普通模式:ESC键。
3.可视模式
与普通模式类似,但移动命令会扩大高亮的文本区域。高亮区域可以是字符、行或者是一块文本。当执行一个非移动命令时,命令会被执行到这块高亮的区域上。
4.选择模式
这个模式中,可以用鼠标或者光标键高亮选择文本。
如果输入任何字符,Vim会用这个字符替换选择的高亮文本块,并且自动进入插入模式。
5.命令行模式
在命令行模式中可以输入会被解释成并执行的文本。例如执行命令(:键),搜索(/和?键)或者过滤命令(!键)。
在命令执行之后,Vim返回到命令行模式之前的模式,通常是普通模式。
6.Ex模式(Ex mode)
这和命令行模式比较相似,在使用:visual命令离开Ex模式前,可以一次执行多条命令。
l 编译器GCC
sudo apt-
getinstall build-essential
安装到usr/lib中,到usr/bin中(可执行文件),到usr/include中(头文件)
-
c 只编译不链接,生成目标文件.o
-
S 只编译不汇编,生成汇编代码
-
E 只进行预编译,不做其他处理
-
g 在可执行程序中包含标准调试信息
-
o file 将file文件指定为输出文件
-
v 打印出编译器内部编译各过程的命令行信息和编译器的版本
-
I dir 在头文件的搜索路径列表中添加dir目录
-
static 进行静态编译,即链接静态库,禁止使用动态库
-
shared 1.可以生成动态库文件
2.
进行动态编译,尽可能的链接动态库,没有动态库时才会链接同名静态库
-
L dir 在库文件的搜索路径列表中添加dir目录
-
lname 链接称为libname.a或者libname.so的库文件。
如果两个库文件都存在,根据编译方式是static还是shared进行链接
-
fPIC 生成使用相对地址的位置无关的目标代码,
(-fpic)
然后通常使用gcc的-static选项从该pic目标文件生成动态库文件。
预处理:gcc –
Ehello.
c–o hello.i; gcc –
E调用cpp 生成中间文件
编 译:gcc –
Shello.i –o hello.s; gcc –
S调用ccl 翻译成汇编文件
汇 编:gcc –
chello.s –o hello.o; gcc -
c
调用
as
翻译成可重定位目标文件
链 接:gcc hello.o –o hello ; gcc -o 调用ld** 创建可执行目标文件
-o后面是接的你给生成的文件指定的名字,如果不指定,则默认为a.out
在命令行上运行这个可执行目标文件需要输入它的名字:
./
a.out
为什么?
Window下,搜索一个东西会从当前目录下,找不到去PATH环境变量中找;Linux下只从PATH环境变量中找,所以即使当 前目录有,也要指出来; "."表示当前目录,“./libvector.a” 表示用当前目录下的libvector.a库文件。 凡是不带前缀的,都是PATH中有,但不安全。
所以其实这行代码只是在输入它的名字, ./ 表示当前目录
外壳调用操作系统中一个叫加载器的函数,拷贝可执行文件p中的代码和数据到存储器,然后将控制转移到这个程序的开头。
技巧:前三步,GCC的参数连起来是“ESc”,相应输入的文件的后缀是“iso”
l 调试工具gdb
使用GCC编译时要加“-g”参数
GDB最基本的命令有:
gdb
programm(启动GDB)
l
查看所载入的文件
b
设断点
info
b
查看断点情况
run
开始运行程序
bt
打印函数调用堆栈
p
查看变量值
c
从当前断点继续运行到下一个断点
n
单步运行(不进入)
s
单步运行(进入)
quit
退出GDB
四种断点:
b[
行数或函数名] <条件表达式>
b[
函数名] <条件表达式>
b[
行数或函数名] <
if表达式>
tbreak [
行数或函数名]
<条件表达式>
l Make和Makefile
make工具最主要也是最基本的功能就是根据makefile文件中描述的源程序至今的相互关系来完成自动编译、维护多个源文件工程。
而makefile文件需要按某种语法进行编写,文件中需要说明如何编译各个源文件并链接生成可执行文件,要求定义源文件之间的依赖关系。
最终实现——自动化编译
进入Makefile?
$ vim
Makefile
Makefile的一般写法:
一个Makefile文件主要含有一系列的规则,每条规则包含以下内容:
第三周
l 第二章 信息的表示和处理
字
字长决定虚拟地址空间的最大大小。
字长为w,虚拟地址的范围为1-(2^w-1)
w=32或64:也就是我们通常所说的电脑是32位还是64位。也可以理解为CPU一次处理数据的位数。
布尔代数
常用运算符号:
与: &
或: |
非: ~
异或:^
逻辑运算
逻辑运算符
与:&&
或:||
非:!
左移<<
x<>
右移分为逻辑右移和算术右移。
逻辑右移:
在左端补k个0,多用于无符号数移位运算
在左端补k个最高有效位的值,多用于有符号数移位运算。
第四周
l 第三章 程序的机器级表示
是机器级程序的格式和行为,定义了处理器状态、指令的格式,以及每条指令对状态的影响。
看上去是一个非常大的字节数组,实际上是将多个硬件存储器和操作系统软件组合起来。
操作数的三种类型
2.结果存放的两种可能
3.寻址方式
(1)立即数寻址方式
格式:$后加用标准c表示法表示的整数,如$0xAFF
(2)寄存器寻址方式
如%eax,与汇编中学过的AX寄存器类比。
(3)存储器寻址方式
通用形式:
do
body-statement
while
(
test-expr);
循环体body-statement至少执行一次。
可以翻译成:
loop:
body-statement
t = test-expr;
if
(t)
goto
loop
;
即先执行循环体语句,再执行判断。
通用形式:
while(
test-expr)
body-statement
GCC的方法是,使用条件分支,表示省略循环体的第一次执行:
if(
!
test-expr
)
goto
done;
do
body-statement
while
(
test-expr);
done:
接下来:
t =
test-expr;
if(!t)
goto
done:
loop
:
body-statement
t =
test-expr;
if
(t)
goto loop;
done:
归根究底,还是要把循环改成do-while的样子,然后用goto翻译。
栈帧结构
栈用来传递参数、存储返回信息、保存寄存器,以及本地存储。
1.栈帧
为单个过程分配的那部分栈称为栈帧,通用结构见149页
所以本质上栈帧还是栈。
2.两个指针
最顶端的栈帧以两个指针界定:
寄存器%ebp-帧指针
寄存器%esp-栈指针
栈指针可移动,所以信息访问多相对于帧指针。
3.调用的过程
课本150页过程P调用过程Q的示例。
调用者的帧应该在被调用者的下面,并且调用者返回地址是它的栈帧末尾,这样可以保证被调用者执行完毕全都出栈后,程序能够继续向下执行。
关于被调用者Q用栈的几个用处:
1.保存不能存放在寄存器中的局部变量。
当要对一个局部变量使用地址操作符&的时候,就必须要为它生成一个地址,所以要入栈。这个用法!以前没见过!
2.存放它调用的其他过程的参数。
第五周
第四章处理器体系结构
Y86指令集基本上是IA32指令集的一个子集,只包括四字节整数操作,寻址方式比较少,操作也较少。
汇编码表示和字节编码参见课本232页。
每条指令需要1-6个字节不等,每条指令的第一个字节表明指令的类型。
这个字节分为两个部分,每个部分4位:
Stat描述程序执行的总体状态
1.AOK
正常操作
2.HLT
处理器执行halt指令
3.ADR
遇到非法地址
4.INS
遇到非法指令
Y86——处理器停止运行指令。
1.Y86
有时需要两条指令来完成IA32一条指令就能完成的事
2.Y86
没有伸缩寻址模式
第六周
第六章存储器层次结构
随机访问存储器(RAM)
RAM分类:
1.传统的DRAM
(1)超单元
(2)信息的流入流出
信息通过引脚流入流出芯片,每个引脚携带一个1位的信号。
(3)存储控制器
这个电路可以一次传入或传出w位。
增强的DRAM
RAM断电丢失数据,是易失的;
ROM是非易失的,统称为只读存储器
(1)分类
可擦除PROM,能够被编程的次数的数量级在10的五次方。
基于EEPROM,为大量的电子设备提供快速而持久的非易失性存储。
存在于:数码相机、手机、音乐播放器、PDA、笔记本、台式机、服务器计算机系统
(3)固件
存储在ROM设备中的程序通常被称为固件,当一个计算机系统通电以后,他会运行存储在ROM中的固件。
5.访问主存
(1)总线
总线是一组并行的导线,能携带地址、数据和控制信号。
总线分类:
a.系统总线——连接CPU和I/O桥
b.存储器总线——连接I/O桥和主存
c.I/O总线(具体见6.1.2.4)
I/O桥将系统总线的电子信号翻译成存储器总线的电子信号,也将系统总线和存储器总线连接到I/O总线。
.磁盘容量——一个磁盘上可以记录的最大位数
(1)影响因素:
提高面密度即可提高容量。
计算公式:
3.磁盘操作
磁盘以扇区大小的块来读写数据。
访问时间的分类:
(1)寻道时间
2)旋转时间
3)传送时间
局部性原理:
一个编写良好的计算机程序,常常倾向于引用临近于其他最近引用过的数据项的数据项,或者最近引用过的数据项本身。
分类:
缓存
高速缓存:是一个小而快速的存储设备,它作为存储在更大、更慢的设备中的数据对象的缓冲区域。
缓存:使用高速缓存的过程称为缓存。
数据总是以块大小为传送单元在第k层与第k+1层之间来回拷贝。任一对相邻的层次之间块大小是固定的,但是其他的层次对之间可以有不同的块大小。
一般来说:层越低,块越大。
缓存命中
缓存不命中
.缓存不命中的种类
(1)强制性不命中/冷不命中
2
)冲突不命中
3)容量不命中
编写高速缓存友好的代码
1.基本方法:
2.重要问题:
收获总结
半个学期的学习,最大的收获应该算是心态上的改变。想想过去的两年,学习上真的是混过来的,每个期末考前突击,然后拿个及格分心满意足,什么都没学到。这个学期刚开学还想继续之前的状态,平时基本不花时间在学习上,但是又要完成老师布置的任务,每到周末都会压力很大。之后尽量跟上老师的要求,每天花点时间学习,这样做了一段时间,发现每天过的不会很空虚,也不会压力很大。现在觉得确实每天应该把学习放在第一位。
说到收获的知识,一开始几周还是没有不折不扣的完成学习任务,之后的也没有学的特别清楚,这次的知识总结基本上是把闫佳歆同学的博客学习了一遍。之后会把前面没有做好的实验补上,也多多复习之前的知识。
自己的不足
我觉得自己的不足还是懒,懒得看书、懒得动手、懒得动脑子。就像老师说的,我遇到不会的字都不去查字典,因为我懒得查。可是这样的心态对待学习,那就等于学不到东西。在学习上真是付出了多少,就得到多少。说到改进,现在已经能越来越把心思用在学习上了,经过几周的学习,发现如果静下心,还是能把书看进去,如果自己多研究一下,实验还是能做得出来的。平时不学习,也只不过是把时间浪费在了其他地方,以此逃避学习,这样的逃避没有任何益处,与其这样不如把时间用在学习上。还有就是我遇到问题,不能解决的总是喜欢不了了之,以后会多向老师同学请教。
课程建议和意见
课程中我最喜欢的机制就是每周成绩的公布,这样能知道自己的学习情况,对教学质量的提高也有帮助。我不喜欢的地方就是我们自学的比重那么大,我更适合听讲来学习,希望之后的课程中老师能把内容讲的全面、详细一些。
参考资料:
闫佳歆同学博客 http://www.cnblogs.com/20135202yjx/
实验楼实验指导: https://www.shiyanlou.com/courses/413