2017-2018-1 20155202 《信息安全系统设计基础》第11周学习总结

2017-2018-1 20155202 《信息安全系统设计基础》第11周学习总结

课上习题:

习题图片:

char ( *(*x())[])()中x和char (*(*x[3])())[5]中x分别代表什么?

char ( (x())[])():
  • 首先x紧挨着括号,在结合性上括号优先级大于星号,所以首先判定x为一个函数;
  • 那么一个函数有些什么要素呢?
    1. 返回值;
    1. 参数列表.
  • 由于紧挨着x的括号的是空的,所以很明显,函数的参数列表为空;
  • 那么接下来就要分析函数的返回值类型.由于表达式比较复杂,我采用了我自称为"替代法"(可能贻笑大方,
  • 可确实是我分析这类问题的方法)的方法:
  • 首先将x()替换为FUNC,得:
  • char ( (FUNC)[])()
  • 又由于(FUNC),所以判定函数的返回值函数指针(或函数指针数组).将(FUNC)替换为FUNC_P,得:
  • char ( *FUNC_P[])()
  • 在上面的表达式中,在FUNC_P左边是,右边是[],由于结合性优先级上[] > ,所以得知FUNC_P是一个数
  • 组,将FUNC_P[]替换为FUNC_P_ARR,得:
  • char ( *FUNC_P_ARR)()
  • 到此知FUNC_P_ARR是指针数组,那么数组元素的指针类型有是什么呢?从上面表达式已经很明显的知道其类
  • 型为:
  • 指针数组FUNC_P_ARR元素的类型为:返回值为char,参数列表为空的函数指针.
  • 总结起来就是:
  • x是一个函数,其参数列表为空,返回值为一指针,该指针指向一个函数指针数组,且该指针数组的指针类型为:
  • 返回值为char,参数列表为空的函数指针.
char ((x[3])())[5]:
  • 这类复杂的声明,解读要根据运算符的优先级及其结合方向。
  • [],()的运算符都高于*
  • ,结合方向都是自左到右的。
  • 所以对于char
  • ((x[3])())[5],分析步骤如下:
  • step1:
  • (*x[3]) x是一个大小为3的数组,数组元素是指针
  • step2:
  • (*x[3])() x是一个大小为3的数组,数组元素是指针,指针指向一个函数
  • step3:((x[3])())
  • x是一个大小为3的数组,数组元素是指针,指针指向一个函数,该函数返回一个指针
  • step4:char((x[3])())[5]
  • x是一个大小为3的数组,数组元素是指针,指针指向一个函数,
  • 该函数返回一个指针,这个指针指向一个大小为5的char数组

习题图片:

数组指针(也称行指针)
  • 定义 int (*p)[n];
  • ()优先级高,首先说明p是一个指针,指向一个整型的一维数组,这个一维数组的长度是n,也可以说是p的步长。也就是说执行p+1时,p要跨过n个整型数据的长度。
  • 如要将二维数组赋给一指针,应这样赋值:
int a[3][4];
int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组。
p=a;        //将该二维数组的首地址赋给p,也就是a[0]或&a[0][0]
p++;       //该语句执行过后,也就是p=p+1;p跨过行a[0][]指向了行a[1][]
  • 所以数组指针也称指向一维数组的指针,亦称行指针。
指针数组
  • 定义 int *p[n];
  • []优先级高,先与p结合成为一个数组,再由int说明这是一个整型指针数组,它有n个指针类型的数组元素。这里执行p+1是错误的,这样赋值也是错误的:p=a;因为p是个不可知的表示,只存在p[0]、p[1]、p[2]...p[n-1],而且它们分别是指针变量可以用来存放变量地址。但可以这样 p=a; 这里*p表示指针数组第一个元素的值,a的首地址的值。 如要将二维数组赋给一指针数组:
int *p[3];
int a[3][4];
for(i=0;i<3;i++)
p[i]=a[i];
  • 这里int *p[3] 表示一个一维数组内存放着三个指针变量,分别是p[0]、p[1]、p[2]

    所以要分别赋值。

  • 这样两者的区别就豁然开朗了,数组指针只是一个指针变量,似乎是C语言里专门用来指向二维数组的,它占有内存中一个指针的存储空间。指针数组是多个指针变量,以数组形式存在内存当中,占有多个指针的存储空间。
  • 还需要说明的一点就是,同时用来指向二维数组时,其引用和用数组名引用都是一样的。
  • 比如要表示数组中i行j列一个元素:
  • (p[i]+j)、((p+i)+j)、((p+i))[j]、p[i][j]
  • 优先级:()>[]>*

