时间统计
预计时间(9小时30分钟)
问题整理 1小时
课本知识点整理 3小时
linux基础复习 3小时
vim等复习 1小时
正则表达式复习 30分钟
分析收获不足以及建议 1小时
实际时间(10小时)
问题整理 2小时
课本知识点整理 2小时
linux基础复习 3小时30分钟
vim等复习 1小时
正则表达式复习 1小时
分析收获不足以及建议 30分钟
第一部分 知识点总结
第一章节 Linux命令
(一)man命令
man -k:
常用来搜索,结合管道使用。例句如下:
man -k k1 | grep k2 | grep 2
搜索同时含有k1和k2,且属于系统调用。
最后的数字意味着帮助手册中的区段,man手册共有8个区段,最常用的是123,含义如下: 1.Linux 2.系统调用 3.c语言
例如:我们输入 man ls,它会在最左上角显示“LS(1)”,在这里,“LS”表示手册名称,而“(1)”表示该手册位于第一节章,同样,我们输入“man ifconfig”它会在最左上角显示“IFCONFIG(8)”。也可以这样输入命令:“man [章节号] 手册名称”。
man是按照手册的章节号的顺序进行搜索的,比如:
man sleep
只会显示sleep命令的手册,如果想查看库函数sleep,就要输入:
man 3 sleep
即查找c语言中printf的用法。
cheat
cheat命令:告诉你一个命令如何使用。通过使用实例告诉你一个命令如何使用。
用法:cheat 命令名
find locate which whereis的用法和区别
1、find用法
find是查找命令,find查找磁盘空间
find的使用格式如下:
$ find <指定目录> <指定条件> <指定动作>
- <指定目录>: 所要搜索的目录及其所有子目录。默认为当前目录。
- <指定条件>: 所要搜索的文件的特征。
- <指定动作>: 对搜索结果进行特定的处理。
举例:
$ find . -type f -mmin -10
搜索当前目录中,所有过去10分钟中更新过的普通文件。如果不加-type f参数,则搜索普通文件+特殊文件+目录
2、locate命令
locate命令是"find -name"的另一种写法,但更快,原因在于它不搜索具体目录,而是搜索一个数据库(/var/lib/locatedb),这个数据库中含有本地所有文件信息。在使用locate之前,先使用updatedb命令,手动更新数据库。
locate命令的使用实例:
$ locate /etc/sh
搜索etc目录下所有以sh开头的文件。
$ locate ~/m
搜索用户主目录下,所有以m开头的文件。
$ locate -i ~/m
搜索用户主目录下,所有以m开头的文件,并且忽略大小写。
3、whereis
whereis命令只能用于程序名的搜索,而且只搜索二进制文件(参数-b)、man说明文件(参数-m)和源代码文件(参数-s)。如果省略参数,则返回所有信息。同locate一样,查询数据库(/var/lib/locatedb)文件。
whereis命令的使用实例:
$ whereis grep
4、which
which命令的作用是,在PATH变量指定的路径中,搜索某个系统命令的位置,并且返回第一个搜索结果。也就是说,使用which命令,就可以看到某个系统命令是否存在,以及执行的到底是哪一个位置的命令。
which命令的使用实例:
$ which grep
区别
which (寻找执行档) :这个指令是根据PATH这个环境变量所规范的路径,去搜寻执行档的档名,所以,重点是找出执行档而已,which 后面接的是完整档名
whereis (寻找特定档案):搜寻linux数据库档案中所记录的东西,和locate的主要区别在于后面的参数
locate:搜寻linux数据库档案中所记录的东西,后面直接跟档案的部分名称就行
find:直接搜索整个硬盘
apt-cache search
常用使用方法
1、apt-cache show package_name: 显示指定软件包的信息,包括版本号,安装状态和包依赖关系等.
2、apt-cache search package_name:搜索软件包,可以按关键字查找软件包,通常用于查询的关键字会使用软件包的名字或软件包的一部分.
3、apt-cache showpkg package_name:显示软件包的依赖关系信息.
4、apt-cache stats:显示当前系统所使用的数据源的统计信息,用户可以使用该命令查看数据源的相关统计信息.
5、apt-cache policy package_name:显示软件包的安装状态和版本信息.
6、apt-cache depends package_name:显示指定软件包所依赖的软件包。当用户需要了解某个软件包依赖于其他哪些包时,可以使用apt-cache depends来查询包依赖关系.
7、apt-cache rdepends package_name:查询指定软件包的反向依赖关系,即那些其他的软件包需要依赖你所指定的软件包做为安装和运行的必须条件.
8、apt-cache dump:显示缓存中的每个软件包的简要描述信息.
9、apt-cache unmet:显示不符合一致性的依赖关系.
cat
命令说明: 查看文件内容,也可以给文件追加内容到结尾
语法:cat [-AbEnTv]
参数:
-A :相当于-vET的整合参数,可以列出一些特殊字符,而不是空白而已 -b :列出行号,仅对非空行号显示,空白行不标记行号
-E :将结尾的断行字符$显示出来
-n :打印出行号,连同空白行也有行号,与-b参数不同
-T :将[tab]按键以^I 显示出来
-v :列出一些看不出的特殊字符
touch
命令功能:
touch命令参数可更改文档或目录的日期时间,包括存取时间和更改时间。
命令格式:
touch [选项]... 文件...
命令参数:
-a 或--time=atime或--time=access或--time=use 只更改存取时间。
-c 或--no-create 不建立任何文档。
-d 使用指定的日期时间,而非现在的时间。
-f 此参数将忽略不予处理,仅负责解决BSD版本touch指令的兼容性问题。
-m 或--time=mtime或--time=modify 只更改变动时间。
-r 把指定文档或目录的日期时间,统统设成和参考文档或目录的日期时间相同。
-t 使用指定的日期时间,而非现在的时间。
正则表达式
‘多种字符’ 表达式:正则表达式中的一些表示方法,可以匹配 '多种字符 ' 其中的任意一个字表达符式。
规则:
\d 0~9 中的任意一个数字
\w 任一字母或数字或下划线,即A~Z、a~z、0~9、_中任一个
\s 包括空格、制表符、换页符等空白字符中任意一个
. 匹配除换行符( \n)以外任意一个字符
[ ] 匹配其中任意字符,但每次匹配只匹配一个
[^ ]匹配除其中的任意字符,每次匹配只匹配一个
修饰匹配次数:
{n} 表达式重复n次,如"a{5}" 相当于"aaaaa"
{m,n}表达式至少重复m次,最多重复n次,如:"ba{1,3}"可以匹 配"ba"或"baa"或"baaa"
{m,}表达式至少重复m次,比如:"\w\d{2,}"可以匹配 "a12","_456"等
?表达式出现 0次或者 1次,相当于 {0,1}
+表达式至少出现 1次,相当于 {1,}
*表达式不出现或出现任意次,相当于{0, }
匹配方法:
^ 从字符串开始的地方匹配
$ 从字符串结束的地方匹配
| 可以匹配左或者右
贪婪模式 :尽可能多的匹配
非贪婪模式:尽可能少的匹配
grep
这条语句可以用来查找关键字,全文搜索,并且可以直接查找文件内的内容。其中:
n:为显示行号
r:为递归查找
例如,如果想查找某个宏,我们已知宏保存在include文件夹中,所以可以使用下列语句:
grep -nr XXX /usr/include(XXX为所要找的宏)
第二章节 vi、 gcc、gdb、make的使用
vim编辑器:编写代码
gcc编译链接器:编译程序
预处理:gcc –E hello.c –o hello.i ;gcc –E调用cpp 产生预处理过的C原始程序
编 译: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 产生可执行文件
运行: ./hello
注意:
gcc的一般格式为:
gcc [选项] 要编译的文件 [选项] [目标文件],
其中,目标文件可默认,gcc默认生成可执行的文件,名为编译文件.out.
静态库
静态库是一系列的目标文件(.o文件)的归档文件((lib+name).a文 件);链接阶段,选择静态库,后缀名为“.a”;选择动态库,后缀名为“.so”。
静态链接库的生成: gcc -c 文件名.c ar rcsv libxxx.a xxx.o
静态库的使用: gcc -o 文件名 文件名.c -L. -lxxx //链接到静态库
注意:-L :在库文件的搜索路径列表中添加dir目录
-l : 在头文件的搜索路径列表中添加dir目录
共享库
共享库的生成 gcc -fPIC -c xxx.c
gcc -shared -o libxxx.so xxx.o
共享库的使用: gcc -o main main.c -L. -lxxx
注册共享库的方法
将库文件直接复制到/lib或者/usr/lib目录下: cp (lib+name).so /lib
gdb调试器:调试代码
(1)使用流程
查看文件:l
设置断点:在b后加入相对应的行号。例b 6
查看断点情况:设置完断点后键入info b,在gdb中可以设置多个断点。bt 查询调用函数的情况。
运行代码:默认从首行开始运行代码,键入r;r+行号:从该行号开始运行 查看变量值:p 变量。例:p n
单步运行:n或s,s会进入函数,n不会进入函数
恢复程序运行:c
注意:程序的运行状态有“运行”、“暂停”、“停止“三种。
(2)断点的设置
函数:b 文件名.c:函数名
行:b 行数
条件:b 行数 if 表达式(b 8 if == 10)
临时:tb [文件名:]行号或函数名 <条件表达式>
make项目管理器
功能 :识别文件代码是否更新,减少编译工作量
(1)makefile文件的编写规则
格式为:
目标体:依赖文件
[tab键]各目标体运行命令
目标体:由make创建,通常是目标文件或可执行文件
依赖文件:创建目标体所依赖的文件
运行命令:创建每个目标体时需要的运行命令,必须以tab键开头。
使用make的格式:make 目标体
(2)makefile变量的定义
递归展开方式:在引用该变量时进行替换(不能用于引用自己的情况),缺点:不能在变量后追加内容。
格式定义:VAR = var
非递归展开方式:在定义处展开,并只展开一次。优点:消除变量的嵌套引用。
格式定义:VAR := var
make中变量的使用格式: $(变量名)
变量名的命名:不包括“:”、“#”、“=”以及结尾空格的任何字符串;变量名大小写不敏感。
变量分类:用户自定义变量、预定义变量、自动变量及环境变量。
(3)makefile规则
隐含规则
模式规则
第三章节 教材内容
第一章
1、信息就是位+上下文
2、计算机系统的核心是高速缓存的概念,一层存储器是低一层存储器的高速缓存。
3、操作系统中的抽象是进程、文件、虚拟存储器、虚拟机。
第二章
1、数字的三种表示 :无符号数、有符号数、浮点数
2、进制转化
(1)x=2^n转化为十六进制
将x写成x=2^n的形式,令n=i+4j,x的十六进制表示为:开头为2^i的值,后面补j个0。
3、字和字节顺序
字长:一个字长指明整数和指针数据的标称大小。字长决定最重要的系统参数就是虚拟地址空间的最大大小。对一个字长为w位的机器而言,虚拟地址的范围是0~2^w-1,程序最多访问2^w个字节。
对于跨越多字节的程序对象需建立两个规则:
小端法:高对高,低对低
大端法:从视觉上,是这次阅读的顺序,与小端法相反。
使字节顺序变得可见的三种方式:
不同类型的机器之间通过网络传送二进制数据时,网络应用程序的代码编写必须遵守已建立的关于字节顺序的规则;
使用反汇编器,处理整数数据的字节序列的存储字节顺序问题;
当编写规避正常的类型系统的程序时。
4、布尔代数
(1)位向量的运算:按位运算
(2)位向量的应用:表示有限集合
掩码表示的是设置为有效信号的集合。
(3)位级运算
|:或
&:与
~:取反
^:异或
掩码运算:掩码是一个位模式,表示从一个字中选出的位的集合。例如:位级运算x&0xFF生成一个有x的最低有效字节组成的值。
(4)逻辑运算
逻辑运算符:||(或)、&&(与)、!(非)
(5)移位运算 右移包括:逻辑右移、算数右移
逻辑右移:左端补k个0(常用于无符号数)
算数右移:左端补k个最高有效位的值(用于有符号数)
5、补码编码
补码形式是最常见的有符号数的计算机表示方式 将字的最高有效位解释为负权 B2T(W)函数为:B2T(x) = -x(w-1)2^(w-1)+∑xi2^i(求和从i=0到i=w-2)
6、有符号数和无符号数之间的转换
负数和正数相等的情况:u=2147483648 =-2147483648
(当输出分别为无符号形式和有符号形式时)
7、扩展数的位表示
零扩展:将无符号数转换为更大的数在表示的开头添加0
符号扩展:将一个补码数字转换为一个更大的数据类型
8、截断数字
截断数字:不用额外的位来扩展一个数值,而是减少表示一个数字的位数。
注意!!补码经过截断处理后的结果仍是补码,注意结果为负数时转化为十进制数
9、使用无符号数的情况
(1)把字仅仅看做是位的集合,并没有任何数字意义时
(2)当实现模运算和多精度运算的数学包时,数字是由数的数组来表示的,无符号值也会非常有用。
10、整数运算
(1)无符号加法
(2)补码加法
(3)补码的非
(4)无符号乘法
两个数x、y相乘且x、y的位数为w,则结果的位数为2w。
(5)补码乘法
同无符号乘法。 若为截断后的结果,则取结果的后w位作为计算结果。 注意:无符号运算和补码运算在“+”、“-”、“”在位级上有相同的结果。
(6)乘以常数
对于某个常数K的表达式xK生成代码,编译器会将K的二进制表示表达为一组0或1的交替的序列: [(0…0)(1…1)(0…0)…(1…1)] 可以用以下两种形式来计算这些乘积的结果:
A:(x<<n)+(x<<n-1)+……+(x<<m)
B:(x<<n+1)-(x<<m)
注意:对于n为最高位的情况,B:-(x<<m)
注意!!(x<<0)的结果是x,而不是0
(7)除以2的幂
设x/K,令K=2^n,
当x为正数时,计算 x>>n;
当x为负数时,将x加上偏置量,即加上2^n-1(即K-1),计算** (x+偏置量)>>n**。
11、浮点数
(1)二进制小数
将十进制小数转换为二进制小数
首先,将十进制小数写成分数的形式,将分数的分子部分,写成二进制的形式;将分数的分母部分写成2^n的形式,将分子的二进制形式,从右往左数,数n位添加小数点。
小数点左移:除以2
小数点右移:乘以2
(2)IEEE浮点数表示
表示形式为:V = (-1)^s * M * 2^E
符号:s符号位。
尾数:M是一个二进制小数,它的范围是1 ~ 2-ε,或者是0 ~ 1-ε。
阶码:E的作用是对浮点数据加权,这个权重是2的E次幂(可能是负数)。
根据阶码的值,可分为一下三种情况:
情况一:规格化的值 (当阶码字段不全为0或全为1时)
E = e-Bias
Bias = 2^(k-1)-1
M = 1+f
情况二:非规格化的值 (当阶码字段全为0时)
E = 1-Bias
Bias = 2^(k-1)-1
M = f
情况三:特殊值 (当阶码字段全为1时)
当小数域全为0时, 当s=1时,为-∞;当s=0时,为+∞。
当小数域不全为0时,为NaN。
(3)浮点数的舍入
有四种情况分别是:向偶数舍入(默认)、向零舍入、向下舍入、向上舍入。
(4)浮点运算
浮点加法:不满足结合性、满足单调性 浮点乘法:不满足结合性、满足单调性,在加法上不满足分配性
第三章
1、反汇编命令 objdump -d xxx.o
2、执行汇编命令:gcc –s xxx.c –o xxx.s
3、64位处理器得到32代码的命令:gcc –m32 –s xxx.c
4、三种操作数:立即数、寄存器、存储器
5、条件码 : CF:进位标志 ZF:零标志 SF:符号标志 OF:溢出标志
6、jump指令:直接跳转——后面跟标号作为跳转目标; 间接跳转——*后面跟一个操作数指示符
7、传送指令包括:数据传送指令和条件传送指令
8、call指令的效果是将返回地址入栈。并跳转到被调用过程的起始处。
9、ret指令返回到call指令后的那条指令
10、leave指令可以使栈做好返回的准备 等价于:
movl %ebp,%esp ; popl %ebp
第四章
1、指令体系结构:一个处理器支持的指令和指令的字节级编码
2、程序员可见状态:8个寄存器状态、程序计数器PC。
3、指令集的一个重要性质:字节编码必须有唯一的解释。
4、Y86异常:状态码1,AOK,程序正常; 状态码2,HLT,处理处执行halt指令; 状态码3,ADR,非法地址;状态码4,INS,非法指令。
5、创建Y86代码的唯一工具是汇编器 ;YIS:指令集模拟器 6、pushl指令会把栈指针减4,并且将一个寄存器值写入存储器中。
7、SEQ执行处理一条完整指令的步骤:取址、译码、执行、访存、写回、更新
8、nop指令:除了将PC加1,不进行任何处理; halt指令:将处理器状态设置为HLT,导致处理器停止运行。
9、取址阶段包括指令存储器硬件单元。
instrvalid:指示指令是否合法 needregids:指示是否包括一个寄存器指示符字节 need_valC:指示是否包括一个常数字 instrvalid和imemerror在访存阶段被用来产生状态码。
10、“cond”硬件单元会根据条件码和功能码来确定是否进行条件分支或者条件数据传送。
第六章
1、随机访问存储器分为:静态的SRAM、动态的DRAM
2、根据携带信号不同,总线可分为数据总线、地址总线、控制总线。
3、计算磁盘容量的公式:
磁盘容量 = 字节数/扇区 X 平均磁盘数/磁道 X 磁道数/表面 X 表面数/盘片 X 盘片数/磁盘
4、访问时间=寻道时间+旋转时间+传送时间
5、最大旋转延迟=1/RPM X 60secs/1min (s) ;平均旋转时间是最大旋转时间的一半
6、平均传送时间= 1/RPM x 1/(平均扇区数/磁道) x 60s/1min
7、逻辑磁盘块三元组(盘面,磁道,扇区):唯一地标示了对应的物理扇区
8、CPU使用一种称为存储器映射I/O的技术来向I/O设备发出命令。
9、局部性包括时间局部性和空间局部性。
10、循环有好的时间和空间局部性
11、高速缓存:上一层做下一层的高速缓存
12、缓存不命中的种类
冷缓存(强制不命中\冷不命中):一个空的缓存,对于有效位为0的情况 ; 容量不命中:当工作集的大小超过缓存的大小时;冲突不命中:限制性的放置策略会引起的一种不命中。
13、每个存储器地址有m位,形成M=2^m个不同的地址; 高速缓存组:S = 2^m个高速缓存组的数组 ; 高速缓存行:B = 2^m字节的数据块组成 ; 有效位:指明这个行是否包含有意义的信息; 标记位:唯一地标识存储在这个高速缓存行中的块,t = m -(b+s)
14、高速缓存参数的性能影响
缓存大小的影响;块大小的影响;相联度的影响;写策略的影响
第七章
1、c语言程序执行的过程涉及的工具:c预处理器(cpp)、编译器(cc1)、汇编器(as)、链接器程序(ld)
2、链接器的任务:符号解析、重定位
3、目标文件的三种形式:可重定位目标文件、可执行目标文件、共享目标文件
4、目标文件的格式:a.out、COFF、DE、ELF
5、链接器上下文的三种符号:全局符号、外部符号、本地符号
第四章节 考题
第三周
填空:实验楼环境中所有的默认系统用户名和密码均为(shiyanlou)。
填空:Linux Bash中,Ctrl+a快捷键的作用是(将光标移至输入行头,相当于Home键)。
判断:Linux Bash中, man printf和man 1 printf 功能等价。 ok
填空:在 Linux 里面可以使用使用(groups)命令知道自己属于哪些用户组。
填空:在 Linux 里面可以使用使用(chmod)命令修改文件的权限。
填空:Linux中没有C盘,D盘,其文件系统的目录是由(FHS)标准规定好的。
判断:Linux Bash中,cd - 命令可以切换到'home'目录。 x 应该是cd ~ , cd -切换到上一个目录
判断:Linux Bash中,强制删除test文件的命令是(rm -f test )。
判断:Linux Bash中,cat -n 和 nl 命令功能等价。ok
判断:Linux Bash中,source 和 . 命令功能等价。 ok
填空:Linux Bash中,查找home目录中前天创建的文件的命令是(find ~ -ctime 2)。 区分 2 +2 -2 的意义, 三种时间参考学姐李冰清的研究
判断:Linux Bash中,使用tar命令把home目录打包成home.tar的命令是( tar -cf home.tar ~)
填空:Linux Bash中,zip命令使用(-e)参数可以创建加密压缩包。
判断:Linux Bash中,df和 du 命令功能等价。x
填空:Linux Bash中,ls . | sort 命令的功能是( 显示当前目录内容并排序)
填空:Linux Bash中,使用grep查找当前目录下*.c中main函数在那个文件中的命令是( grep main *.c )
填空:Linux Bash中,使用wc统计hello.c共有几行代码的的命令是( wc -l hello.c)
判断:col 命令的-h参数可以将Tab换成对等数量的空格建。x ,空格换tab
填空:Linux Bash中,把ls命令显示当前目录的结果存入ls.txt的命令输出重定向命令是(ls > ls.txt)
填空:Linux Bash中,(tee)命令可以同时重定向到多个文件。
第四周
man -k 填空: 数据结构中有线性查找算法,C标准库中没有这个功能的函数,但Linux中有,这个函数是(lfind或lsearch)
cheat 填空:To list the content of /path/to/foo.tgz archive using tar ( tar -jtvf /path/to/foo.tgz )
find 填空:查找当前目录下所有目录的find命令是(find . -type d)
grep 填空:查找宏 STDIN_FILENO 的值的命令是(grep -nr XXX /usr/include)
CH01填空:计算机系统中的所有信息都是位串表示的,所谓(信息)就是位+上下文。
CH01填空:存储器层次结构的主要思想是上层存储器作为下层存储器的(高速缓存)。
CH01填空:操作系统中最基本的四个抽象是(虚拟机、进程、虚拟存储器、文件)。
CH07填空:链接器的两个主要任务是(符号解析和重定位)。
CH07选择:教材p449中 swap.c中的bufp1 是( A ) A 全局符号 B外部符号 C本地符号 D以上都不对
CH07 判断:C语言中,全局变量是强符号。(X)
CH07 填空:(加载器)将可执行文件的内容映射到存储器,并运行这个程序。
CH07 选择:Linux中,反汇编.text节中的二进制指令使用的工具是(d)A ar B strings C readelf D objdump
实验题
1、 在vi中,查看scanf和printf man pages(帮助文档)的命令分别是?(2分) K 3K 2、 编译和运行以上代码的命令(2分)
gcc *.c -o main ./main 3、 使用GDB调试以上代码:编译代码的命令是?main.c中如何给main函数设置断点?如何在第六行设置断点?(3分)
gcc -g *.c -o main
b main
b 6
4、 除了main.c外,其他4个模块(add.c sub.c mul.c div.c)的源代码不想给别人,如何制作一个mymath.a静态库?main.c如何使用mymath.a?(3分)
gcc -c add.c sub.c mul.c div.c
ar rcvs libmymath.a add.o sub.o mul.o div.ogcc main.c -o main -L. -lmymath
( gcc main.c ./libmymath.a -o main)
5、 除了main.c外,其他4个模块(add.c sub.c mul.c div.c)的源代码不想给别人,如何制作一个mymath.so共享库?main.c如何使用mymath.so?(4分)
gcc -fPIC -c add.c sub.c mul.c div.c
gcc -shared -o libmymath.so add.o sub.o mul.o div.ogcc -o main main.c -L. -lmymath
libmymath.so 要拷贝到/lib or /usr/lib
6、 写出编译上面代码的makefile,编译出来的目标文件为testmymath, 只用显式规则就可以.(4分)
testmymath: main.o add.o sub.o mul.o div.o
gcc main.o add.o sub.o mul.o div.o -o testmymath
main.o: main.c head.h
gcc -c main.c
add.o: add.c head.h
gcc -c add.c
sub.o: sub.c head.h
gcc -c sub.c
mul.o: mul.c head.h
gcc -c mul.c
div.o: div.c head.h
gcc -c div.c
第五周
man -k 填空:Linux中显示文件(file )属性(status)的命令是( stat )
cheat 填空:使用du命令对当前目录下的目录或文件按大小排序的命令是( du -sk | sort -rn )
grep 填空:~/test 文件夹下有很多c源文件,查找main函数在哪个文件中的命令( grep main.c )
vi 填空: vi中查看函数qsort的帮助文档的快捷键为(K)
gdb 判断: gdb中next和step都可以单步跟踪,根据自顶向下原则应该优先选用step. (X )
ch01 填空:抽象是CS中一个重要的概念,在出来器里,(指令集结构)提供了对实际处理器的抽象。
ch01 选择:并行的三个层次不包含(C)。A 线程级并发 B指令级并行 C进程级并发 D SIMD
ch07 填空:gcc -f PIC xxx.c中的PIC的意思是(位置无关的代码 or Position-Independent Code
2.4 填空:计算 0x503C + 100 = ( 0x50A0 ) ,结果用16进制表示
2.6 填空:练习2.6中匹配的二进制共21位,用16进制表示是( 0x159141 )
2.8 填空: a,b长度都是一个字节,a=1,b=6, a|b = ( 7 or [00000111] )
2.11 判断: 代码中第四行 "<=" 换成“>=” 就可以解决代码问题.(X)
2.13 判断:
//compute x&y, only calls to functions bis and bic. (X)
int bool_and(int x, int y)
{
int result = bic(x, y);
return result;
}
2.14 填空:a,b长度都是一个字节,a=1,b=6, a||b = ( 1 or true )
2.18填空:16位机器上,补码0x8004转化等值的十进制是(-2044)
2.19 判断:T2U4(-8) + 8 = 16 (OK)
2.21 判断:C语言中: -2147483647-1U < -2147483647 ( ok )
2.23 填空:fun2(0xED005380) = (0xFFFFFF80)
2.24 填空:四位数0xC 截断为3位数,解释为无符号数的截断值是(4)
2.25 判断:代码for中条件 i<=(int) length -1 可以消除程序bug ( ok )
2.27 判断: 函数代码可以是 ruturn x+y >= y; (ok)
2.29 填空: [11000] + [11000] = ([110000])
2.33 填空:对于四位数补码8,其补码的非表示为十进制为(-8)
2.34 填空:补码 [100] * [101] = ([001100])
2.40 填空:K=31 移位2,加/减1,表达式为((x<<5)-x)
2.44 判断: 针对题目:(x>0)|| ((x-1)<0)的值为真 (x)
2.45 填空:二进制小数1.101转化为十进制为(1.625)
2.47 判断:浮点数 00111转化为十进制为1.5 (X)
2.50 填空:二进制数10.110舍入到最接近的二分之一的十进制的值为(2.5)
2.54 判断: f== -(-f) (ok)
第六周 第三章
regex 判断: 正则表达式r.t可以匹配rt. (x)
regex 判断:正则r表达式zo可以匹配z. (ok)*
***CH03 填空:从i386开始,x86体系结构扩展到了32位,增加了(平坦)寻址模式 *** CH03 填空:在64位机器上,要用gcc编译出32位机器码,需要使用(-m32) 选项
CH03 填空:对于机器级编程来说,两种重要的抽象是(ISA,虚拟地址)
CH03 填空:Linux中,对目标代码code.o进行反汇编的命令是(objdump -d code.o)
CH03 填空:IA32指令中,操作数的三种类型是(立即数、寄存器、存储器)
3.1 填空: 针对练习3.1中的图,操作数 8(%eax,%ecx,4)的值是(0x11)
***CH03 判断: 把内存中地址为0x4050处的字复制到地址为0x405c处的指令是 movw ($0x4050) ,($0x405c) (x) ***
CH03 判断: %esp的值为0x10c, pushl %eax后,%esp的值为0x108. (ok)
3.3 判断: movb $0xF, (%eax) 是正确汇编语句. (ok)
3.5 填空: decode1函数的功能是( 数据交换 )
3.6 填空: 指令leal 3(%eax,%ecx,4), %edx 存储在%edx中的值为( 3+x+4y )
3.9 填空: arith函数的功能是( ~((x^y)>>3) -z )
3.14 判断: 汇编代码不会记录程序值的类型。(ok)
CH03 填空:C语言中的条件表达式在汇编中是结合(有条件跳转和无条件跳转)实现的。
CH03 填空:C语言中的循环结构可以用(条件测试和跳转组合起来)实现。
CH03 选择:栈用来(ABCD) A 传递参数 B 存储返回信息 C保存寄存器 D本地存储。
CH03 填空:Linux汇编中,形成空调用栈帧的语句是(push %ebp movl %esp %ebp)
CH03 填空:Linux汇编中,函数有返回值存在( %eax )寄存器中。
第七周 第四章
find: 填空:查找当前目录下2天前被更改过的文件 (find . -mtime +2 -type f -print)
CH04 判断:Y86中,程序员的可见状态包括PC。(ok)
CH04 判断:Y86中,有5个双字节指令。(x)
4.1 Y86中 jmp 0x100 对应的机器码是(0x7000010000)
4.2 Y86中 0xa00f 对应的汇编语句是(pushl %eax)
CH04 判断:Y86中,状态码INS表示遇到非法指令。(ok)
CH04 填空:创建Y86代码唯一的工具是(汇编器 or YAS)
4.6 判断:Y86中,pushl压入栈的是减去4的%esp的值。(x)
CH04 填空:实现一个数字系统需要三组成部分(组合逻辑、存储器元素、时钟信号)。
CH04 填空:HCL代表(Hardware Control Language, 硬件控制语言)
4.8 填空:xor的HCL表达式是(bool xor = (!a &&b) ||(a && !b)) CH04 填空:HCL表达式bool Eq = (A==B)的功能是(判断字A、B是否相等)
4.10 填空:写出HCL代码,求输入字A、B中的最小值( 注意是两个 )
CH04 填空:Y86中,使用时钟寄存器保存程序计数器PC、条件代码CC和(程序状态Stat)
CH04 填空:Y86中,指令执行分为六个阶段(取指、译码、执行、访存、写回、更新PC)
CH04 填空:Y86中对于PC值p=100,指令包括一个寄存器指示符字节和,常数1,增加器产生值(106)
4.17 填空:实现HCL代码,需要查看教材第( 232 )页的图。
CH04 填空:p266, icode == IOPL :ifun; 的功能是(加减与异或运算的选择)
4.24 填空:mem_write中为什么有IRMMOVL( 寄存器往内存写 )
第八周 第六章
CH06 判断: SRAM比DRAM快。(ok)
CH06 判断:EEPROM可以用紫外线进行擦除。(x)
CH06 填空:根据携带信号不同,总线可分为(数据总线、地址总线、控制总线)三种。
6.2 填空:计算磁盘容量(327.68G):4个盘片,100000个柱面,每条磁道800个扇区,每个扇区512个字节。
CH06 填空:对磁盘扇区的访问时间包括三个部分(寻道时间、旋转时间、传送时间)。
6.3 填空:最大旋转时间是(4ms)。
CH06 填空:逻辑磁盘块的逻辑块号可以翻译成一个(盘面、磁道、扇区)三元组。
CH06 填空:CPU使用(存储器映射I/O)技术向I/O设备发出命令。
CH06 填空:局部性有两种形式(时间局部性、空间局部性)。
CH06 判断:程序访问一个向量,步长越大空间局部性越好。(x)
CH06 判断:程序中的循环语句具有良好的时间局部性和空间局部性(ok)
6.8 填空:只修改第八行,让程序具有良好的空间局部性。改为:( sum +=a[i][j][k] )
CH06 填空:存储层次结构的中心思想是(上层作为下层的缓存)。
CH06 填空:缓存不命时,决定哪个块是牺牲块由(替换策略)来控制。
CH06 填空:空缓存的不命中叫(强制性不命中或冷不命中)
CH06 填空:容量不命中的原因是(缓存太小)
CH06 填空:高速缓存结构可以用元组(S,E,B,m)来描述。
6.10 填空:高速缓存容量为1024,高速缓存结构为(( 32 ),4,8,32)
6.11 填空:3/4的命中率的如何计算的((32-8)/32,或每4次有一次不命中)
CH06 判断:存储器山中山脊代表空间局部性。(x)
第二部分 收获
1.站在全局的角度,重新理解计算机系统。重新复习了计算机导论、汇编、c语言的相关知识,感觉自己对知识的理解有了更深的认识。
2、学习了linux的相关命令,这可以说是元知识,但是,我学习的不太扎实,如果可以经常使用,可能会掌握的更熟练。
3、学习了vim、gcc、gdb、makefile等工具,这样可以为之后的学习打下扎实的基础,后来我发现gdb在缓冲区漏洞攻击中也有很大的作用。
4、了解计算机如何将高级语言转换为低级语言,就是汇编语言,又把低级语言转化成立机器语言,就是01代码,在第四章的学习中,我通过学习Y86系统,对计算机的工作原理有了深刻的认识。 5、掌握了自学的方法,也学会了自己解决遇到的问题,这可能是除了收获知识以外最大的收获。在遇到其他学科的问题时,我也有了一套自己搜索获得解决办法的方法,这可以说是学会捕鱼的方法,而不只是得到了鱼。
第三部分 不足
1、第一周的学习,由于当时在电子实习,并且参加了一些活动,没有很好的准备,只是囫囵吞枣的看了一下,包括实验只是照着做了一下,做完很快就忘了,这也是我刚开始基础没打好,后面用到的时候,要不断的现查。
2、对学习的内容没有复习,只是学一遍,考试之前大体看一下,没有做到把书看很多遍,所以理解还只是很浅层,但有之前课程的基础,还不至于看不懂,但是更深入的部分,也不能熟练掌握。
3、有时候有一些扩展资料,没有好好阅读,就是把它当小说看了,也没太过脑子。
4、还是应该一步一个脚印慢慢来,就比如说第一周的linux基础的学习,当时为了按时完成任务,看的很浮躁当然也很快,然而这样看完了一遍内心觉得已经看过了,但之后就是不想再看一遍了,可能就是当时看的时候潜意识里觉得看的很痛苦,所以从一开始就不能糊弄,想赶上也不是那么轻松的。
5、面对各种各样的要求,老是不能做到面面俱到,总是拆了东墙补西墙的,这少一点,那少一点,还是应该态度更加端正一些!!!
6、说到底,最大的问题就是浮躁,就是能不能沉下心去学,能不能拒绝周围的诱惑,还是应该更认真一些!!!
第四部分 课程建议和意见
1、感觉老师那里有很多经验和技术,希望老师上课可以多讲一些,一些实用的技巧,我觉得老师之前让我们看的课本的部分,真的就是知识部分,就是想自学的人可以通过百度直接得到的部分,我们现在是了解这些知识,但绝不是深入透彻的理解,毕竟学一遍,而且是自学的,程度肯定是不一样的,所以还是想能多听一听老师讲的:)
参考资料
1、《深入理解计算机系统》课本
2、实验楼实验指导书:https://www.shiyanlou.com/courses/413 实验
3、每周重点:http://group.cnblogs.com/topic/73069.html
4、往期博客http://i.cnblogs.com/
5、Linux man命令的使用方法:http://www.cnblogs.com/hnrainll/archive/2011/09/06/2168604.html