zoukankan      html  css  js  c++  java
  • 第八周学习报告

    学习计时:共4小时

    读书:2小时

    代码:0小时

    作业:0小时

    博客:2小时

    知识点总结:

    一、Linux命令

    k 上移 j 下移 h 左移 l 右移

    q!退出并丢弃一切改动

    x 删除错误字符

    i 插入字符(esc返回正常模式)

    A 在最后一行添加文本

    vim+文件名 编辑文件

    wq 保存并退出

    删除类:

    dw 从光标处删除一个单词

    d$ 从光标处删至行尾

    de 从当前光标位置删除至单词末尾

    动作:

    在动作前输入数字可使其重复

    dd 删除整行

    u 撤销最后执行的命令

    U 恢复该行原始状态

    ctrl+R 撤销撤销命令。。。

    p 粘贴

    0 将光标移到行首

    r 替换光标所在位置字符

    ce 改变至一个单词末尾

    执行命令:

    搜索 /或?

    过滤 !

    打开文件:

    vim+文件名

    或 e+文件路径

    i 进入插入模式

    w 保存文档

    w+文件名 另存为

    复制粘贴

    普通模式

    y复制 p粘贴

    剪切粘贴

    dd剪切 p粘贴

    ddp交换上下行

    ~转换大小写

    字符的替换与撤销(Undo)

    快速缩进

    普通模式下输入15G,跳转到15行

    普通模式下输入>> 整行将向右缩进(使用,用于格式化代码超爽)

    普通模式下输入<< 整行向左回退

    普通模式下输入:进入命令行模式下对shiftwidth值进行设置可以控制缩进和回退的字符数

    shiftwiden命令

    可以控制缩进或回退的字符数

    调整文本命令

    ce 居中

    ri 靠右

    le 靠左

    查找

    快速查找

    /+要查找的字符串

    ?向上查找,/向下查找

    n 继续查找 N 反向查找

    高级查找

    *寻找游标所在处的单词

    #同上,但 * 是向前(上)找,#则是向后(下)找

    g** ,但部分符合该单词即可

    g## ,但部分符合该单词即可

    多文件编辑

    n/N!强制切换:之前文件的输入没有保存,仅仅是切换到另一个文件

    打开新文件

    e+文件名 打开文件

    e#回到前一个文件

    ls 列出以前编辑过的文档

    b+文件名 直接进入编辑

    bd+文件名 删除以前编辑过的文件项目

    e!+文件名 打开新文件,放弃正在编辑的文件

    f 显示正在编辑的文件名

    f+文件名 改变正在编辑的文件名

    恢复文件

    vim -r+文件名 进入文档

    ewcover+文件名 恢复

    可视模式

    v 选取,再按v,取消选取

    shift+v 选取整行

    ctrl+v 矩形区域选取

    d 删除选取区域

    y 复制选取区域

    视窗操作

    在命令行模式下输入new,打开一个新的视窗

    命令行模式下输入:sp 1.txt 打开新的横向视窗来编辑1.txt

    命令行模式下输入:vsp 2.txt 打开新的纵向视窗来编辑1.txt

    普通模式下Ctrl-w s 将当前窗口分割成两个水平的窗口

    普通模式下Ctrl-w v 将当前窗口分割成两个垂直的窗口

    普通模式下Ctrl-w q 即 :q 结束分割出来的视窗。如果在新视窗中有输入需要使用强制符!即:q!

    普通模式下Ctrl-w o 打开一个视窗并且隐藏之前的所有视窗

    普通模式下Ctrl-w j 移至下面视窗

    普通模式下Ctrl-w k 移至上面视窗

    普通模式下Ctrl-w h 移至左边视窗

    普通模式下Ctrl-w l 移至右边视窗

    普通模式下Ctrl-w J 将当前视窗移至下面

    普通模式下Ctrl-w K 将当前视窗移至上面

    普通模式下Ctrl-w H 将当前视窗移至左边

    普通模式下Ctrl-w L 将当前视窗移至右边

    普通模式下Ctrl-w - 减小视窗的高度

    普通模式下Ctrl-w + 增加视窗的高度

    文档加密

    创建加密文档

    vim -x+文档名

    输入密码,确认密码

    在命令行模式中输入!可执行外部的shell命令

    !ls 用于显示当前目录的内容

    !rm+文件名用于删除该文件

    w+文件名可将当前 VIM 中正在编辑的文件另存为该文件

    帮助系统

    F1 打开帮助界面

    h+文件名 打开该帮助文件

    ver 显示版本及参数

    功能设定

    可以在编辑文件时进行功能设定,退出后不会保存

    要永久保存需修改vim配置文件

    获取目前的设定

    set 显示所修改过的配置

    set all显示所有设定值

    set option?显示option设定值

    set nooption取消当期设定值

    set功能说明

    命令行模式下

    set autoindent(ai) 设置自动缩进

    set autowrite(aw) 设置自动存档,默认未打开

    set background=darklight,设置背景风格

    set backup(bk) 设置自动备份,默认未打开

    set cindent(cin) 设置C语言风格缩进

    二、信息的表示处理

    三种重要的数字表示:无符号编码,补码编码(有符号),浮点数编码

    当结果太大不能表示时会溢出,大量安全漏洞都是由于算数运算引发的

    信息存储

    最小的可寻址存储器单位:字节

    虚拟存储器:每个字节都由唯一的数字标识,称为地址

    虚拟地址空间:所有可能地址的集合

    每个程序对象可视为字节块,程序本身是一个字节序列

    十六进制表示法

    0x...

    当x是2的非负整数二次幂时,将n写作i+4j的形式,j表示0的个数

    i=0 :1      i=1 :2    i=2 :4     i=3 :8

    字长:指明整数和指针数据的标称大小

    字长为w,虚拟地址范围:0~2的w次方-1,最多访问2的w次方个字节

    大多数计算机字长为32位,实验楼为64位

    gcc -m32 可以在64位机上生成32位的代码

    虚拟存储器:每个字节都由唯一的数字标识,称为地址

    虚拟地址空间:所有可能地址的集合

    每个程序对象可视为字节块,程序本身是一个字节序列

    数据大小

    两种不同的浮点数格式:单精度 双精度

    格式:4字节 8字节

    寻址和字节顺序

    小端法:最低有效字节在最前面,高对高,低对低

    大端法:最高有效字节在最前面,相反

    反汇编器:确定可执行程序文件所表示的指令序列的工具

    C 强制类型转换

    sizeof 确定对象使用字节数

    不同的操作系统有不同的分配规则,结果相同,指针值却完全不同

    字节模式 整型 0x00003039  浮点数 0x4640E400

    表示字符串

    字符串:以null字符结尾的字符数组

    文本数据比二进制数据具有更强的平台独立性

    库函数strlen不计算终止的空字符

    布尔代数

    与 或 非 异或

    位向量:表示有限集合

    位级运算

    确定一个位级运算最好的方法:将十六进制的参数扩展成二进制表示并执行二进制运算,然后再转换回十六进制

    常见用法:掩码运算

    掩码:位模式,从一个字中选出的位的集合

    逻辑运算

    0 false 非0 true

    如果对第一个参数求值就能确定表达式的结果,那么逻辑运算符就不会对第二个参数求值

    移位运算

    <<    >>

    逻辑右移:左端补0

    算数右移:左边补最高有效位

    对于无符号数据,右移必须是逻辑的

    补码编码

    最常见的有符号数的计算机表示方式就是补码形式

    将字的最高有效位解释为负权

    最高有效位:符号位

    权重-2的位数次方,是无符号表示中权重的负数

    最小值[10...0] 最大值[01...1]

    UMax TMin TMax

    P42页表

    |TMin|=|TMax|+1

    UMax=2TMax+1

    C语言中的有符号数与无符号数

    大多数数字都默认为有符号的

    要创建一个无符号常量,要加上后缀U或u

    转换的原则是底层的位保持不变

    如果一个运算一个有符号一个没符号,会将有符号强制转换为无符号

    IEEE浮点表示

    标准:V=(-1)的s次方*M*2的E次方

    符号:s决定正(0)负(1)

    尾数:M是二进制小数

    阶码:E的作用是对浮点数加权

    情况1:规格化的值:当exp的位模式既不全是0,也不全是1

    情况2:非规格化的值:阶码域全0

    情况3:特殊值:阶码全1

    舍入

    找到最接近的匹配值

    四种舍入方式

    默认方法找到做接近的匹配,其他三种用于计算上界和下界

    向偶数舍入(默认):向上舍入,向下舍入

    三、程序的机器级表示

    程序编码

    命令gcc指的是GCC C编译器

    -01 使用第一级优化(提高优化级别会使最终程序运行更快,但编译时间可能会变长

    第二级优化被认为是较好的选择

    机器级代码

    两种抽象:指令集体系结构,虚拟地址

    汇编代码的特点:用可读性更好的文本格式来表示

    可见的处理器状态:程序计数器(PC),整数寄存器文件,条件码寄存器,浮点寄存器

    汇编代码不区分有符号或无符号整数,不区分各种类型的指针,不区分指针和整数

    程序存储器:程序的可执行机器代码,操作系统需要的一些信息,用来管理过程调用和返回的运行时栈,用户分配的存储器块

    操作系统负责管理虚拟地址空间,将虚拟地址翻译成实际处理器存储器中的物理地址

    数据格式

    16位 字

    32位 双字

    64位 四字

    大多数数据类型都是双字

    指针:4字节的双字

    单精度 4字节

    双精度 8字节

    扩展精度 10字节/12字节

    字符后缀

    数据传送指令三个变种:movb,movw,movl

    操作数指令符

    大多数指令有一个或多个操作数,指示出执行一个操作中要引用的源数据值,以及放置结果的目标位置

    不同操作数的可能性分为3种类型:立即数$,寄存器,存储器

     数据传送指令

    把许多不同的指令分为指令类

    见图P114 图3-4

    MOV类中的指令将元操作数的值复制到目的操作数中

    MOVS和MOVZ指令将一个较小的源数据复制到一个较大的数据位置,高位用符号位扩展或零扩展进行填充

    Pushl指令:把数据压入到栈上

    加载有效地址

    Leal:从存储器读数据到寄存器

    目的操作数必须是一个寄存器

    一元操作和二元操作

    一元操作有一个操作数

    二元操作有两个操作数

    两个操作数不能同时是存储器的位置

    移位操作

    先给出移位量,再给出要移位的数值

    左移:SAL.SHL效果一样

    右移:SAR算术,SHR逻辑

    条件码

    单个位的条件码寄存器

    常用条件吗:CF,ZF,SF,OF

    CF:无符号溢出

    ZF:零

    SF:负数

    OF:有符号溢出

    Leal进行地址运算所以不改变条件码

    两种只会设置条件码的指令:CMP,SUB

    访问条件码

    三种方法:

    根据条件码的某个组合,将一个字节设置为0或者1

    条件跳转到程序的某个其他部分

    有条件的传送数据

    跳转指令及其编码

    跳转指令会导致执行切换到程序中一个全新的位置

    目的地通常用一个标号指明

    当执行PC有关寻址时,程序计数器的值是跳转指令后面的那条指令的地址,而不是跳转指令本身的地址

    栈帧结构

    栈:传递过程参数、存储返回信息、保存寄存器用于以后恢复、本地存储

    为单个过程分配的那部分栈成为栈帧

    寄存器%ebp为帧指针

    寄存器%esp为栈指针

     

    四、处理器体系结构

    我们看到的计算机系统只限于机器语言程序级

    指令被编码为由一个或多个字节序列组成的二进制格式——指令集体系结构(ISA)

    设计处理器:基于顺序操作,功能正确,有点不实用,时钟必须足够慢。

    创建一个流水线化的处理器,处理冒险或冲突

    冒险:一条指令的位置或操作数依赖于其他仍在流水线中的指令

    Y86处理器:硬件构造块,结构构造模块

    程序员可见的状态

    程序员可见状态:每条指令都会读取或修改处理器状态的某些部分

    Y86处理器类似于IA32,有8个程序寄存器

    每个程序寄存器存储一个字

    3个一位的条件码:ZF、SF、OF

    存储器:一个很大的字节数组,保存着程序和数据

    Y86用虚拟地址引用储存器的位置

    虚拟地址会被翻译成物理地址

    状态码Stat:程序执行的总体状态,正常or异常

    Y86指令

    是IA32指令集的一个子集,只包括四字节整数操作

    详见P232图4-2

    Movl指令:irmovl、rrmovl、mrmovl、rmmovl

    第一字母:源 i:立即数 r:寄存器 m:储存器

    第二字母:目的 r:寄存器 m:储存器

    储存器引用方式:基址和偏移量形式

    4个整数操作指令OPl:addl、subl、andl、xorl,只对寄存器数据进行操作

    7个跳转指令:jmp、jle、jl、je、jne、jge、jg,根据分支指令的类型和条件码的设置来选择分支

    6个条件传送指令:cmovle、cmovl、cmove、cmovne、cmovge、cmovg

    Call指令将返回地址入栈,然后跳到目的地址

    Pushl:入栈 popl:出栈

    Halt指令停止指令的执行

    指令编码

    每条指令的第一个字节表明指令的类型

    高4位:代码 低四位:功能

    Rrmovl:无条件传送,功能代码0

    寄存器标识符0-7

    程序寄存器存在CPU中的一个寄存器文件中

    寄存器指示符字节:指示一个或两个寄存器

    有些指令需要附加4字节的常数字

    Y86异常

    程序员可见的状态包括状态码Stat,描述程序执行的总体状态

    1 AOK  正常

    2 HLT 处理器执行halt指令

    3 ADR 遇到非法地址

    4 INS 遇到非法指令

    处理器会调用一个异常处理程序。

    Y86程序

    .开头的命令是汇编器命令:调整地址

    .pos0:从地址0开始产生代码

    初始化栈指针,帧指针

    YIS:指令集模拟器

    一些Y86指令的详情

    Pushl:栈指针减4,并且将一个寄存器值写入存储器中。

    处理器的行为不确定

    两种约定:1.压入%esp的原始值 2.压入减去4的%esp的值

    组合电路和HCL布尔表达式

    组合电路

    两条限制:

    两个或多个逻辑门的输出不能连接在一起,否则可能会使线上的信号矛盾,可能会导致一个不合法的电压或电路故障

    这个网必须是无环的。

    多路复用器:根据输入控制信号的值

    组合逻辑电路与C语言中逻辑表达式的区别:

    组合电路:输出会持续的响应输入的变化

    C表达式:遇到才求值

    C表达式:允许参数是任意整数,0表示FALSE,其他都是TURE

    组合电路:只对位0,1进行操作

    C表达式可能只被部分求值

     字级的组合电路和HCL整数表达式

    在HCL中,将所有的字级信号都声明为int,不指定字的大小,每个字都可以声明为有特定的位数

    在画字级电路的时候,用中等粗度的线来表示携带字的每个位的线路,用虚线表示布尔信号结果

    多路复用函数用情况表达式来描述

    选择表达式可以是任意的布尔表达式,可以有任意多的情况

    情况表达式能描述带复杂选择标准的,多种输入信号的块。

    储存器和时钟

    由一个时钟控制

    时钟寄存器:存储单个位或字,时钟信号控制寄存器加载输入值

    随机访问寄存器:存储多个字,用地址来选择该读或该写哪个字

    硬件寄存器,程序寄存器

    寄存器文件有两个读口端,一个写口端,允许同时进行多个读或写操作

    处理器还包括另一个只读储存器

    两个储存器合并为一个具有双端口的储存器:一个用来读指令,另一个用来读或写数据

    将处理组织成阶段

    取址,译码,执行,访存,写回,更新PC

    以一种统一的方式处理所有的跳转指令,它们只在判断是否要选择分支的时候不同

    在执行阶段,检查条件码和跳转条件来确定是否要选择分支,产生出一个位信号Cnd

    在更新PC阶段,检测这个标志

    1:PC设为valC(跳转目标)

    2:PC设为valP(下一条指令的地址)

    SEQ硬件结构

    同各个阶段相关的硬件单元负责执行这些处理

    在右边,反馈线路向下,包括要写到寄存器文件的更新值,以及更新的程序计数器值

    取址,译码,执行,访存,写回

    浅灰色方框表示硬件单元

    控制逻辑块是用灰色圆角矩形表示的

    线路的名字在白色椭圆中说明

    宽度为字长的数据连接用中等粗细的线表示

    宽度为字节或更窄的数据连接用细线表示

    单个位的连接用虚线来表示

     SEQ阶段的实现

    Nop指令:除了将PC加1,不进行任何处理

    Halt指令:使得处理器状态被设置为HLT,导致处理器停止运行

    1、  取指阶段

    包括指令存储器硬件单元。以PC作为第一个字节的地址,这个单元一次从存储器读出6个字节,第一个字节被解释为指令字节(Split)

    Icode:控制逻辑块计算指令

    Ifun:功能码

    当指令地址不合法,这些值对应于nop指令

    2.译码和写回阶段

    寄存器文件有四个端口

    支持同时进行两个读或两个写

    每个端口都有一个地址连接和一个数据连接

    地址连接是一个寄存器ID,数据连接是一组32根线路

    3.执行阶段

    执行阶段包括算术逻辑单元(ALU),对输入数据执行一系列运算

    4.访存阶段

    读或者写程序数据

    两个控制块产生存储器地址和存储器输入数据的值

    另外两个块产生控制信号表明应该执行读操作还是写操作

    当执行读操作时,数据存储器产生值valM

    5.更新PC阶段

    会产生程序计数器的新值

    五、存储器层次结构

    随机访问存储器

    分为静态和动态

    1. 静态RAM

    SRAM将每个位存储在一个双稳态的存储器单元里。

    它可以无限期地保持在两个不同的电压配置或状态之一

    亚稳态

    2.动态RAM

    DRAM将每个位存储为对一个电容的充电。

    每个单元由一个电容和一个访问晶体管组成

    只要有供电,SRAM就会保持不变。DRAM需要刷新

    3.传统的DRAM

    分为d个超单元,每个超单元由w个DRAM单元组成,一个d*w单元共存储dw位信息

    超单元被组织成r行c列的长方形阵列,rc=d

    每个超单元有形如(i,j)的地址,i表示行,j表示列

    每个DRAM芯片被连接到某个称为存储控制器的电路

    4.存储器模块

    DRAM芯片包装在存储器模块中,插在主板的扩展槽上

    常见:双列直插存储器模块,单列直插存储器模块

    通过将多个存储器模块连接到存储控制器,能够聚合主存

    5.增强的DRAM

    快页模式DRAM(FPM DRAM)

    扩展数据输出DRAM(EDO DRAM)

    同步DRAM(SDRAM)

    双倍数据速率同步DRAM(DDR DRAM)

    Rambus DRAM(RDRAM)

    视频RAM(VRAM)

    6.非易失性存储器

    DRAM和SRAM断电后会丢失信息,是易失的,非易失性存储器断电后依然保存着信息

    ROM:只读存储器

    PROM(可编程ROM):只能被编程一次

    可擦写可编程ROM(EPROM):能够被擦除和重编程的次数的数量级可达1000次

    闪存:基于闪存的磁盘驱动器——固态硬盘

    存储在ROM中的程序通常称为固件。

    7.访问主存

    数据流通过总线传播

    总线事务:读事务:从主存传送数据到CPU 写事务:从CPU传送数据到主存

    总线是一组并行的导线,能携带地址、数据和控制信号

    系统总线:连接CPU和I/O桥

    存储器总线:连接I/O桥和主存

    读事务和写事务都有三个基本步骤

    磁盘存储

    磁盘构造

    由盘片构成,每个盘片有两个表面,表面覆盖着磁性记录材料

    盘片中央有一个可以旋转的主轴,使盘片以固定的旋转速率旋转,通常5400~15000转每分钟

    每个表面都由一个称为磁道的同心圆组成,每个磁道被划分为一组扇区,每个扇区包括相等数量的数据位,扇区之间由一些间隙分隔开

    整个装置通常称为磁盘驱动器

    磁盘容量

    一个磁盘可以记录的最大位数称为它的最大容量

    记录密度:磁盘一英寸的段中可以放入的位数

    磁道密度:从盘片中心出发半径上一英寸的段内可以有的磁道数

    面密度:记录密度和磁道密度的乘积

    磁盘容量=字节数/扇区*平均扇区数/磁道*磁道数/表面*表面数/盘片*盘片数/磁盘

    磁盘操作

    磁盘用读/写头来读写存储在磁性表面的位,而读写头连接到一个传动臂的一端。

    寻道:通过沿着半径轴前后移动这个传动臂,驱动器可以将读/写头定位在盘面上的任何磁道上

    对扇区的访问时间三部分:

    寻道时间:移动传动臂所需的时间称为寻道时间

    旋转时间:Tmax=1/RPM*60secs/1min,平均旋转时间是它的一半

    传送时间:一个扇区的传送时间依赖于旋转速度和每条磁道的扇区数目

    逻辑磁盘块

    逻辑盘控制器:维护着逻辑块号和实际磁盘扇区之间的映射关系

    控制器上的固件执行一个快速表查找,将一个逻辑块号翻译成一个(盘面,磁道,扇区)三元组,唯一的标识了对应的物理扇区

    连接到I/O设备

    输入/输出(I/O设备),通过I/O总线连接到CPU和主存

    I/O总线比系统总线和存储器慢,但可以容纳种类繁多的第三方I/O设备

    通用串行总线控制器:连接到USB总线的设备的中转机构

    图形卡(适配器):包含硬件和软件逻辑,代表CPU在显示器上画像素

    主机总线适配器:将一个或多个磁盘连接到I/O总线,使用主机总线接口定义的通信协议

    访问磁盘

    CPU使用一种称为储存器映射I/O的技术来向I/O设备发出命令

    地址空间中有一块地址是为与I/O设备通信保留的

    每个这样的地址称为I/O端口

    CPU通过执行三个存储指令,发起磁盘读

    第一条指令:发送一个命令字,告诉磁盘发起一个读,同时还发送了其他的参数

    第二条指令:指明应该读得逻辑块号

    第三条指令:指明应该存储磁盘扇区内容的主存地址

    商用磁盘的剖析

    第一列给出区号,区0在最外面,区14在最里面

    第二列给出该区每条磁道中包含的扇区数

    第三列显示分配给区的柱面数量

    第四列给出了分配给每个区的逻辑块总数

    靠外面的区比靠里面的区有更多的扇区

    固态硬盘

    固态硬盘(SSD)是一种基于闪存的存储技术

    一个SSD包由一个或多个闪存芯片和删除翻译层组成

    比起旋转磁盘,SSD有很多优点:

    由半导体存储器构成,没有移动部件,因而随机访问时间比旋转磁盘要快,能耗更低,也更结实

    缺点:容易磨损,贵

    局部性

    局部性原理:倾向于引用邻近于其他最近引用过的数据项的数据项

    两种形式:时间局部性,空间局部性

    一般而言,有良好局部性的程序比局部性差的程序运行得更快

    顺序访问一个向量每个元素的函数,具有步长为1的引用模式。

    在一个连续向量,每隔k个元素进行访问,就被称为步长为k的引用模式

    随着步长的增加,空间局部性下降

    双重嵌套循环按照行优先顺序读数组的元素

    重复引用同一个变量的程序有良好的时间局部性

    对于具有步长为k的引用模式的程序,步长越小,空间局部性越好。具有步长为1的引用模式的程序有很好的空间局部性。在存储器中以大步长跳来跳去的程序空间局部性会很差

    对于取指令来说,循环有好的时间和空间局部性。循环体越小,循环迭代次数越多,局部性越好

    存储器层次结构

    存储技术:不同存储技术的访问时间差异很大。速度较快的技术每字节的成本要比速度较慢的技术高,而且容量较小。CPU和主存之间的速度差距在增大

    中心思想:对于每个k,位于k层的更快更小的存储设备作为位于k+1层的更大更慢的存储设备的缓存

    块:连续的数据对象片

    缓存命中

    当程序需要第k+1层的某个数据对象d时,它首先在当前存储在第k块

    第k层没有缓存数据对象d

    如果缓存不命中,第k层的缓存从第k+1层缓存中取出包含d的那个块,如果第k层的缓存已经满了的话,可能会覆盖现存的一个块,这个过程称为替换或驱逐,被驱逐的块称为牺牲块,决定该替换哪个块是由缓存的替换策略来控制的

    一个空的缓存有时称为冷缓存,此类不命中称为强制性不命中或冷不命中

    冲突不命中:数据对象映射到同一个缓存块

    容量不命中:工作集大小超过缓存大小

    高速缓存存储器

    存储器地址m位,S=2的s次方个高速缓存组,每个组包含E个高速缓存行,每个行由B=2的b次方字节的数据块组成

    一个有效位指明这个行是否包含有意义的信息,还有t=m-(b+s)个标记位

    描述:元组(S,E,B,m)

    高速缓存的大小C指的是所以块的大小的和,C=S*E*B

    (详见p410图6-28)

    六、其他

    gcc编译器

    1.流程:预处理、编译、汇编、链接

    (1)预处理 对头文件和宏文件进行处理

    -E:查看,让gcc在预处理结束后停止编译

    gcc -E hello.c -o hello.i

    (2)编译 检查,翻译成汇编语言

    -s 查看 gcc -s hello.i -o hello.s

    (3)汇编 gcc-c hello.s -o hello.o 转成目标文件

    (4)链接 函数库 静态库.a 动态库 .so

    gcc默认为动态库 gcc hello.o -o hello

    2.分析

    (1)常用 -I dir:在头文件的搜索路径列表中添加dir目录,添加放置在其他位置的头文件

    gcc hello|.c -I /root/workplace/gcc/ -o hello|

    (2)库

    静态库:使用归档工具ar将一些目标文件集成在一起

    -L dir 在库文件的搜索路径列表中添加dir目录

    动态库:-tpic 构造一个目标文件

               -shared 生成动态库

               注册动态库路径名

    gdb调试器

    1.使用流程

    gcc -g test.c -o test

    查看文件 l

    设置断点 b+行号

    查看断点情况 info b

    查看调用函数情况 bt

    运行代码 r

    查看变量值 p+变量

    单步运行 n或s s会进入函数,n不会进入函数

    恢复程序运行 c

    2.基本命令

    help 查找gdb命令

    help+命令名

    设置断点与恢复命令

    函数断点 b+函数名

    条件断点 b+行数/函数名+if表达式

    修改运行参数相关命令

    set 变量=设定值

    makefile工程管理器

    1.makefile基本结构

    makefile是make读入的唯一配置文件

    由make工具创建目标体

    target:dependency_files

    (Tab) command

    make target

    2.makefile变量

    变量定义:

    递归展开方式 VAR=var

    简单方式:VAR:=var

    3.规则:隐含规则,模式规则

    我的收获:

    学会了Linux命令,vi,gcc,gdb,make的使用

    了解了信息表示和处理的方式,程序的计算机表示,处理器体系结构,存储器层次结构

    更加深入的理解了计算机系统

    读书的速度也变快了,起初读起来很慢很费力,后来越来越快,重点也抓得越来越准,400多页书就这样被看完了

    虽然要说兴趣真的兴趣不大这是没办法的事,但是强迫自己学还是可以学懂一些的,对自己的学习能力更加有自信了

    我的不足:

    我的记忆力越来越差了,学过的东西不一会就忘了,考前一定要再重新看一遍否则什么都不会,有的时候连自己的手机号都记不起来,这该怎么办才好呢??

    我钻研的精神也不够,有些地方实在看不懂就不看了,想缓一缓以后再看,然后就忘了

    我的数学能力太差了,有一章有好多复杂的公式,我就不知道它在讲什么了

    我的电脑有个不足就是虚拟机装不上Linux,可能是我还没有尝试足够多遍吧

    课程建议和意见:

    既然老师说了接下来的课程的模式和以前不一样了,那我就不提什么意见了,拭目以待

  • 相关阅读:
    [Hapi.js] Route parameters
    [Hapi.js] Logging with good and good-console
    [Hapi.js] Up and running
    [Unit Testing] Directive testing, require parent controller
    数学-盲点题:九个点用四条直线连起来
    汉语-词语-思维:思维方法
    汉语-词语-思维:思维方式
    汉语-词语:思维
    思考方式-数学-盲点题:盲点题
    摄像机-哈苏:哈苏
  • 原文地址:https://www.cnblogs.com/javablack/p/4926635.html
Copyright © 2011-2022 走看看