指针函数:顾名思义就是带有指针的函数,即其本质是一个函数,只不过这种函数返回的是一个对应类型的地址。

  • type *func (type , type)
  • 如:int *max(int x, int y)

函数指针:指向函数的指针变量,本质上是一个指针变量

  • type (*func)(type , type )
  • 如:int (*max)(int a, int b);

教材学习内容总结

虚拟存储器的三个重要能力:
  • 它将主存看成是一个存储在磁盘上的地址空间的高速缓存,在主存中只保存活动区域,并根据需要在磁盘和主存之间来回传送数据,通过这种方式,高效的使用了主存。
  • 它为每个进程提供了一致的地址空间,从而简化了存储器管理。
  • 它保护了每个进程的地址空间不被其他进程破坏。
    程序员需要理解虚拟存储器的三个原因:
  • 虚拟存储器是中心的:它是硬件异常、硬件地址翻译、主存、磁盘文件和内核软件的交互中心;
  • 虚拟存储器是强大的:它可以创建和销毁存储器片、可以映射存储器片映射到磁盘某个部分等等;
  • 虚拟存储器若操作不当则十分危险。

地址空间

地址空间是一个非负整数地址的有序集合:{0,1,2,……}
  • 线性地址空间:地址空间中的整数是连续的。
  • 虚拟地址空间:CPU从一个有 N=2^n 个地址的地址空间中生成虚拟地址,这个地址空间成为称为虚拟地址空间。
  • 地址空间的大小:由表示最大地址所需要的位数来描述。
  • 物理地址空间:与系统中的物理存储器的M个字节相对应。
  • 虚拟存储器的基本思想:主存中的每个字节都有一个选自虚拟地址空间的虚拟地址和一个选自物理地址空间的物理地址。

    虚拟存储器作为缓存的工具

  • 虚拟存储器——虚拟页(VP),每个虚拟页大小为P=2^p字节。
  • 物理存储器——物理页(PP),也叫页帧,大小也为P字节。
    - 任意时刻,虚拟页面的集合都被分为三个不相交的子集:
  • 未分配的:VM系统还没分配(创建)的页,不占用任何磁盘空间。
  • 缓存的:当前缓存在物理存储器中的已分配页。
  • 未缓存的:没有缓存在物理存储器中的已分配页。

    DRAM缓存的组织结构

  • 不命中处罚很大
  • 是全相联的——任何虚拟页都可以放在任何的物理页中
  • 替换算法精密
  • 总是使用写回而不是直写

    页表

  • 页表:是一个数据结构,存放在物理存储器中,将虚拟页映射到物理页,就是一个页表条目的数组。
  • 页表就是一个页表条目PTE的数组。
  • PTE:由一个有效位和一个n位地址字段组成的,表明了该虚拟页是否被缓存在DRAM中。
  • 页表的组成:有效位+n位地址字段
  • 如果设置了有效位:地址字段表示DRAM中相应的物理页的起始位置,这个物理页中缓存了该虚拟页。
  • 如果没有设置有效位:
  • 空地址:表示该虚拟页未被分配
  • 不是空地址:这个地址指向该虚拟页在磁盘上的起始位置。

    地址翻译

  • (1)地址翻译
  • 地址翻译就是一个N元素的虚拟地址空间VAS中的元素和一个M元素的物理地址空间PAS中元素之间的映射。
  • MAP: VAS → PAS ∪ ?
  • 这里
  • MAP = A‘ ,如果虚拟地址A处的数据在PAS的物理地址A‘处
  • MAP = ? ,如果虚拟地址A处的数据不在物理存储器中
  • 如何用页表实现这种映射
  • 当页面命中时,CPU硬件执行步骤
  • 处理器生成虚拟地址,传给MMU
  • MMU生成PTE地址,并从高速缓存/主存请求得到他
  • 高速缓存/主存向MMU返回PTE
  • MMU构造物理地址,并把它传给高速缓存/主存
  • 高速缓存/主存返回所请求的数据给处理器。
  • 处理缺页时,CPU硬件执行步骤
  • 处理器生成虚拟地址,传给MMU
  • MMU生成PTE地址,并从高速缓存/主存请求得到他
  • 高速缓存/主存向MMU返回PTE
  • PTE中有效位为0,触发缺页异常
  • 确定牺牲页
  • 调入新页面,更新PTE
  • 返回原来的进程,再次执行导致缺页的指令
    (2)结合高速缓存和虚拟存储器
  • 在既使用SRAM高速缓存又使用虚拟存储器的系统中,大多数系统选择物理寻址。
  • 两者结合的主要思路是地址翻译发生在高速缓存之前。
  • 页表目录可以缓存,就像其他的数据字一样。
