二进制翱翔旅行日志

来源:www.xysxzl.com时间:2021-03-14 09:48

翱翔旅游

可能一篇文章写不下,这篇文章是对《深入理解计算机系统》第九章的一个学习总结,我会分两部分写。

是本很好的底层入门的书籍,感觉中文的翻译不是很贴切,《深入理解计算机系统》这本书是工作室一位前辈推荐的,嗯,书的原名叫《Computer Systems:A Programmer’s Perspective》,不过无所谓了,sa date开始咯,(卖萌~)。

二进制翱翔旅行日志

它为每个进程提供了一致的地址空间,从而简化了储存器的管理。

它保护了每个进程空间不受其他进程破化。

虚拟储存器在我看来是最重要的一个概念,我之所以直接写虚拟储存器有2个原因,我也认为这个概念及其重要(也可能我搞错了,第一点,对于二进制安全,我还只是个菜鸡^^),第二点,我昨天刚刚看完这个。

物理和虚拟寻址

虚拟地址就是一种储存器的抽象,就是指物理内存的地址,虚拟地址(Virtual Address,VA)直观的讲,c语言里的指针所用的就是虚拟地址,物理地址(Physical Address,PA)这个概念是不需要过多的解释,使用虚拟地址的寻址方式的成为虚拟寻址,使用物理地址的寻址方式是物理寻址。

地址空间

地址空间就是一个地址的数组,有虚拟地址空间和物理地址空间。

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

物理储存器也被分割为物理页(Physical Page,PP)大小也是P字节,VM系统将虚拟储存器分割为称为虚拟页(Virtual Page,VP)的大小固定的块,虚拟储存器被组织为一个由存放在磁盘上N个连续的字节大小的单元组成的数组,这些块作为磁盘和主存(较高层次)之间的传输单元,磁盘(较低层次)的数据被分割成块,物理页也被称为页帧(page frame),和储存器的层次结构的中的其他的缓存一样,每个块大小为P字节,每个字节都有唯一的虚拟地址,概念上来说。

任意时刻,虚拟页面都被分为三个不相交的子集:。

未分配:VM系统还未分配(或者创建)的页,不占用任何磁盘空间。

缓存的:当前已缓存在物理储存器中的已分配的页。

未缓存的:没有缓存在物理储存器中的已分配的页。

任何对DRAM的不命中都会招致很大的性能惩罚,由于大的不命中惩罚,我们知道DRAM比磁盘块了1000000多倍(关于SRAM和DRAM的介绍,虚拟页往往很大,而SRAM比DRAM快了将尽10倍,我们用DRAM缓存来表示主存中对虚拟储存器的缓存,不过我最近也会写一个关于这个的简单介绍),DRAM也是全相连的,同时操作系统也对DRAM使用了精密的替换策略,自行谷歌,所以,是一巨大的开销,因此,典型是在4KB~2MB之间。

程序的局部性的作用就再次体现出来了,可能导致其工作集超过内存的大小,导致页面不断换入换出,此时,这种状况叫做程序的颠簸(thrashing),此时程序慢的像爬一样,一个局部性差的程序。

再谈虚拟储存器的作用。

作为储存器的管理工具。

系统通过页表把每月页映射到内存的页上,简化了链接、加载、共享以及储存器的分配。

作为储存器的保护工具。

将控制移交给内核异常处理程序,PTE上有各种控制位,用户态程序只能访问SUP为0的页,如SUP位:为1时,任何现代计算机系统都必须为操作系统提供手段来控制对储存器的访问,READ位和WRITE位控制对页的读和写权限,只能内核模式访问,Unix外壳一般讲这种异常报告为段错误(segmentation fault),每次地址的翻译都需要PTE,cpu就触发一个一般保护错误,如果一条指令违反了许可条件。

地址翻译

先弄一个表

