20145329 《信息安全系统设计基础》第八周期中总结

知识点总结

一、Linux命令

1.man -k
  • man是manul的缩写,我们可以通过man man来查看man的帮助
  • man有一个-k 选项用起来非常好,这个选项让你学习命令,编程时有了一个搜索引擎,可以举一反三。 我们通过一个例子来说明,比如数据结构中学过排序(sort),我不知道C语言中有没有完成这个功能的函数,可以通过“man -k sort”来搜索
    结合后面学习的grep 命令和管道,可以多关键字查找:
    man -k key1 | grep key2 | grep key3 | ...
  • Linux 中,手册通常被分为8个区段,安排如下:
    1 一般命令
    2 系统调用
    3 库函数,涵盖了C标准函数库
    4 特殊文件(通常是/dev中的设备)和驱动程序
    5 文件格式和约定
    6 游戏和屏保
    7 杂项
    8 系统管理命令和守护进程
    要查看相应区段的内容,就在 man 后面加上相应区段的数字即可
2.cheat
  • cheat 命令不是Linux自带的,是在GNU通用公共许可证下,为Linux命令行用户发行的交互式备忘单应用程序。它提供显示Linux命令使用案例,包括该命令所有的选项和简短但尚可理解的功能。
3.grep -nr xxx /usr/include
  • grep 可以对文件全文检索,支持正则表达式
  • 如果想查找某个宏,我们已知宏保存在include文件夹中,可以使用下列语句:
    grep -nr XXX /usr/include(XXX为所要找的宏)
4.其他命令
  • ls命令
    l s或ls .显示是当前目录的内容,这里“.”就是参数,表示当前目录,是缺省的可以省略。我们可以用ls -a .显示当前目录中的所有内容,包括隐藏文件和目录。其中“-a” 就是选项,改变了显示的内容
    查看某一个目录的完整属性,而不是显示目录里面的文件属性:
    $ ls -dl
    显示所有文件大小,并以普通人类能看懂的方式呈现:
    $ ls -AsSh
    使用较长格式列出文件:
    $ ls -l
  • find
    查找一个文件在系统中的什么位置,locate是神速版本的find(Windows下有个Everything工具和locate类似).
  • whereis,which告诉你使用的命令工具装在什么地方。
  • touch 命令创建文件
    $ touch adsfasd.txt wergjlkas.txt
  • 输出图形字符的命令banner
    $ banner shiyanlou
  • 查看用户
    $ who am i 或者 $ who mom likes
  • su和sudo
    可以切换到用户user
    sudo 可以以特权级别运行cmd命令
    su - 命令也是切换用户
  • 新建用户:
    $ sudo adduser lilei
  • 新用户创建 home 目录:
    $ ls /home
  • 切换登录用户:
    $ su -l lilei
  • groups命令
    $ groups shiyanlou
    其中$之前表示用户,后面表示该用户所属的用户组。
  • 查看/etc/group文件
    $ cat /etc/group | sort
    这里 cat 命令用于读取指定文件的内容并打印到终端输出
  • 其它用户加入 sudo 用户组
    默认情况下新创建的用户是不具有 root 权限的,也不在 sudo 用户组,可以让其加入sudo用户组从而获取 root 权限。
    $ su -l lilei $ sudo l
  • 删除用户
    $ sudo deluser lilei --remove-home
  • 修改文件权限
    $ chmod go-rw iphone
  • 路径
    进入上一级目录:
    $ cd ..
    进入你的“home”目录:
    $ cd ~ # 或者 cd /home/
    使用 pwd 获取当前路径:
    $ pwd
    以绝对路径和相对路径的方式进入 /usr/local/bin 目录:
    绝对路径
    $ cd /usr/local/bin
    相对路径
    $ cd ../../usr/local/bin
  • 切换回用户的 /home/shiyanlou 目录:
    $ cd ~
  • 创建名为"mydir"的空目录:
    $ mkdir mydir
  • 复制文件
    将之前创建的"test"文件复制到"/home/shiyanlou/father/son/grandson"目录中:
    $ cp test father/son/grandson
    要成功复制目录需要加上-r或者-R参数,表示递归复制:
    $ cp -r father family
  • 删除
    $ rm test
    -f参数强制删除:
    $ rm -f test
    删除目录
    $ rm -r family
  • 移动文件
    将文件"file1"移动到"Documents"目录mv 源目录文件 目的目录:
    $ mkdir Documents $ mv file1 Documents
  • 重命名文件
    $ mv file1 myfile
  • 查看文件
    使用cat,tac和nl命令查看文件查看之前从"/etc"目录下拷贝来的passwd文件:
    $ cat passwd
    可以加上-n参数显示行号:
    $ cat -n passwd
  • 使用declare命令创建一个变量名为 tmp 的变量:
    $ declare tmp
    使用=号赋值运算符为变量 tmp 赋值为 shiyanlou:
    $ tmp=shiyanlou
    读取变量的值:
    $ echo $tmp