(3)利用TLB加速地址翻译
  • TLB:翻译后备缓冲器,是一个小的、虚拟存储的缓存,其中每一行都保存着一个由单个PTE组成的块

步骤

  • CPU产生一个虚拟地址
  • MMU从TLB中取出相应的PTE
  • MMU将这个虚拟地址翻译成一个物理地址,并且将它发送到高速缓存/主存
  • 高速缓存/主存将所请求的数据字返回给CPU
多级页表
  • 多级页表——采用层次结构,用来压缩页表。
  • 以两层页表层次结构为例,好处是:
  • 如果一级页表中的一个PTE是空的,那么相应的二级页表就根本不会存在
  • 只有一级页表才需要总是在主存中,虚拟存储器系统可以在需要时创建、页面调入或调出二级页表,只有最经常使用的二级页表才缓存在主存中。
  • 多级页表的地址翻译:

    四、存储器

  • 1.存储器映射
  • 指Linux通过将一个虚拟存储器区域与一个磁盘上的对象关联起来,以初始化这个虚拟存储器区域的内容的过程。
  • 映射对象:
  • Unix文件系统中的普通文件
  • 匿名文件(全都是二进制0)

    (1)共享对象和私有对象

    共享对象

  • 共享对象对于所有把它映射到自己的虚拟存储器进程来说都是可见的。
  • 即使映射到多个共享区域,物理存储器中也只需要存放共享对象的一个拷贝。
  • 私有对象
  • 私有对象运用的技术:写时拷贝
  • 在物理存储器中只保存有私有对象的一份拷贝
  • (2)fork函数就是应用了写时拷贝技术,execve函数:
  • 创建新的虚拟存储器区域

    教材学习中的问题和解决过程

    (一个模板:我看了这一段文字 (引用文字),有这个问题 (提出问题)。 我查了资料,有这些说法(引用说法),根据我的实践,我得到这些经验(描述自己的经验)。 但是我还是不太懂,我的困惑是(说明困惑)。【或者】我反对作者的观点(提出作者的观点,自己的观点,以及理由)。 )

物理和虚拟寻址

  • 计算机系统的主存被组织成一个由M个连续的字节大小的单元组成的数组,每字节都有一个唯一的物理地址(PA)。CPU根据物理地址访问存储器的方式是物理寻址。

  • 使用虚拟寻址时,CPU通过生成一个虚拟地址VA来访问主存,这个虚拟地址在被送到存储器之前先转换成适当的物理地址,地址翻译通过CPU芯片上的存储器管理单元完成。

  • 地址翻译

  • 地址翻译:一个N元素的虚拟地址空间(VAS)中的元素和一个M元素的物理地址空间(PAS)之间的映射。
  • MAP: VAS → PAS ∪ ?
  • MAP = A‘ ,如果虚拟地址A处的数据在PAS的物理地址A‘处
  • MAP = ? ,如果虚拟地址A处的数据不在物理存储器中
  • CPU中的一个控制寄存器页表基址寄存器指向当前页表,n位的虚拟地址包含两个部分:一个p位的虚拟页面偏移(VPO) 和一个(n-p)位的虚拟页号,页表条目中的物理页页号和虚拟地址中的VPO串联起来,就得到了相应的物理地址。

案例研究:Intel Core i7/Linux存储器系统

core i7地址翻译