一个虚拟地址由2部分组成,VPO)和一个(n-p)位的虚拟页号(virtual page number,例如VPN0选择PTE0.物理地址也是2部分组成的,物理页面偏移(physical page offset,p位的虚拟页面偏移(virtual page offset,这个寄存器储存着页表的地址,CPU中还有一个控制寄存器,物理页号(physical page number,MMU)的硬件实时的翻译虚拟地址为物理地址,叫作页表基址寄存器(page table base register,CPU芯片上有一个叫做储存器管理单元(memory management unit,是一个进程的上下文,MMU根据VPN来选择PTE,VPN)组成,PPO)和VPO的位数是一样的,PPN),PTBR)。

页面命中时:

第一步,处理器生成一个虚拟地址,给MMU。

第二步,MMU生成PTE地址并从,高速缓存/主存中请求得到他,(PTBR+VPN)。

第三步,高速缓存/主存向MMU返回PTE。

第四步,MMU构造物理地址,并将他传给高速缓存/主存。

第五步,返回所请求的数据。

页面未命中时:

第一至第三步是相同的。

第四步,PTE有效位是0,MMU触发了一次异常,控制传递给内核异常处理程序。

第五步,缺页处理程序确定出物理储存器中的牺牲页,如果这个页面被修改了,则把他换出到磁盘上。

第六步,缺页处理程序把页面调入到新的页面上,并更新PTE。

第七步,返回到原来的进程,并重新执行刚才的指令。

结合高速缓存的虚拟储存器。

现代操作系统使用了物理寻址来访问高速缓存,关于是使用虚拟地址还是物理地址来访问时存在争论的,这是一种折中的方案(关于具体的书中没有介绍)。

使用TLB加速地址访问。

现代计算机系统中在MMU中包含了一个缓存PTE的高速缓存翻译后备缓冲器(translation lookaside buffer,以加速翻译,TLB)。

多级页表

我们假设一个32位的地址空间,也需要4MB的页表驻留在内存,4KB的页面和一个4字节的PTE,对于64位系统,我们只使用一级页表,那么即使应用所引用的只是虚拟地址的很小一部分,目前为止,这是一种严重的浪费,这将变的更复杂。

我们使用层次的页表,我们使用一个二级页表作为例子来解释。

如果片i没被分配,那么这片i就为空,假设4GB地址空间1024个片就可以覆盖完整个地址空间,每个片都是由1024个连续的页组成的,一级页表负责映射虚拟空间中的一个4MB的片(chunk)。

二级页表每个PTE都负责映射一个4KB的虚拟储存器页面。

这样有2个好处:

如果一级PTE为空,那么整个对应的二级页表就不存在,这是一种巨大的节约。

只有一级页表是需要常驻内存的,其他的页表可以在磁盘上,在需要时再换入内存。

下图描述了一个k级页表结构。

inter core i7/linux储存器系统。

虽然Nehalem设计允许完全的64位虚拟地址和物理地址空间,而现在其实现支持48位(256TB)虚拟地址空间和52位(4PB)物理地址空间,支持32位(4GB)虚拟和物理地址空间,还有一个兼容模式,Core i7是基于Nehalem微体系结构的。

页的大小被配置为4KB和4MB,linux使用4KB的页,下图是Core i7的重要组成部分。

Core i7的地址翻译。

CR3控制寄存器指向一级页表的起始位置,下图总结翻译过程和第一、二、三级页表结构,但与已分配内存页面相关的页表都是在储存器中的,Core i7采用4级页表,虽然Core i7允许页表换进换出,物理也是4KB对齐的,是进程上下文的一部分。

第四级页表

linux虚拟储存系统。

下图是一个linux的虚拟储存器。

不存在不属于某个区域的虚拟页,内核不需要记录那些不存在的虚拟页,而这些不存在的虚拟页也不占用任何资源,代码段,数据段,并且不能被进程引用,区域概念很重要,用户栈等就分属不同的区域(area),linux将储存器组织成一些区域(也叫段)的集合,因为它允许虚拟地址空间有间隙,例如。

任务结构中包含或者指向内核运行该进程所需要的全部信息(PID,内核为系统中每个进程维护一个单独的任务结构(源代码中的task_struct),下图强调了一个记录一个进程中虚拟存储器的内核数据结构,指向用户栈的指针、可执行目标文件的名字以及程序计数器等)。

而mmap指向一个vm_area_structs(区域结构)的链表,每个vm_area_structs都描述了当前虚拟地址空间的一个区域,我们感兴趣的是pgd和mmap,pgd指向第一级页表的基址,它描述了储存器当前的状态,task_struct中有个条目指向mm_struct。

vm_start,指向这个区域的开始。

vm_end,这个区域的结束。

vm_prot,描述这个区域全部页的读写权限。

vm_flags,描述这个区域是共享的还是私有的。

vm_next

linux缺页异常处理程序。

处理程序执行下面的步骤。

虚拟地址是合法的吗,根据vm_start和vm_end判断。

试图进行的储存器访问是否合法,根据控制位判断。

进行处理

储存器映射

linux下虚拟储存区域可以映射到2种类型对象中的一种:。

Unix文件系统中的普通文件。

然后用二进制零覆盖整个页,也叫请求二进制零的页(demand-zero page),包含的全部都是二进制零,内核就找到一个牺牲页,匿名文件:匿名文件由内核创建,页面被修改过就换出,CPU第一次引用这样的页时,注意磁盘和储存器间没有任何数据传送。

交换区都限制着当前运行着的进程能够分配的虚拟页面总数,一旦一个虚拟页面被初始化,交换文件也叫交换区(swap area),它就在一个内核维护的专门的交换文件(swap file)间换出换进,无论何种情况,任何时候。

共享对象

同时对其的修改也会反映到磁盘上的原始对象上,共享对象对所有相关进程都可见的。

私有对象

私有对象是私有的,私有对象使用了写时拷贝的技术,对其进行的写是不会反映到原始的磁盘对象上的。

好了,今天就到这里,最后雪雪乱入。

  • 陕西乾陵景区旅游导游词范文
  • 黄山旅游攻略汇编
  • 研学旅行基地项目可行性研究报告
  • 旅游风景区标识标牌类别意义
  • 厦门市文化旅游局
  • 泰安实施旅游发展战略助推全域旅游发展
  • 蓬佩奥妻子调查出国旅行多次未获书面批准
  • 残疾证旅游什么优惠政策
  • 菲律宾宿务纪行奥斯陆墨宝资生堂探海记图文
  • 国内春节旅游哪里
  • 精品行程推荐