二、程序编译指令

1 vim
  • 大写“K”可以用来查找函数的帮助信息:查看 man page,命令模式下,将光标放在函数名上,按"K"可以直接察看 man page。
  • 几个设置
    set nu 显示行号
    set ai 自动缩行
    set ts=4 设置一个 TAB 键等于几个空格
  • 移动光标
    [[ 转到上一个位于第一列的"{"
    ]] 转到下一个位于第一列的"{"
    { 转到上一个空行
    } 转到下一个空行
    gd 转到当前光标所指的局部变量的定义
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 programm(启动GDB)
  • b 设断点(要会设4种断点:行断点、函数断点、条件断点、临时断点)
  • run 开始运行程序
  • bt 打印函数调用堆栈
  • p 查看变量值
  • c 从当前断点继续运行到下一个断点
  • n 单步运行
  • s 单步运行
  • quit 退出GDB
    应该掌握的调试命令有:
  • display 跟踪变量值的改变
  • until 跳出循环
  • finish 跳出函数
  • help 帮助
  • 四种断点:
    行断点 b [行数或函数名]
    函数断点 b [函数名]
    条件断点 b [行数或函数名]
    临时断点 tbreak [行数或函数名]
4. make(makefile的一般写法)
  • 一个makefile文件主要含有一系列的规则,每条规则包含以下内容:
    需要由make工具创建的目标体,通常是可执行文件和目标文件,也可以是要执行的动作,如‘clean’;
    要创建的目标体所依赖的文件,通常是编译目标文件所需要的其他文件。
    创建每个目标体时需要运行的命令,这一行必须以制表符TAB开头
  • 格式为:
    test(目标文件): prog.o code.o(依赖文件列表)
    tab(至少一个tab的位置)
    gcc prog.o code.o -o test(命令)
  • 定义变量的两种方式:
    递归展开方式 VAR=var
    简单方式 VAR:=var
  • 用途:
    实现自动化编译

三、教材内容

第1章 计算机系统漫游
  • 操作系统内核是应用程序和硬件之间的媒介。它提供三个基本的抽象:
    (1)文件是对I/O的抽象
    (2)虚拟存储器是对主存和磁盘的抽象
    (3)进程是对处理器、主存抽象和I/O设备的设备最后,网络提供了计算机系统之间通信的手段