PTE的三个权限位:
  • R/W位:确定内容是读写还是只读
  • U/S位:确定是否能在用户模式访问该页
  • XD位:禁止执行位,64位系统中引入,可以用来禁止从某些存储器页取指令

    缺页处理程序涉及到的位:

  • A位:引用位,实现页替换算法
  • D位:脏位,告诉是否必须写回牺牲页
  • Linux虚拟存储器系统
  • linux为每个进程维持了一个单独的虚拟地址空间,其中,内核虚拟存储器位于用户栈之上;
  • 内核虚拟存储器包含内核中的代码和数据结构,还有一些被映射到一组连续的物理页面(主要是便捷地访问特定位置,比如执行I/O操作的时候需要的位置)
  • linux将虚拟存储器组织成一些区域(也叫做段)的集合。一个区域就是已经存在的(已分配的)虚拟存储器的连续片;
  • 允许虚拟地址空间有间隙;内核不用记录那些不存在的页,这样的页也不用占用存储器;
  • 一个具体区域的区域结构:
  • vm _start:指向这个区域的起始处;
  • vm _end:指向这个区域的结束处;
  • vm _prot:描述这个区域内所包含的所有页的读写许可权限;
  • vm _fags:描述这个区域内的页面是与其他进程共享的,还是这个进程私有的,等等;
  • vm _next:指向链表的下一个结构。
  • linux为每个进程维持了一个单独的虚拟地址空间,其中,内核虚拟存储器位于用户栈之上;
  • 内核虚拟存储器包含内核中的代码和数据结构,还有一些被映射到一组连续的物理页面(主要是便捷地访问特定位置,比如执行I/O操作的时候需要的位置)
  • linux将虚拟存储器组织成一些区域(也叫做段)的集合。一个区域就是已经存在的(已分配的)虚拟存储器的连续片;

其他(感悟、思考等,可选)

  • 本周的学习加深了我对虚拟存储器的理解,让我明白了其区域结构。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第11周 2500/2700 17/18 30/20

尝试一下记录「计划学习时间」和「实际学习时间」,到期末看看能不能改进自己的计划能力。这个工作学习中很重要,也很有用。

耗时估计的公式

:Y=X+X/N ,Y=X-X/N,训练次数多了,X、Y就接近了。

参考:软件工程软件的估计为什么这么难软件工程 估计方法

  • 计划学习时间:40小时
  • 实际学习时间:40小时
  • 改进情况:

(有空多看看现代软件工程 课件

软件工程师能力自我评价表)

参考资料

时间: 2024-11-10 15:34:48

2017-2018-1 20155202 《信息安全系统设计基础》第11周学习总结的相关文章

20145309信息安全系统设计基础第11周学习总结后篇

进程 异常是允许操作系统提供进程的概念所需要的基本构造块. 进程:一个执行中的程序的实例. 上下文是由程序正确运行所需要的状态组成的,这个状态包括存放在存储器中的程序的代码和数据,它的栈.通用目的寄存器的内容.程序计数器.环境变量以及打开文件描述符的集合. 进程提供给应用程序的关键抽象: 一个独立的逻辑控制流,独占地使用处理器: 一个私有的地址空间,独占地使用存储器系统. 并发流:一个逻辑流的执行在时间上与另一个流重叠. 并发:多个流并发地执行的一般现象. 多任务:一个进程和其他进程轮流运行的概

20145309信息安全系统设计基础第11周学习总结前篇

教材学习内容总结 异常 异常:处理器中的变化(事件)触发从应用程序到异常处理程序的突发的控制转移 异常处理程序:在任何情况下,当处理器检测到有事件发生时,它就会通过一张叫做异常表的跳转表进行一个间接过程调用,到一个专门处理这类时间的操作系统子程序 当 exception handler处理结束之后,会有三种结果: ·处理程序将控制返回给事件发生的时候正在执行的指令 ·处理程序将控制返回给如果没有发生异常将会执行的下一条指令 ·处理程序终止被终端的程序 所有的到Linux系统调用的参数都是通过寄存

20145216 史婧瑶《信息安全系统设计基础》第一周学习总结

20145216 <信息安全系统设计基础>第一周学习总结 教材学习内容总结 Linux基础 1.ls命令 ls或ls .显示是当前目录的内容,这里“.”就是参数,表示当前目录,是缺省的可以省略.我们可以用ls -a .显示当前目录中的所有内容,包括隐藏文件和目录.其中“-a” 就是选项,改变了显示的内容.如图所示: 2.man命令 man命令可以查看帮助文档,如 man man : 若在shell中输入 man+数字+命令/函数 即可以查到相关的命令和函数:若不加数字,那man命令默认从数字较

20145311 《信息安全系统设计基础》第一周学习总结

