20135337——信息安全设计基础第七周复习笔记

课本知识重难点梳理

第1章 计算机系统漫游

1.信息

  • 位+上下文

    系统中所有信息都是由一串位表示的,区分不同数据对象唯一方法是读到这些数据对象时的上下文。

2.程序被翻译成不同格式

  • 编译系统

    预处理器、编译器、汇编器、链接器

3.存储设备层次结构

  • 核心思想:缓存
  • 操作系统核心抽象:文件、虚存、进程、虚拟机

第2章 信息的表示和处理

1.信息存储

  • 进制转换:拿二进制作中间量
  • 网络编程基础:字节顺序

大端法:高对低,低对高
小端法:高对高,低对低
  • 运算

逻辑运算:结果0或1(如果对第一个参数求值就能确定表达式的结果,那么就不会对第二个参数求值)
位运算:结果位向量

有无符号计算、截断、扩展都要结合具体的练习来体会公式的使用。

  • 掩码:对特定位可以置一,可以清零
  • IEEE浮点标准

V=(-1)^s X 2^E X M 来表示一个数
符号:s决定这个数是正还是负。
阶码:E对浮点数加权,权重是2的E次幂。
尾数:M是一个二进制小数,范围为1~2-ε或者0~1-ε。
  • 舍入

向偶舍入:将数字向上或向下舍入,结果的最低有效数字为偶数。
能用于二进制小数。(默认)
向零舍入:把整数向下舍入,负数向上舍入。
向下舍入:正数和负数都向下舍入。
向上舍入:正数和负数都向上舍入。

第3章 程序的机器级表示

1.机器级代码

  • ISA指令集体系结构

gcc -s hello.c(产生汇编代码)
gcc -c hello.c(编译并汇编该代码)
objdump -d hello.o(反汇编)

针对指令的使用结合具体的练习进行学习效率会更高。

2.过程

  • 栈帧结构
    栈帧——为每一个过程分配的内存空间,它包含两个特殊的参数,栈指针和帧指针。
    栈是向低地址增长的。

    帧指针:%ebp,指向栈底。
    栈指针:%esp,指向栈顶,栈指针可以移动,来分配或释放空间。
    %esp减小——分配空间
    %esp增大——释放空间

第4章 处理器体系结构

1.Y86指令集体系结构

具体使用结合练习

  • 异常
    halt指令、非法指令、访问非法地址

2.HCL硬件控制语言

  • 数字系统

组合逻辑、存储器元素、时针信号
  • 表达式

AND:&&
OR:||
NOT:!

3.Y86的顺序实现

取指、译码、执行、访存、写回、更新PC

第6章 存储器层次结构

1.随机访问存储器RAM

分类:SRAM和DRAM

特点:掉电失忆

  • SRAM比较DRAM

SRAM:供电不变,不刷新,抗干扰,存取快,贵

2.只读存储器ROM

  • 分类:根据能被重新编写次数和对其编程所用机制分

PROM:编程一次
EPROM:能被擦除和重编1000次
EEPROM:基于EPROM,达10^5次
flash:一类非易失性存储器
  • 特点:非易失性

3.磁盘

  • 磁盘的容量 = 每扇区大小每磁道扇区数磁道数 *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字节主要花在寻道时间和旋转延迟

4.总线

  • 存储总线

	1.并行传递方式。
	2.指令和数据向CPU传递时的通道。
	3.分三组:数据总线(用于传递数据);
	地址总线(用于传递主存储器的地址);
	控制总线(用于各种内部控制指令的传递)。
  • 系统总线

	1.传送的信息包括数据信息、地址信息、控制信息。
	2.数据总线(用于传送数据信息);
	地址总线(用来传送地址的地址总线的位数决定了CPU可直接寻址的内存空间大小);
	控制总线(用来传送控制信号和时序信号)。
  • I/O总线

	指缆线和连接器系统,用来传输I/O路径技术指定的数据和控制信号。
  • 读写事务

5.局部性

	1.重复引用同一个变量从的程序有良好的时间局部性;
	2.对于步长为k的引用模式的程序,步长越小,空间局部性越好。具有步长为1的引用模式的程序有很好的空间局部性;
	3.对于取指令来说,循环有很好的时间和空间局部性。循环体越小,循环迭代次数越多,局部性越好。	

6.存储器层次结构

  • 中心思想:每层存储设备都是下一层的缓存。

  • 缓存命中

    若需要访问k+1层里的数据块d,如果d已经缓存在第k层,则称缓存命中。

  • 缓存不命中

1.若d不在第k层,则是缓存不命中。第k层缓存会从第k+1层缓存中取出包含d的那个块。如果第k层缓存已满,就可能会覆盖现存的一个块。

2.替换策略:1.随机替换策略-随机牺牲一个块。2.最少被使用替换策略LRU-牺牲最后被访问的时间距离现在最远的块。