第2章 信息的表示和处理
  • 无符号数编码基于传统的二进制表示法,表示大于或等于零数字
  • 补码编码是表示有符号号整数的最常见的方式,有符号整数就是可以为正或为负的数字
  • 浮点数编码是表示实数的科学技术法的以二为基数的版本
  • 信息存储
    虚拟存储器是一个非常大的字节数组
    虚拟地址是以一个字来编码的,字长决定的最重要的系统参数就是虚拟地址空间的最大大小
    可移植性是使程序对不同数据类型的确切大小不敏感,对于32位机器来说,同样的掩码可以写成0×FFFFFFFF,但是这样的的代码是不可移植的
    对于跨越多字节的程序对象,我们必须建立的两个规则:对象地址以及存储器中如何排列这些字节
    多字节对象被存储为连续的字节序列,对象的地址为所使用字节中最小的地址
  • 整数表示
    补码:最常见的有符号数的计算机表示
    表达式×将×值转换成无符号数值,而u将u的值转换为有符号整数
    T2U函数将一个有符号数映射为它相应的无符号数十,负数就被转换成大的正数
    c语言有符号数和位富豪数转换的原则是最底层的位表示保持不变,在采用补码的机器上,无符号数转换为有符号数,效果就是应用U2Tw,从有符号数转换为无符号数,就是应用函数T2Uw,w表示数据类型的位数。
    截断:在32位机器上,将强制int型的x转换为short时,是将32位的int截断为16位的short int。
    截断一个数字可能会改变它的值——溢出的一种形式
  • 整数运算
    无符号数运算可以被视为一种模运算形式
    一个算数运算溢出,是指将完整的整数结果不能放到数据类型的字长限制中去。
  • 浮点数
    IEEE浮点数标准用V=(-1)^s M2^E的形式来表示一个数:
    符号:s决定这个数十整数(s=1)还是负数(s=0),而对于数值0的符号位解释作为特殊情况处理
    尾数:M是一个二进制小数
    阶数:E的作用是对浮点数加权,这个权重是2的E次幂(可能是负数)
    IEEE标准中指定浮点运算行为方法的一个优势在于可以独立于任何具体的硬件或软件
第3章 程序的机器级表示
  • 条件码的三种使用方法:
    1)根据条件码的某个组合,将一个字节置0或1
    2)条件跳转到程序的某个其他部分
    3)有条件的传送数据
  • 有条件跳转
    条件跳转只能是直接跳转
    跳转指令名字和跳转条件与SET指令时相匹配的
    跳转指令编码方式:
    (1)PC相关的跳转目标编码:目标指令地址与紧跟在跳转指令后面那条指令的地址之间的差作为编码,此种方式编码,寻址时程序计数器的值是跳转指令后面的那条指令的地址,而不是跳转指令本身的地址(只需两个字节)
    (2)“绝对地址”编码:用四个字节直接指定目标
  • 最顶端的栈帧以两个指针界定:
    寄存器%ebp为帧指针
    寄存器%esp为栈指针
  • 栈向低地址方向增长,栈指针%esp指向栈顶元素:
    栈指针值适当减小可以分配没有指定初始值的数据的空间
    类似的,可以通过增加栈指针来释放空间
第4章 处理器体系结构
  • Y86异常
    (1)AOK:正常操作
    (2)HTL:处理器执行halt指令
    (3)ADR:遇到非法地址
    (4)INS:遇到非法指令
  • 数字系统三个主要组成部分:
    (1)计算对位进行操作的函数的组合逻辑
    (2)存储位的存储器元素
    (3)控制存储器元素更新的时钟序号
  • 组合电路:很多逻辑门组合成的一个网构建的计算块。构建这些网的两条限制:
    (1)两个或多个逻辑网的输出不能连接在一起
    (2)这个网必须是无环的
    bool eq=(a&&b) || (!a&&!b)
  • 时序电路:引入按位存储信息设备,使电路有状态并且在这个状态上进行计算的系统。时钟寄存器存储单个字或位,随机访问寄存器(处理器的虚拟存储器系统、寄存器文件)存储多个字。
  • Y86指令计算六个基本阶段:取值、译码、执行、访存、写回、更新PC。