20145311 <信息安全系统设计基础>第一周学习总结 教材学习内容总结 常用的部分命令 CTRL+SHIFT+T:新建标签页,编程时有重要应用: ALT+数字N:终端中切换到第N个标签页,编程时有重要应用: Tab:终端中命令补全,当输入某个命令的开头的一部分后,按下Tab键就可以得到提示或者帮助完成: CTRL+C:中断程序运行 Ctrl+D:键盘输入结束或退出终端 Ctrl+S: 暂定当前程序,暂停后按下任意键恢复运行 Ctrl+A: 将光标移至输入行头,相当于Home键 Ctrl+E

20145216史婧瑶《信息安全系统设计基础》第九周学习总结

20145216史婧瑶<信息安全系统设计基础>第九周学习总结 教材内容总结 第十章 系统级I/O 输入/输出(I/O)是在主存和外部设备之间拷贝数据的过程. 第一节 Unix I/O 这一节涉及到操作系统的基本抽象之一--文件.也就是说,所有的I/O设备都被模型化为文件,而所有的输入输出都被当做对相应文件的读/写.相关的执行动作如下: 1.打开文件: 应用程序向内核发出请求→要求内核打开相应的文件→内核返回文件描述符 文件描述符:一个小的非负整数,用来在后续对此文件的所有操作中标识这个文件.有

20145311 《信息安全系统设计基础》第二周学习总结

20145311 <信息安全系统设计基础>第二周学习总结 教材学习内容总结 重新学习了一下上周的一部分命令:grep main wyx.c(grep的全文检索功能)ls > ls.txt :ls内容输出到文本find pathname -mtime -n/+nfind -size -n/+n (find的功能还是比较强大) 简单地学习了一下vim编辑器,跟着vimtutor简单地学了一些,在linux bash中使用vim能够极大地提高效率, vim的用法比较多,只学习了其中简单的一部分

20145339《信息安全系统设计基础》第一周学习总结

20145339顿珠达杰<信息安全系统设计基础>第一周学习总结 ◆ Linux是一个操作系统.如果使用GUI,Linux和Windows没有什么区别.Linux学习应用的一个特点是通过命令行进行使用. 物理机系统上可以通过使用[Ctrl]+[Alt]+[F1]-[F6]进行终端和图形界面切换,在线实验环境中按下[Ctrl]+[Alt]+[F7]来完成切换.普通意义上的 Shell 就是可以接受用户输入命令的程序,Unix/Linux 操作系统下的 Shell 既是用户交互的界面,也是控制系统的

2017-2018-1 20155228 《信息安全系统设计基础》第九周学习总结

2017-2018-1 20155228 <信息安全系统设计基础>第九周学习总结 教材学习内容总结 常见的存储技术 RAM 随机访问存储器(Random-Access Memory, RAM)分为两类:静态的和动态的.静态 RAM(SRAM)比动态RAM(DRAM)更快,但也贵得多.SRAM用来作为高速缓存存储 器,既可以在CPU芯片上,也可以在片下.DRAM用来作为主存以及图形系统的帧缓冲 区.典型地,一个桌面系统的SRAM不会超过几兆字节,但是DRAM却有几百或几千兆 字节. SRAM将每

2017-2018-1 20155332 《信息安全系统设计基础》第九周学习总结

2017-2018-1 20155332 <信息安全系统设计基础>第九周学习总结 教材学习内容总结 简单模型中,存储器是一个线性的字节数组.真实模型中,是一个具有不同容量,成本,访问时间的存储层次结构(存储器山) 程序的局部性很重要,对程序性能有很重要的影响. 计算机系统一个基本而持久的思想,如果你理解了系统是如何将数据在存储器层级结构中上下移动,你就可以编写程序,让数据存储在层次结构中较高的地方,从而CPU可以更快的访问到他们. 编写程序实现功能是最简单的,如何让编写的程序拥有最高的性能,例

2017-2018-1 20155227 《信息安全系统设计基础》第九周学习总结

2017-2018-1 20155227 <信息安全系统设计基础>第九周学习总结 教材学习内容总结 第六章 随机访问存储器 随机访问存储器分为:静态RAM(SRAM)和动态RAM(DRAM),静态RAM(SRAM)比动态RAM(DRAM)更快,但也贵很多. (1)静态RAM SRAM将每个位存储在一个双稳态的存储器单元里,每个单元是用一个六晶体管电路来实现的. 属性:它可以无限制地保持在两个不同的电压配置或状态之一.其他任何状态都是不稳定的. 特点:由于SRAM的双稳态特性,只要有电,它就会永