3.种类

	1.强制性不命中(冷不命中)

	一个空的缓存称为冷缓存,对任何数据对象的访问都不会命中。通常是短暂事件,不会在反复访问存储器使得缓存暖身之后的稳定状态中出现。

	2.冲突不命中

	限制性的放置策略——将第k+1层的某个块限制放置在第k层块的一个小的子集中。

	3.容量不命中

	当工作集的大小超过缓存的大小时,缓存会经历容量不命中,就是说缓存太小了,不能处理这个工作集。

7.高速缓存存储器

  • 块、行、组

块:一个固定大小的信息包。
行:存储块以及其他信息的容器。
组:一个或多个行的集合。
  • 通用的高速缓存存储器

  • 直接映射高速缓存

三步:组选择、行匹配、字选择(如果缓存不命中还需行替换)

第7章

结合以下Linux基础总结

Linux基础

1.VIM

  • 普通模式、插入模式和命令行模式切换:

普通→插入: i 或 a 
插入→普通: Esc
普通→命令行: :
命令行→普通:Esc
  • 帮助系统

普通模式下按F1打开vim自己预设的帮助文档
命令行模式下输入:h shiftwidth 打开名为shiftwidth的帮助文件

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

使用GCC编译时要加“-g”参数,然后才能够用gdb调试

  • 启动gdb的方法

gdb <program>  program也就是执行文件,一般在当前目录下。
gdb <program>  core 用gdb同时调试一个运行程序和core文件,core是程序非法执行后,core dump后产生的文件。
gdb <program>  <PID> 如果程序是一个服务程序,那么可以指定这个服务程序运行时的进程ID。
  • 设置断点

break func  设置断点,在函数func()入口处
info break  查看断点信息。
r 运行程序
n 单条语句执行
c 继续运行程序
p I 打印变量i的值
bt 查看函数堆栈。
finish 退出函数。
q 退出gdb

4.makefile

实现自动化编译

  • 格式

    target(目标文件)... : prerequisites(要生成那个target所需要的文件或是目标)...
command(任意的Shell命令,就是make需要执行的命令)
  • Makefile中的宏

    递归展开方式	VAR=var
    简单方式	VAR:=var
    使用变量        $(VAR)

5.静态库与动态库

  • Windows:静态库:.lib;动态库:.dll(windows)
  • Linux:静态库:.a;动态库:.so(linux)(重点学习Linux下的)

a.静态库

  • 为了创建该库,使用AR工具:

ar rcs libvector.a addvec.o multvec.o
  • 为了创建可执行文件,需要编译链接输入文件*.o 和libvector.a:

gcc -O2 -c .c
gcc -static -o p2 .o ./libvector.a
  • 加载可执行目标文件

./p

b.动态库

  • 创建动态库

gcc -shared -fPIC -o libvector.so addvec.c multvec.c
  • 将动态库链接到程序中

gcc -o p2 *.c ./libvector.so

每周检测重复出现(重点)

  • man -k

man -k k1 | grep k2 | grep k3
1 Linux中的一般命令
2 系统调用
3 库函数,涵盖了C语言的标准函数库
  • 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)
  • 形成空调用栈帧

push %ebp movl %esp %ebp

作业例题





总结体会

1.收获与不足:经过两个月的学习,让我对计算机有了进一步的了解,包括汇编的知识,存储器的知识,机器进行计算等方面。收获最大的是如何学习。第一,通过小组答疑论坛大家交流出现的问题,能够发现自己在看书时没有注意的细节,能够学习他人的学习态度。第二,通过自己看书,起初是漫无重点的看,渐渐地学会根据老师给出的重点,有侧重点的学,自己的学习态度也逐渐由开始完成任务变成学知识。第三,通过每周检测和博客评比,增加了认真学习的动力。第四,学的知识只是一条条概念,很多时候不理解,但是结合书上的练习就变得容易了。第五,自学应该是一个个人能力问题,而不仅仅是这门课程的学习方式。不足之处,正如老师说的“欠债”,由于C语言知识的薄弱,让我实践编写代码存在很大的问题,但是前两个月基本没有编程序的项目,我想在日后的学习中应该是一个很大的阻力,现在要努力补充、学习。
2.课程建议:我认为,首先,课堂检测基础知识是比较好的措施,能够检测课前学习的成果如何,同时,可以发现学习中出现的漏洞;其次,老师能够带领我们课堂演示一些指令的用法,能够让我除了实验楼无声的演示之外,有助于理解使用方式;最后,“量”的问题,开学前两周“量”真的很多,知识们在脑海里匆匆而过,大多数只留了个印象,确实变成了完成任务,调整之后,尤其是结合习题学习,让我真的掌握了(汇编这块特别突出,以前学习汇编时欠债,确实读不懂汇编语言,但是现在读懂了),所以我认为知识的学习是慢慢积累的,而不是一口吃个大胖子,最终结果只会消化不良,与此同时,自己主动学习要比被动的逼迫去学习来的有动力。

原文地址:https://www.cnblogs.com/zzzz5/p/4927832.html