一、三个命令
man -k:
1.常用来搜索,结合管道使用。例句如下:
man -k k1 | grep k2 | grep 2 搜索同时含有k1和k2,且属于系统调用。
2.man 3 printf 即查找c语言中printf的用法。
grep -nr:
这条语句可以用来查找关键字,全文搜索,并且可以直接查找文件内的内容。其中:
n:为显示行号
r:为递归查找
例如,如果想查找某个宏,我们已知宏保存在include文件夹中,所以可以使用下列语句:
grep -nr XXX /usr/include(XXX为所要找的宏)
cheat:
提供显示Linux命令使用案例
cheat ls
二、第二周任务小结
vim
vim是一种非常好用的编辑器,总共有六种基本模式,最常用的是普通模式、插入模式和命令行模式。需要熟悉这三种模式之间的切换方式:
·普通→插入: i 或 a
·插入→普通: Esc 或 Ctrl + [
·普通→命令行: :
·命令行→普通:Esc 或 Ctrl + [
·常用的进入、保存和退出指令:
·进入:vim 文件名
·保存:命令行模式 :w
·退出:命令行模式 :q
·常用动作:
删除:dd删除整行
复制:yy复制整行
粘贴:p
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 [行数或函数名] <if表达式>4.临时断点
tbreak [行数或函数名] <条件表达式>
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)
三、正则表达式
作用:
·验证是否匹配查找替换\
·特殊符号,表示后面的字符本身[ ]
·匹配其中任意字符,但每次匹配只匹配一个[^ ]
·匹配除其中的任意字符,每次匹配只匹配一个
规则:
·{n} 次数修饰,重复n次,具体如下:
·?= {0,1}
·+= {1, } *= {0, }
·{m,n}:至少为m,至多为n
从字符串开始的地方匹配$
从字符串结束的地方匹配|
可以匹配左或者右
匹配方法:
1.次数修饰中,可以表示当做整体。
2.结果中,可以表示单独表示。
四、静态库与动态库
静态库:.a(linux)、.lib(windows)
动态库:.so(linux)、.dll(windows)
静态库(以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链接。
五、课本归纳
第一章 计算机系统漫游
1.信息
位+上下文
2.程序被翻译成不同格式
编译系统
预处理器、编译器、汇编器、链接器
3.存储设备层次结构
核心思想:缓存
操作系统核心抽象:文件、虚存、进程、虚拟机
第二章 信息的表示和处理
1.信息存储
进制转换:拿二进制作中间量
网络编程基础:字节顺序
大端法:高对低,低对高
小端法:高对高,低对低
运算:
逻辑运算:结果0或1(如果对第一个参数求值就能确定表达式的结果,那么就不会对第二个参数求值)
位运算:结果位向量
·有无符号计算、截断、扩展都要结合具体的练习来体会公式的使用。
·掩码:对特定位可以置一,可以清零
IEEE浮点标准:
V=(-1)^s X 2^E X M 来表示一个数
符号:s决定这个数是正还是负。
阶码:E对浮点数加权,权重是2的E次幂。
尾数:M是一个二进制小数,范围为1~2-ε或者0~1-ε。
舍入:
向偶舍入:将数字向上或向下舍入,结果的最低有效数字为偶数。
能用于二进制小数。(默认)
向零舍入:把整数向下舍入,负数向上舍入。
向下舍入:正数和负数都向下舍入。
向上舍入:正数和负数都向上舍入。
第三章 程序的机器级表示
do-while循环
通用形式:
do
body-statement
while(test-expr);
循环体body-statement至少执行一次。
可以翻译成:
loop:
body-statement
t = test-expr;
if(t)
goto loop;
即先执行循环体语句,再执行判断。
while循环
通用形式:
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翻译。
for循环
for循环可以轻易的改成while循环,所以再依照上面的方法改成do-while再翻译即可。
寄存器使用惯例
程序寄存器组是唯一能被所有过程共享的资源。
这个惯例是为了防止一个过程P调用另一个过程Q时寄存器中的值被覆盖。惯例如下:
%eax,%edx,%ecx 调用者保存寄存器(Q可覆盖,P的数据不会被破坏)
%ebx,%esi,%edi 被调用者保存寄存器(Q在覆盖这些值前必须压入栈并在返回前回复他们)
%ebp,%esp 惯例保持%eax用来保存返回值
栈帧结构
·栈帧——为每一个过程分配的内存空间,它包含两个特殊的参数,栈指针和帧指针。
·栈是向低地址增长的。
·帧指针:%ebp,指向栈底。
·栈指针:%esp,指向栈顶,栈指针可以移动,来分配或释放空间。
·%esp减小——分配空间
·%esp增大——释放空间
第四章 处理器体系结构
Y86指令集体系结构
halt指令、非法指令、访问非法地址
HCL硬件控制语言
组合逻辑、存储器元素、时针信号
表达式:
AND:&&OR:||NOT:!
Y86的顺序实现
取指、译码、执行、访存、写回、更新PC
第六章存储器层次结构
随机访问存储器RAM
分类:SRAM和DRAM
特点:掉电失忆
SRAM比较DRAM
SRAM:供电不变,不刷新,抗干扰,存取快,贵
只读存储器ROM
分类:根据能被重新编写次数和对其编程所用机制分
PROM:编程一次EPROM:能被擦除和重编1000次EEPROM:基于EPROM,达10^5次flash:一类非易失性存储器
特点:非易失性
磁盘
·磁盘的容量 = 每扇区大小每磁道扇区数磁道数 2 盘片数量
· 访问时间
T(max rotation)=1/RPM * 60secs/1min ——最大旋转延迟时间
T(avg rotation)=1/2 * T(max rotation) ——平均延迟时间
T(avg transfer)=1/RPM * 1/(平均扇区数/磁道) * 60secs/1min ——平均传送时间
T(access)=T(avg seek)+T(avg rotation)+T(avg transfer) ——整个估计的访问时间
·总结:访问一个磁盘扇区中512字节主要花在寻道时间和旋转延迟
总线
存储总线
·并行传递方式。
·指令和数据向CPU传递时的通道。
分三组:
·数据总线(用于传递数据)。
·地址总线(用于传递主存储器的地址)。
·控制总线(用于各种内部控制指令的传递)。
·系统总线
传送的信息包括数据信息、地址信息、控制信息。
数据总线(用于传送数据信息)。
地址总线(用来传送地址的地址总线的位数决定了CPU可直接寻址的内存空间大小)。
控制总线(用来传送控制信号和时序信号)。
I/O总线:指缆线和连接器系统,用来传输I/O路径技术指定的数据和控制信号。
参考资料:
1.教材《深入理解计算机系统》
2.博客每周测试解析
3.小组同学提问与老师的解析
4.20135202闫佳歆http://www.cnblogs.com/20135202yjx/p/4926597.html循环部分
总结
两个月以来的学习,让我每天都感到很充实,看着厚厚的教材勾勾画画的“摧残”了一半多,内心还是挺有成就感的,虽然第一遍看都不怎么看得懂有点打击信心,但是通过题目,通过老师讲解,通过抱着书蹿来蹿去的问学霸,虽然不是很扎实,但还是收获了很多东西。我很喜欢论坛小组答疑交流这个环节,看看大家提出的问题,给我的学习提供了不小的指导和帮助,也同时解决了一些我也存在的问题,并且节省了我去问老师问同学的时间。
由于没学过汇编,对于汇编语言那一块内容实在让我很头疼,然后只能花费大量的时间去学习查阅资料,但是对于代码也仅仅是做到了大致知道是个什么意思还达不到理解透彻。有些题目就算对着答案也还是看得似懂非懂,路漫漫其修远兮,在之后的学习我会尽我所能将这本书啃透。