知识点总结
第一周
命令行常用快捷键
按键 |
作用 |
Tab Ctrl+c |
补全命令、目录、命令参数 强行终止当前程序 |
Ctrl+d |
键盘输入结束或退出终端 |
Ctrl+s |
暂定当前程序,暂停后按下任意键恢复运行 |
Ctrl+z |
将当前程序放到后台运行,恢复到前台为命令fg |
Ctrl+a |
将光标移至输入行头,相当于Home键 |
Ctrl+e |
将光标移至输入行末,相当于End键 |
Ctrl+k |
删除从光标所在位置到行末 |
Alt+Backspace |
向前删除一个单词 |
Shift+PgUp |
将终端显示向上滚动 |
Shift+PgDn |
将终端显示向下滚动 |
↑ |
输入历史命令 |
常用通配符
字符 |
含义 |
* |
匹配 0 或多个字符 |
? |
匹配任意一个字符 |
[list] |
匹配 list 中的任意单一字符 |
[!list] |
匹配 除list 中的任意单一字符以外的字符 |
[c1-c2] |
匹配 c1-c2 中的任意单一字符 如:[0-9] [a-z] |
{string1,string2,...} |
匹配 sring1 或 string2 (或更多)其一字符串 |
{c2..c2} |
匹配 c1-c2 中全部字符 如{1..10} |
帮助命令:man
man手册区段
区段 |
说明 |
1 |
一般命令 |
2 |
系统调用 |
3 |
库函数,涵盖了C标准函数库 |
4 |
特殊文件(通常是/dev中的设备)和驱动程序 |
5 |
文件格式和约定 |
6 |
游戏和屏保 |
7 |
杂项 |
8 |
系统管理命令和守护进程 |
要查看相应区段的内容,就在 man 后面加上相应区段的数字即可,如:
man 3 printf;
关键字检索:man -k k1| grep k2 | grep 2…(等于apropos)
例如:
man -k ad; #显示man手册中所有包含ad的命令或说明文件并列条显示
查找命令find find [path] [option] [action]
在指定目录下搜索指定文件名的文件:
find /etc/ -name interfaces
时间参数:
-atime |
最后访问时间 |
-ctime |
创建时间 |
-mtime |
最后修改时间 |
n、+n、-n的区别:
-mtime n: n 为数字,表示为在n天之前的”一天之内“修改过的文件
-mtime +n: 列出在n天之前(不包含n天本身)被修改过的文件
-mtime -n: 列出在n天之前(包含n天本身)被修改过的文件
例如:
列出 home 目录中,当天(24 小时之内)有改动的文件:
find ~ -mtime 0
newer file: file为一个已存在的文件,列出比file还要新的文件名,例如:
列出用户家目录下比Code文件夹新的文件:
find ~ -newer /home/shiyanlou/Code
查找匹配字符串grep
grep [命令选项]... 用于匹配的表达式 [文件]...
例:搜索/home/shiyanlou目录下所有包含"shiyanlou"的所有文本文件,并显示出现在文本中的行号:
grep -rnI "shiyanlou" ~
-r 参数表示递归搜索子目录中的文件,-n表示打印匹配项行号,-I表示忽略二进制文件
查看环境变量中以"yanlou"结尾的字符串:
export | grep ".*yanlou$"
查找宏的值:
grep –nr 【宏名称、全大写】 /usr/include
其中-r代表递归查找,-n代表行数
基本指令
apt-get、cd、mkdir、cp(复制)、rm(删除)、mv(移动、重命名)、rename(批量重命名)、cat(正序查看文件)、tac(倒序查看文件)、nl(添加行号并打印)、more和less(分页查看)、zip、rar、tar、df(查看磁盘容量)、du(查看目录容量)、wc(计数)、uniq(去重)、
第二周
1.vim的使用
(1)三种常用模式的切换:
常用模式:普通模式、插入模式和命令行模式。
普通→插入: i 或 a 插入→普通: Esc 或 Ctrl + [ 普通→命令行: :
命令行→普通:Esc
命令行模式下输入wq ,回车后保存并退出
(2)进入:vim/vim 文件名.格式
(3)帮助
大写“K”可以用来查找函数的帮助信息:查看 man page,命令模式下,将光标放在函数名上,按"K"可以直接察看 man page
2.gcc的使用
预处理: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
3.调试工具gdb的使用
gdb program 启动gbd
b 设断点(4种断点:行断点、函数断点、条件断点、临时断点)
run 开始运行程序
bt 打印函数调用堆栈
p 查看变量值
c 从当前断点继续运行到下一个断点
n 单步运行
s 单步运行
quit 退出gdb
display 跟踪变量值的改变
until 跳出循环
finish 跳出函数
help 帮助
第三周
- 进制转换
- 信息存储(布尔代数、位级运算、逻辑运算、移位运算)
- 整数表示(无符号数编码、有符号数编码、转换、扩展、截断)
- 整数运算(无符号数、有符号数)
- 浮点数(IEEE表示、浮点运算)
第四周
基本指令
mov push |
传送 压栈 |
pop |
出栈 |
Leal |
加载有效地址 |
sal |
算术左移fg |
Shl |
逻辑左移 |
sar |
算术右移(补符号位) |
shr |
逻辑右移(补0) |
mull |
有符号乘法 |
imull |
无符号乘法 |
divl |
无符号除法 |
idivl |
有符号除法 |
条件码
CF:进位标志
ZF:零标志
SF:符号标志
OF:溢出标志
算术指令
ADD 加法指令 影响标志位
ADC 带进位加法指令 影响标志位
INC 加一指令 不影响CF,影响别的标志位
SUB 减法指令 影响标志位
SBB 带借位减法指令 影响标志位
DEC 减一指令 不影响CF,影响其他标志位
NEG 求补指令 影响标志位 只有操作数为0,例如字运算对-128求补,OF=1,其他时候OF=0
CMP 比较指令 做减法运算但不存储结果,根据结果设置条件标志位
MUL 无符号数乘法指令
IMUL 有符号数乘法指令 均对CF和OF位以外的条件码位无定义(即状态不定)
DIV 无符号数除法指令
IDIV 带符号数除法指令 除法指令对所有条件码位均无定义
位操作指令
AND 逻辑与
OR 逻辑或
NOT 逻辑非 不影响标志位
XOR 异或
TEST 测试指令
控制转移指令
JMP 无条件转移指令 不影响条件码
所有条件转移指令 都不影响条件码
循环指令
不影响条件码
调用指令
CALL调用
RET返回
不影响条件码
第五周
程序员可见状态
(1)8个程序寄存器,%eax,%ecx,%edx,%ebx,%esi,%edi,%esp,%ebp
(2)处理器的每个程序寄存器存储一个字
(3)寄存器%esp被入栈、出栈、调用和返回指令作为栈指针。在其他情况下,寄存器没有固定的含义或固定值。
(4)有三个一位的条件码:ZF,SF,OF,它们保存最近的算术或洛基指令所造成英雄的有关信息。
(5)程序计数器PC存放当前正在执行指令的地址。
(6)存储器:Y86程序用虚拟地址来引用存储器位置,硬件和操作系统软件联合起来将虚拟地址翻译成实际或物理地址
(7)状态码stat表明程序执行的总体状态,会指示是正常运行还是出现了某种异常。
- 指令
- 编码
- 异常
- HCL
- 顺序实现
六个基本阶段:取指;译码;执行;访存;写回;更新PC
第六周
- RAM
- ROM
- 主存到CPU:movl A,%eax;CPU到主存:movl %eax,A
- 磁盘容量=字节数/扇区*平均盘区数/磁道*磁道数/表面*表面数/盘片*盘片数/磁盘
- 访问时间 =寻道时间+旋转时间+传送时间
- 总线:数据总线、控制总线、地址总线
- 利用局部性
局部性:空间局部性、时间局部性
步长增加,空间局部性下降;
循环有好的时间和空间局部性。循环体越小,循环迭代次数越多,局部性越好。
缓存不命中(替换策略):冷不命中、冲突不命中、容量不命中
高速缓存存储器结构(S,E,B,m)
重点&补充
1.搜索能力:
man: man -k (等价于apropos)
cheat
find locate
which whereis
apt-cache search
2.GCC编译的四个步骤:预处理(gcc -E)、编译(gcc -S)、汇编(gcc -c)、链接, gcc 选项可以简记为“ESc”,相应的产出文件的后缀可以简记为“iso”
3.静态链接库的生成:ar rcsv libxxx.a xxx.o
静态库的使用: gcc -o main main.c -L. -lxxx 注意-L -l 的含义
4.共享库的生成 gcc -fPIC -c xxx.c
gcc -shared -o libxxx.so xxx.o
共享库的使用:gcc -o main main.c -L. -lxxx
- 注意注册共享库的方法
- gdb: gcc –g
四种断点(函数、行、条件、临时)
p68 例子走一遍就行
p75 修改变量的值:set var n=4 资料上有误
- makefile:
会画依赖图
会根据依赖图写显示规则:
目标:依赖文件
- makefile中的变量 p78的自动变量要理解
- 理解信息就是位+上下文
- p2 查看源文件可以用od 命令 : od -tc -tx1 hello.c
- p5 冯式结构,理解p6 CPU执行指令的操作(加载、存储、操作、跳转)
- p9 存储系统的核心思想:缓存
- p10 操作系统核心抽象(文件、虚存、进程、虚拟机):可以指导大家学习《操作系统》
- 教材第七章:
- p450 链接器的两个任务、目标文件的三种形式、目标文件格式(a.out COFF
- PE ELF) :这四种格式,特别是PE,ELF格式是信安专业同学要掌握的,是研究病毒等恶意代码的基础。
- p451: ELF文件格式:试试readelf命令
- p455: 理解全局符号的解析:学会多个模块。
- p473: 处理目标文件的工具
20.p20: 三种数字:无符号数、有符号数(2进制补码)、浮点数,信息安全系同学从逆向角度考虑为什么会产生漏洞
21.p22: 进制转换,注意拿二进制作中间结果就好转了
22.p25: gcc -m32 可以在64位机上(比如实验楼的环境)生成32位的代码
23.p26: 字节顺序是网络编程的基础,记住小端是“高对高、低对低”,大端与之相反就可以了。
24.p28: 代码执行一下
25.p32: 能区分逻辑运算(结果是1或0)和位运算(结果是位向量),所有逻辑运算都可以用与、或、非表达(最大式、最小式),而与或非可以用“与非”或“或非”表达,所以,只要一个与非门,就可以完成所有的逻辑运算。
26.p33: 掩码是位运算的重要应用,对特定位可以置一,可以清零
27.p38: 要用C99中的“long long”类型,编译是要用 gcc -std=c99
28.p39: 补码的利用寄存器的长度是固定的特性简化数学运算。想想钟表,29.12-1 等价于 12 + 11,利用补码可以把数学运算统一成加法,只要一个加法器就可以实现所有的数学运算。
30.p44: 注意C语言中有符号数和无符号数的转换规则,位向量不变。想想第一章说的 信息就是“位+上下文”
31.p48: 怎么样让负数等于正数? 信息安全的逆向思维
32.p49: 0扩展和符号扩展
33.p52: 深入思考一下代码和结果
34.p54: 如何让整数运算溢出?如何避免? p62例子看看
35.p67: 关于整数运算的最后思考
36.p67: 浮点数有科学计数法的基础就不难理解,IEEE标准754
37.p68: 浮点数运算的不精确性与舍入
38.p70: IEEE浮点标准,float/double类型
39.p74: 整数与浮点数表示同一个数字的关系
40.p78: 整数与浮点数转换规则
41.p104, p105: X86 寻址方式经历三代:DOS时代的平坦模式,不区分用户空间和内核空间,很不安全;8086的分段模式;IA32的带保护模式的平坦模式
42.p106: ISA的定义,ISA需要大家能总结规律,举一反三,比如能对比学习ARM的ISA;PC寄存器要好好理解;
43.p107: gcc -S xxx.c -o xxx.s 获得汇编代码,也可以用objdump -d xxx 反汇编; 注意函数前两条和后两条汇编代码,所有函数都有,建立函数调用栈帧,应该理解、熟记。
44.注意: 64位机器上想要得到32代码:gcc -m32 -S xxx.c
MAC OS中没有objdump, 有个基本等价的命令otool
Ubuntu中 gcc -S code.c (不带-O1) 产生的代码更接近教材中代码(删除"."开头的语句)
45.p108: 二进制文件可以用od 命令查看,也可以用gdb的x命令查看。
有些输出内容过多,我们可以使用 more或less命令结合管道查看,也可以使用输出重定向来查看
od code.o | more
od code.o > code.txt
46.p109: gcc -S 产生的汇编中可以把 以”.“开始的语句都删除了再阅读
47.p110: 了解Linux和Windows的汇编格式有点区别:ATT格式和Intel格式
48.p111: 表中不同数据的汇编代码后缀
49.p112: 这几个寄存器要深入理解,知道它们的用处。esi edi可以用来操纵数组,esp ebp用来操纵栈帧。对于寄存器,特别是通用寄存器中的eax,ebx,ecx,edx,大家要理解32位的eax,16位的ax,8位的ah,al都是独立的,我们通过下面例子说明:
假定当前是32位x86机器,eax寄存器的值为0x8226,执行完addw $0x8266, %ax指令后eax的值是多少?
解析:0x8226+0x826=0x1044c, ax是16位寄存器,出现溢出,最高位的1会丢掉,剩下0x44c,不要以为eax是32位的不会发生溢出.
50.p113: 结合表,深入理解各种 寻址方式;理解操作数的三种类型:立即数、寄存器、存储器;掌握有效地址的计算方式 Imm(Eb,Ei,s) = Imm + R[Eb] + R[Ei]*s
51.p114: MOV相当于C语言的赋值”=“,注意ATT格式中的方向, 另外注意不能从内存地址直接MOV到另一个内存地址,要用寄存器中转一下。能区分MOV,MOVS,MOVZ,掌握push,pop
52.p115/p116: 栈帧与push pop; 注意栈顶元素的地址是所有栈中元素地址中最低的。
53.p117: 指针就是地址;局部变量保存在寄存器中。
54.p119: 结合表理解一下算术和逻辑运算, 注意目的操作数都是什么类型
特别注意一下减法是谁减去谁
注意移位操作移位量可以是立即数或%cl中的数
55.p123: 结合C语言理解一下控制部分,也就是分支(if/switch),循环语句(while, for)如何实现的。考验大家举一反三的学习能力。控制中最核心的是跳转语句:有条件跳转p128(实现if,switch,while,for),无条件跳转jmp(实现goto)
56.p124: 有条件跳转的条件看状态寄存器(教材上叫条件码寄存器)
注意leal不改变条件码寄存器
57.思考一下:CMP和SUB用在什么地方
58.p125: SET指令根据t=a-b的结果设置条件码
59.p127: 跳转与标号
60.p130/p131: if-else 的汇编结构
61.p132/p133: do-while
62.p134/p135: while
63.p137/p138: for
64.p144/p145: switch
65.p149: IA32通过栈来实现过程调用。掌握栈帧结构,注意函数参数的压栈顺序.
66.p150/p151: call/ret; 函数返回值存在%eax中
67.p174: bt/frame/up/down :关于栈帧的gdb命令
68.了解三种常见存储技术:RAM/ROM/磁盘;
69.RAM有SRAM和DRAM,特点和应用;
ROM有PROM,EPROM,E2PROM,FLASH;
70.磁盘是重点,涉及到后面的i/o和文件系统,做好相关练习
磁盘结构:盘片、磁道、扇区、间隙、柱面;磁盘驱动器
磁盘容量
71.访问时间:寻道、旋转、传送
72.逻辑磁盘块:这个很重要,内存可以看成字节数组、磁盘可以看成块数组
73.总线:数据总线、控制总线、地址总线
74.系统总线、存储总线、I/O总线:p395图要理解
75.读写事务:P389图要能理解
76.局部性原理:时间局部性、空间局部性,有能力者理解一下p429最后一段“存储器山”(山脊:时间局部性)
77.数据引用局部性
78.取指令局部性
79.存储层次结构:系统观(1+1>2)(举一反三:对称不对称加密形成的混合加密系统,混合动力汽车...)
80.中心思想:每层存储设备都是下一层的“缓存”
81.对照p408的表理解
82.高速缓存结构(S,E,B,m):高速缓存组、高速缓存行、块
83.映射
84.命中
85.缓存管理
个人感想
不知不觉学期已过半,对这门课的情绪一直在变化。还记得第一周,还没从手忙脚乱的电工实习中缓过劲就连熬十几个小时在学校的烂网下赶那十几个实验,就此也对这门课、还有老师特殊的教学方式产生不小的抵触,每周做任务很煎熬然而必须要做。但是随着一周又一周过去,我渐渐习惯了这种每周都花固定时间来学习的生活。实话说大学以来我的学习能力下降了太多太多,积极性主动性什么的更是几乎消磨殆尽,而这种“使自主”学习方式,让我每天都想着还要学习还要学习,这种态度的转变我觉得是最大的收获。
在实际学习中,娄老师提供了很多新式的平台方式,实验楼自主实验、博客借鉴、小组论坛讨论、合作完成家庭作业等,除去学校网速限制以外我从中受益很多。以前学习遇到问题可能直接就放弃了,等老师课上讲或者问同学,甚至直接跳过。而现在,总是会先自己想想如何解决,然后发到论坛中,和老师同学分享自己的思路,不同的思维碰撞之后得到正确的解答,这样对问题的记忆极其深刻永远不会忘。好的学习方法对学习效果有太大的提升。
反思自己,我觉得我最大的问题还是自制力差,容易分心,遇到问题容易烦躁然后思维就转移了不专注了。现在跟着老师的新方式学习有些改观,加上自己的克制比如去学习不带手机,可以说比之前好很多。我觉得连续学习两小时中第二个小时要比第一个小时效率高很多,在以后的学习中要继续克制继续克制,多利用第二个小时。
课程建议
老师这种教学改革刚开始感觉很煎熬,但一旦习惯了才发现这样才是真正的事半功倍。如果不是这种每周任务制,大部分人到了期末都是恶补,不仅熬夜耗时间耗精力重点是还学不到东西。而现在这种方式大家的学习积极性都很高,主动抢题主动查实验,做的任务多得分就高,公平又高效。不足的地方…默默说一句老师您讲课的时候语速太快有时候听不太清……重点的地方可以说的稍微慢一点嘛……