第6章 存储器层次结构
  • 存储技术:
    SRAM存储器 、DRAM存储器、ROM存储器、旋转硬盘、固态硬盘
  • 对扇区的访问时间有三个主要的部分:
    寻道时间、旋转时间、传送时间
  • 两种不同形式
    空间局部性
    时间局部性
    一般来说,随着步长增加,空间局部性下降。
  • 高速缓存与缓存:高速缓存cash是一个小而快速的存储设备,它作为存储在更大、更慢的设备中的数据对象的缓冲区域。使用高速缓存的过程称为缓存。
  • 存储器层次结构的中心思想:对于每个k,位于k层的更快更小的存储设备作为位于k+1层的更大更慢的存储设备的缓存,即每层存储设备都是下一层的“缓存”
  • 缓存命中
    当程序需要第k+1层的某个数据对象d时,首先在当前存储在第k层的一个块中查找d,如果d刚好缓存在第k层中,就称为缓存命中。
  • 缓存不命中
    即第k层中没有缓存数据对象d。
  • 替换策略:
    决定替换哪个块
    随机替换策略:随机选择一个牺牲块
    最近最少被使用替换策略:选择最后被访问的时间距现在最远的块
  • 高速缓存存储器
    L1高速缓存、L2高速缓存、L3高速缓存
  • 高速缓存确定一个请求是否命中,然后取出被请求的字的过程,分为三步:
    组选择
    行匹配
    字抽取
  • 直接映射高速缓存中的冲突不命中
    原因:在块之间抖动,即这些块被映射到了同一个高速缓存组,高速缓存反复的加载和驱逐相同的高速缓存块的组
    解决方法:在每个数组的结尾放B字节的填充(B字节是一个块的长度,一行是一个块,相当于分开了行)从而使得他们映射到不同的组。
  • 缓存不命中的种类
    强制性不命中/冷不命中:第k层缓存是空的(冷缓存),只是短暂的状态,不会在反复访问存储器使得缓存暖身之后的稳定状态出现。
    冲突不命中:第k+1层的第i块,必须放置在第k层的块(i mod 4)中,这种限制性的放置策略引起冲突不命中。
  • 高速缓存的结构用元组(S,E,B,m)来描述,高速缓存的大小C = S * E * B。
第七章 链接
  • 链接器的两个任务
    符号解析
    重定位
  • 目标文件的三种形式
    可重定位目标文件
    可执行目标文件
    共享目标文件
  • 目标文件格式
    a.out 可执行文件
    COFF 一般目标文件格式
    PE 可移植可执行文件格式
    ELF 可执行可连接文件格式
  • 全局符号
    强符号:函数和已经初始化的全局变量
    弱符号:未初始化的全局变量
  • 规则:
    不允许有多个强符号
    若有一个强符号和多个弱符号,选强符号
    若有多个弱符号,任选一个

自己的收获

在一定基础上,掌握了虚拟机的使用,linux系统的操作,对vim编辑器也有一定的了解,对其中一些指令操作也有了一定的实践积累。

自己的不足

书本上的知识没有做到全部搞懂,看书可能还可以回忆起来,但是抛开书本,把它实际应用到一个实例中的时候还是无从下手,得到别人的指点才会有点恍然大悟的感觉。在看书的过程中要么就是没有全部看懂,没能领略作者的意图,要么就是一知半解的一带而过,最后消化吸收的甚少,基础没打好,最后就想要仔细串一遍知识脑子里都是杂乱的,还有些知识甚至自己都不知道自己不知道。

课程建议和意见

用这种“做中学”的方式已经学习了差不多一年了,这是一种很大限度的开发学生的潜能和刺激学生的学习意识的教学方式,强烈的突出了高中生和大学生学习模式的转变,让我们以一种“成人”的方式学习。但是好多时候这种学习方式让我觉得自己做了很多但是最后不知道自己到底做了什么,也不知道学会了什么,希望老师能在适当的时候帮我们“整理”一下思路,帮助学生更好的吸收理解课程,最终转化成软知识。