信息安全系统设计基础第八周期中总结
chapter1重点知识复习提纲
一、week2
1、学习目标
①能够独立安装Linux操作系统 ②能够熟练使用Linux系统的基本命令 ③熟练使用Linux中用户管理命令/系统相关命令/文件目录相关命令/打包压缩相关命令/比较合并相关命令/网络相关命令等 ④熟练应用“搜索”进行举一反三的学习
①重点学习
cheat/find/locate/grep/man/whereis/which/apt-get
②这学期需要掌握的命令有:
ac,apt-get,bzip2,cat,chgrp,chmod,chown,clear,compress,cp, dd,df,diff,du,dump,evn,find,finger,free,grep,gzip,head,kill,less, ln,locate,l,gout,ls,man,mkdir,more,mount,mt,mv,netstat,nslookup, od,passwd,patch,ps,pstop,pwd,rm,shell,sort,ssh,stty,tail,tar,telnet, touch,tree,uname,unzip,vi,vim,whereis,which,who,write等
二、week3(教材:第一章,第七章;《嵌入式Linux应用程序开发标准教程》第三章3.1-3.5)
1、学习目标
①熟悉Linux系统下的开发环境 ②熟悉vi的基本操作 ③熟悉gcc编译器的基本原理 ④熟练使用gcc编译器的常用选项 ⑤熟练使用gdb调试技术 ⑥熟悉makefile基本原理及语法规范 ⑦掌握静态库和动态库的生成
2、重点知识点
①vim大写“K”可以用来查找函数的帮助信息:查看 man page,命令模式下,将光标放在函数名上,按"K"可以直接察看 man page。 :set nu 显示行号 :set ai 自动缩行 :set ts=4 设置一个 TAB 键等于几个空格 [[ 转到上一个位于第一列的"{" ]] 转到下一个位于第一列的"{" { 转到上一个空行 } 转到下一个空行 gd 转到当前光标所指的局部变量的定义
②gcc
GNU CC(简称为gcc)是GNU项目中符合ANSI C标准的编译系统,能够编译用C、C++和Object C等语言编写的程序。gcc又是一个交叉平台编译器,它能够在当前CPU平台上为多种不同体系结构的硬件平台开发软件,因此尤其适合在嵌入式领域的开发编译。
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
gdb programm(启动GDB) b 设断点(要会设4种断点:行断点、函数断点、条件断点、临时断点) run 开始运行程序 bt 打印函数调用堆栈 p 查看变量值 c 从当前断点继续运行到下一个断点 n 单步运行 s 单步运行 quit 退出GDB
display 跟踪变量值的改变 until 跳出循环 finish 跳出函数 help 帮助
1 man: man -k (等价于apropos) 2 cheat 3 find locate 4 which whereis 5 apt-cache search
教材第一章: p1 理解信息就是位+上下文 p2 查看源文件可以用od 命令 : od -tc -tx1 hello.c p5 冯式结构,理解p6 CPU执行指令的操作(加载、存储、操作、跳转) p9 存储系统的核心思想:缓存 p10 操作系统核心抽象(文件、虚存、进程、虚拟机):可以指导大家学习《操作系统》 教材第七章: p450 链接器的两个任务、目标文件的三种形式、目标文件格式(a.out COFFPE ELF):这四种格式,特别是PE,ELF格式是信安专业同学要掌握的,是研究病毒等恶意代码的基础 p451: ELF文件格式:试试readelf命令 p455: 理解全局符号的解析:学会多个模块。 p473: 处理目标文件的工具
三、week4(第二章《信息的表示和处理》)
1、学习目标①理解二进制在计算机中的重要地位 ② 掌握布尔运算在C语言中的应用 ③ 理解有符号整数、无符号整数、浮点数的表示 ④ 理解补码的重要性 ⑤ 能避免C语言中溢出,数据类型转换中的陷阱和可能会导致的漏洞
p20: 三种数字:无符号数、有符号数(2进制补码)、浮点数,产生漏洞的原因(逆向) p22: 进制转换,拿二进制作中间结果 p25: gcc -m32 可以在64位机上(比如实验楼的环境)生成32位的代码 p26: 字节顺序是网络编程的基础,记住小端是“高对高、低对低”,大端与之相反就可以了。 p32: 区分逻辑运算(结果是1或0)和位运算(结果是位向量),所有逻辑运算都可以用与、或、非表达(最大式、最小式),而与或非可以用“与非”或“或非”表达,所以,只要一个与非门,就可以完成所有的逻辑运算。 p33: 掩码是位运算的重要应用,对特定位可以置一,可以清零 p38: 要用C99中的“long long”类型,编译是要用 gcc -std=c99 p39: 补码的利用寄存器的长度是固定的特性简化数学运算。想想钟表,12-1 等价于 12 + 11,利用补码可以把数学运算统一成加法,只要一个加法器就可以实现所有的数学运算。 p44: 注意C语言中有符号数和无符号数的转换规则,位向量不变。想想第一章说的 信息就是“位+上下文” p48: 负数与正数(信息安全的逆向思维) p49: 0扩展和符号扩展 p54: 整数运算溢出及避免办法 p67: 关于整数运算的最后思考 p67: 浮点数与科学计数法,IEEE标准754 p68: 浮点数运算的不精确性与舍入 p70: IEEE浮点标准,float/double类型 p74: 整数与浮点数表示同一个数字的关系 p78: 整数与浮点数转换规则
三、week5(教材第三章《程序的机器级表示》)
①理解逆向的概念以及 ②掌握X86汇编基础,能够阅读(反)汇编代码 ③了解ISA(指令集体系结构) ④理解函数调用栈帧的概念,并能用GDB进行调试
p104, p105: X86 寻址方式的三代 p106: ISA的定义,ISA需要大家能总结规律,举一反三,比如能对比学习ARM的ISA;PC寄存器要好好理解; p107: gcc -S xxx.c -o xxx.s 获得汇编代码,也可以用objdump -d xxx 反汇编; 注意函数前两条和后两条汇编代码,所有函数都有,建立函数调用栈帧,应该理解、熟记。 p108: 二进制文件可以用od 命令查看,也可以用gdb的x命令查看。 有些输出内容过多,我们可以使用 more或less命令结合管道查看,也可以使用输出重定向来查看od code.o | more;od code.o > code.txt p109: gcc -S 产生的汇编中可以把 以”.“开始的语句都删除了再阅读 p110: 了解Linux和Windows的汇编格式有点区别:ATT格式和Intel格式 p111: 表中不同数据的汇编代码后缀 p112: 这几个寄存器要深入理解,知道它们的用处。esi edi可以用来操纵数组,esp ebp用来操纵栈帧。 对于寄存器,特别是通用寄存器中的eax,ebx,ecx,edx,大家要理解32位的eax,16位的ax,8位的ah,al都是独立的,我们通过下面例子说明 p113: 结合表,深入理解各种 寻址方式;理解操作数的三种类型:立即数、寄存器、存储器; 掌握有效地址的计算方式 Imm(Eb,Ei,s) = Imm + R[Eb] + R[Ei]*s p114: MOV相当于C语言的赋值”=“,注意ATT格式中的方向, 另外注意不能从内存地址直接MOV到另一个内存地址,要用寄存器中转一下。能区分MOV,MOVS,MOVZ,掌握push,pop p115/p116: 栈帧与push pop; 注意栈顶元素的地址是所有栈中元素地址中最低的。 p117: 指针就是地址;局部变量保存在寄存器中。 p119: 结合表理解一下算术和逻辑运算, 注意目的操作数都是什么类型 特别注意一下减法是谁减去谁 注意移位操作移位量可以是立即数或%cl中的数 p123: 结合C语言理解一下控制部分,也就是分支(if/switch),循环语句(while, for)如何实现的。考验大家举一反三的学习能力。控制中最核心的是跳转语句:有条件跳转p128(实现if,switch,while,for),无条件跳转jmp(实现goto) p124: 有条件跳转的条件看状态寄存器(教材上叫条件码寄存器) 注意leal不改变条件码寄存器 思考一下:CMP和SUB用在什么地方 p125: SET指令根据t=a-b的结果设置条件码 p127: 跳转与标号 p130/p131: if-else 的汇编结构 p132/p133: do-while p134/p135: while p137/p138: for p144/p145: switch p149: IA32通过栈来实现过程调用。掌握栈帧结构,注意函数参数的压栈顺序. p150/p151: call/ret; 函数返回值存在%eax中 p174: bt/frame/up/down :关于栈帧的gdb命令
四、week6(第六章《存储器层次结构》)
1、学习目标
①了解ISA抽象的作用 ②掌握ISA,并能举一反三学习其他体系结构 ③了解流水线和实现方式
本章内容是处理器体系结构,重点掌握ISA,并能举一反三; 设计并实现了一个结合CISC和RISC思想的处理器Y86,一个类IA32体系的处理器; ISA在编译器编写者和处理器设计者之间提供了一个抽象。
五、week7(第六章《存储器层次结构》)
1、学习目标
①了解常见的存储技术(RAM、ROM、磁盘、固态硬盘等) ②理解局部性原理 ③理解缓存思想 ④理解局部性原理和缓存思想在存储层次结构中的应用 ⑤高速缓存的原理和应用
2、重点知识点
6.1节 了解三种常见存储技术:RAM/ROM/磁盘; RAM有SRAM和DRAM,特点和应用; ROM有PROM,EPROM,E2PROM,FLASH; 磁盘是重点,涉及到后面的i/o和文件系统,做好相关练习 磁盘结构:盘片、磁道、扇区、间隙、柱面;磁盘驱动器 磁盘容量 访问时间:寻道、旋转、传送 逻辑磁盘块:内存可以看成字节数组、磁盘可以看成块数组 总线 数据总线、控制总线、地址总线 系统总线、存储总线、I/O总线:p395图要理解 读写事务:P389图要能理解 6.2节 局部性原理:时间局部性、空间局部性,有能力者理解一下p429最后一段“存储器山” 数据引用局部性 取指令局部性 6.3节 存储层次结构:系统观(1+1>2)(举一反三:对称不对称加密形成的混合加密系统,混合动力汽车...) 中心思想:每层存储设备都是下一层的“缓存” 对照p408的表理解 6.4节 高速缓存结构(S,E,B,m):高速缓存组、高速缓存行、块 映射 命中 缓存管理
chapter2考点复习
2.4、2.6、2.8、2.11、2.13、2.14、2.18、2.19、2.21、2.23、2.24、2.25、2.27、2.29、2.33、2.34、2.39、2.40、2.42;
2.43、2.44、2.45、2.47、2.50、2.52、2.54
二、第五周:
3.1,3.3,3.5,3.6,3.9,3.14,3.15,3.16,3.22,3.23,3.27,3.29,3.30,3.33,3.34
三、第六周
4.1 4.2 4.5 4.6 4.8 4.10 4.11 4.12 4.16 4.17 4.19 4.21 4.24
四、第七周
6.2 6.3 6.4 6.8 6.9 6.10 6.11 6.12 6.13
chapter3巩固部分
一、课上强调部分
1、find
在指定目录下搜索指定文件名的文件:
$ find /etc/ -name interfaces
注意 find 命令的路径是作为第一个参数的, 基本命令格式为 find [path] [option] [action]
与时间相关的命令参数:
参数 | 说明 |
---|---|
-atime |
最后访问时间 |
-ctime |
创建时间 |
-mtime |
最后修改时间 |
下面以-mtime
参数举例:
-mtime n
: n 为数字,表示为在n天之前的”一天之内“修改过的文件-mtime +n
: 列出在n天之前(不包含n天本身)被修改过的文件-mtime -n
: 列出在n天之前(包含n天本身)被修改过的文件newer file
: file为一个已存在的文件,列出比file还要新的文件名
列出 home 目录中,当天(24 小时之内)有改动的文件:
$ find ~ -mtime 0
列出用户家目录下比Code文件夹新的文件:
$ find ~ -newer /home/shiyanlou/Code
2、grep
grep
命令是很强大的,也是相当常用的一个命令,它结合正则表达式可以实现很复杂却很高效的匹配和查找,不过在学习正则表达式之前,这里介绍它简单的使用,而关于正则表达式后面将会有单独一小节介绍到时会再继续学习grep
命令和其他一些命令。
grep
命令的一般形式为:grep [命令选项]... 用于匹配的表达式 [文件]...
-r
参数表示递归搜索子目录中的文件,-n
表示打印匹配项行号,-I
表示忽略二进制文件。
3、man
在 Linux 环境中,如果你遇到困难,可以使用man 命令,它是Manual page的缩写。
Manual pages 是在 UNIX 或类 UNIX 操作系统在线软件文档的一种普遍的形式。 内容包括计算机程序(包括库和系统调用),正式的标准和惯例,甚至是抽象的概念。用户可以通过执行 man 命令调用手册页。
你可以使用如下方式来获得某个命令的说明和使用方式的详细介绍:
$ man <command_name>
通常情况下,man 手册里面的内容都是英文的,这就要求你有一定的英文基础。man 手册的内容很多,涉及了 Linux 使用过程中的方方面面,为了便于查找,是做了分册(分区段)处理的,在Research UNIX、BSD、OS X 和 Linux 中,手册通常被分为8个区段,安排如下:
区段 说明 1 一般命令 2 系统调用 3 库函数,涵盖了C标准函数库 4 特殊文件(通常是/dev中的设备)和驱动程序 5 文件格式和约定 6 游戏和屏保 7 杂项 8 系统管理命令和守护进程
要查看相应区段的内容,就在 man 后面加上相应区段的数字即可,如:
$ man 3 printf
所有的手册页遵循一个常见的布局,其为通过简单的 ASCII 文本展示而优化,而这种情况下可能没有任何形式的高亮或字体控制。一般包括以下部分内容:
NAME(名称) 该命令或函数的名称,接着是一行简介。 SYNOPSIS(概要) 对于命令,正式的描述它如何运行,以及需要什么样的命令行参数。对于函数,介绍函数所需的参数,以及哪个头文件包含该函数的定义。 DESCRIPTION(说明) 命令或函数功能的文本描述。 EXAMPLES(示例) 常用的一些示例。 SEE ALSO(参见) 相关命令或函数的列表。
也可能存在其他部分内容,但这些部分没有得到跨手册页的标准化。常见的例子包括:
OPTIONS(选项),EXIT STATUS(退出状态),ENVIRONMENT(环境),BUGS(程序漏洞),FILES(文件),AUTHOR(作者),REPORTING BUGS(已知漏洞),HISTORY(历史)和COPYRIGHT(版权)
通常 man 手册中的内容很多,你可能不太容易找到你想要的结果,不过幸运的是你可以在 man 中使用搜索,/<你要搜索的关键字>,查找到后你可以使用n键切换到下一个关键字所在处,shift+n为上一个关键字所在处。使用Space(空格键)翻页,Enter(回车键)向下滚动一行,或者使用j,k(vim编辑器的移动键)进行向前向后滚动一行。按下h键为显示使用帮助(因为man使用less作为阅读器,实为less工具的帮助),按下q退出。
chapter4考点预测
①关键字检索
man -k k1| grep k2 | grep 2
②宏的查找
grep -nr STDIO_FILENO /usr/include
其中-r代表递归查找,-n代表行数
③打印文件内容:cat
④显示当前文件目录:ls
⑤显示当前登录用户:who(am i)
⑥cheat
⑦静态库动态库的生成命令
⑧makefile的生成命令
⑨gcc编译过程
⑩gbd调试命令
chapter5错题及遗忘知识点记录
第三周:
错题:
>>填空:Linux中没有C盘,D盘,其文件系统的目录是由(FHS)标准规定好的。 >>判断:Linux Bash中,df和 du 命令功能等价。x >>填空:Linux Bash中,使用wc统计hello.c共有几行代码的的命令是( wc -l hello.c ) >>填空:Linux Bash中,把ls命令显示当前目录的结果存入ls.txt的命令输出重定向命令是(ls > ls.txt)
其他:
填空:实验楼环境中所有的默认系统用户名和密码均为 (shiyanlou )。 填空:Linux Bash中,Ctrl+a快捷键的作用是(将光标移至输入行头,相当于Home键)。 判断:Linux Bash中, man printf和man 1 printf 功能等价。 ok 填空:在 Linux 里面可以使用使用(groups)命令知道自己属于哪些用户组。 填空:在 Linux 里面可以使用使用(chmod)命令修改文件的权限。 判断: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)。 判断:Linux Bash中,使用tar命令把home目录打包成home.tar的命令是( tar -cf home.tar ~) 填空:Linux Bash中,zip命令使用(-e)参数可以创建加密压缩包。 填空:Linux Bash中,ls . | sort 命令的功能是( 显示当前目录内容并排序 ) 填空:Linux Bash中,使用grep查找当前目录下*.c中main函数在那个文件中的命令是( grep main *.c ) 判断:col 命令的-h参数可以将Tab换成对等数量的空格建。x , 空格换tab 填空:Linux Bash中,(tee )命令可以同时重定向到多个文件。
第四周:
错题:
cheat 填空:To list the content of /path/to/foo.tgz archive using tar ( tar -jtvf /path/to/foo.tgz ) grep 填空:查找宏 STDIN_FILENO 的值的命令是(grep -nr XXX /usr/include) CH07填空:链接器的两个主要任务是(符号解析和重定位)。 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.o gcc main.c -o main -L. -lmymath (or 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.o gcc -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 填空: 数据结构中有线性查找算法,C标准库中没有这个功能的函数,但Linux中有,这个函数是(lfind或lsearch) find 填空:查找当前目录下所有目录的find命令是(find . -type d) CH01填空:计算机系统中的所有信息都是位串表示的,所谓(信息)就是位+上下文。 CH01填空:存储器层次结构的主要思想是上层存储器作为下层存储器的(高速缓存)。 CH01填空:操作系统中最基本的四个抽象是(虚拟机、进程、虚拟存储器、文件)。 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
第五周:
错题:
cheat 填空:使用du命令对当前目录下的目录或文件按大小排序 的命令是( du -sk *| sort -rn ) grep 填空:~/test 文件夹下有很多c源文件,查找main函数在哪个文件中的命令( grep main *.c ) 2.6 填空:练习2.6中匹配的二进制共21位,用16进制表示是( 0x159141 ) 2.13 判断: /*compute x&y, only calls to functions bis and bic*/ int bool_and(int x, int y){ int result = bic(x, y); return result; } (X) 2.18 填空:16位机器上,补码0x8004转化等值的十进制是( -2044 )
其他:
man -k 填空:Linux中显示文件(file )属性(status)的命令是( stat ) 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.8 填空: a,b长度都是一个字节,a=1,b=6, a|b = ( 7 or [00000111] ) 2.11 判断: 代码中第四行 "<=" 换成“>=” 就可以解决代码问题。 ( X ) 2.14 填空:a,b长度都是一个字节,a=1,b=6, a||b = ( 1 or true ) 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)
第六周:
错题:
3.14 判断: 汇编代码不会记录程序值的类型。(ok) 3.5 填空: decode1函数的功能是( 数据交换 ) CH04 判断:Y86中,有5个双字节指令。(x) 4.8 填空:xor的HCL表达式是(bool xor = (!a &&b) ||(a && !b)) CH04 填空:p266, icode == IOPL :ifun; 的功能是(加减与异或运算的选择)
其他:
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.6 填空: 指令leal 3(%eax,%ecx,4), %edx 存储在%edx中的值为( 3+x+4y ) 3.9 填空: arith函数的功能是( ~((x^y)>>3) -z ) 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) 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, 硬件控制语言) CH04 填空:HCL表达式bool Eq = (A==B)的功能是(判断字A、B是否相等) CH04 填空:Y86中,使用时钟寄存器保存程序计数器PC、条件代码CC和(程序状态Stat) CH04 填空:Y86中,指令执行分为六个阶段(取指、译码、执行、访存、写回、更新PC) CH04 填空:Y86中对于PC值p=100,指令包括一个寄存器指示符字节和,常数1,增加器产生值(106) 4.17 填空:实现HCL代码,需要查看教材第( 232 )页的图。 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)
chapter6个人心得
这阶段的学习以来,我每天都会抽时间看书,这也算是习惯的养成了。以前我对计算机类的书籍总是看不进去,即使有学习的想法也很难坚持下来。我觉得,娄老师将这样一本计算机界的典籍选作我们的教材,也是希望我们在学习的要求下能够感受到经典的力量。毕竟如果是课下的补充我们很难会有人去真正通读这本书。既然有了硬性计划,每周一章这样的进度发下来以后,我们也不得不硬着头皮看下去。前期或许真的是应付式的,后面就越来越能够静下心真正去阅读、获取知识、认真做笔记了。且不说这样的学习收获是在于学会了什么编程技能、计算机内部构造理解,我觉得光是进入读书的境界就很难能可贵。
接下来我说说我获得的学习方面的收获。老师时常强调要学会搜索。这个搜索,不是指你遇到了问题,不去动脑,不去尝试就抓着身边的同学问“这个是怎么回事?我该怎么办?”我觉得,学习过程遇到问题实属正常,你必须要学会尝试、查询、获取、验证、掌握这几个阶段。比如man这个命令,老师常说这个命令一旦掌握了用法,以后遇到问题都可以去解决了。遇到了问题,你可以先检查自己的理解、操作是否粗心出错了,如果没有则进入下一个阶段——尝试。你可以将日常中学到的其他方法(可以使读书学习到的、也可以是自己学多了融会贯通举一反三觉得可行的)去尝试着解决看看。如果还是不行,则开始查询,可以借助书籍、网络去查询前人遇到同样问题以后的经验。然后自己再移植到自己的问题上去解决问题。这时如果还是不行,才去咨询身边的同学们和老师。毕竟老师与同学是你的同行者而非咨询者,应该在自己努力尝试过后不得的情况下去请教他们请求协助。在解决问题以后,就是最后一个环节——掌握。每一个问题的背后都隐藏着你学习环节的欠缺,你应该在填上漏洞以后学会巩固,用这部分的周边延伸知识学好,学精,防止再次犯错。
然后就是平时的计算机方面的具体知识。这些都体现在以前每周的博客中了。用心做了笔记和个人学习后的理解。这些详细的点以后就会慢慢渗透到具体编程学习中的。
这次期中总结我将结构分为五个大块:第一是每周老师的学习提纲,期中经过我个人的修改和删减。我将看过书以后觉得能够简单理解并记住的地方删除,留下了一些比较关键的点,列为每章复习的提纲。知识点范围广,不可能一一填充进短小的博客。我还是借助这些提纲、以以往的每周学习总结为蓝本、挑选着课本中的重叠部分重点学习。第二是习题记录。老师每周所画习题是需要掌握并且会作为考试范围的经典题。在复习过程中我依旧将他们再做一遍以防忘记。套公式的题则进行理解。使自己不要再错。第三是巩固部分,放置的是老师上课所强调的几个命令,加上我在《嵌入式Linux教程》中摘录的部分、实验楼实验指导书、网上资料中摘录的知识,整合在一起,用于巩固这些没有专题讲过的命令的自我学习。第四是考点猜测,根据老师上课强调的频率和大家伙错误的数量还有考试频率我预估的几个部分。也是仅仅列为提纲用于模块复习。好几个模块在以往试题中均有体现,可以将错题延伸一下。最后第五是所有题目的集锦,前部分是我自己错误的题目(卷子没有回发我具体也不太知道自己错哪一题,有可能以前会的题我忘了所以也列进去了),后面是我做对的题目,用于参照复习。
以上是我在写博客此时能够想到的心得。当然,这半学期以来的学习给我的感悟肯定也是这寥寥数语所能说完的。但我又想,说多也无益,重点还是学习,脚踏实地的学习...才是以后最重要的。
chapter7个人反思
我觉得,学习中有时候对题目理解不透导致写不出来或者看着答案不知道为什么的时候会很烦躁,仿佛回到了高三学习物理的时候那种感觉。我对一些理工的东西理解起来比较慢,也很容易烦躁。这种心态的调节是我以后学习中的大敌,需要慢慢克服。
还有就是在学习的时候我对一些题目的理解仅限于独立的题,不太会延伸扩展,遇到其他的提法就不太会了。比如磁盘那一章在习题中出现柱面的时候我发现公式套不上了,我就不会了。其实题目较前一题知识换了一种提法。后来再将前部分文字再读一遍以后才对。这也是理解不透彻导致的。以后学习还是应该慢读细读不能跨越式阅读。
chapter8课程建议
我个人觉得,老师的进度可以。但是在加分环节有点复杂。我觉得一步一步按部就班就挺好的,加上一两个固定的加分环节。现在的加分项目有点多,可以说是层出不穷了。导致很多人都奔着加分去,课内知识更不能完成得很好,也不能安排好时间巩固知识。而那些专注于学精的同学反而不一定能够获得好成绩。同学们借鉴改改博客换换格式就应付式发好博客,然后去弄加分项目。这样一来课内知识不就被忽略了吗。但是也仅仅是我个人的想法。
chapter9参考文献
1、《深入理解计算机系统》
2、《嵌入式Linux应用程序开发》
3、我的往期博客:http://www.cnblogs.com/paperfish/