随着SVR4集成了SunOS的Virtual Memory System (VM),SVR4虚拟文件系统对之前的I/O路径做了非常大的改进,这些变化包括buffer cache的用法以及为支持基于page-cached的IO而对内核、VM乃至磁盘驱动的改动。
(With the inclusion of the SunOS VM subsystem in SVR4, and the integration between the filesystem and the Virtual Memory (VM) subsystem, the SVR4 VFS architecture radically changed the way that I/O took place. The buffer cache changed in usage and a tight coupling between VM and filesystems together with page-based I/O involved changes throughout the whole kernel from filesystems to the VM to individual disk drivers.)
为此,在深入了解Page-Cached之前,我们需要对SVR4的VM系统有个基本了解。总体来讲,SVR的VM是基于段式的,和每个vnode对应一组vop操作类似,每个段都有对应的一组操作。当出现segment fault/page fault的时候,当前段对应的函数就会得到调用,进而实现调页,读入磁盘上的数据。
(Each segment type has an array of segment-related functions in the same way that each vnode has an array of vnode functions. In the case of a page fault, the kernel will call the fault() function for the specified segment causing the segment handler to respond by reading in the appropriate data from disk.)
SVR4系统基于SunOS的VM管理,采用的是段式内存管理系统, 用到主要的数据结构包括:
memory image of each user prcess: proc中的as (address space) structure
而as又引用到了一组seg structure 数组
一个程序的段通常包括数据段、text段、stack、库、共享内存、内存映射文件。如下图所示:
数据结构之间的关系如下图:
为了表征想代码段和数据段这类以文件背书的段,引入了一个叫做segvn segment type, 这类段包含下面的数据成员:
s_data:用于访问当前段私有、专有的数据
segvn_data:包括段以及背书它的文件的信息
原理(流程)如下:
当用户程序开始执行的时候,刚开始内存里并没有所执行程序对应段的物理页,因此刚开始会触发page错误。内核中的page fault 中端响应函数会执行请求调页的功能。如果发现请求的地址不在程序的任何一个段的范围之内,就会产生段错误。
参考文档:Virtual Memory Architecture in SunOS
思考问题:
段错误、缺页中端、TLB misss、cache miss 的联系与区别
本文转自存储之厨51CTO博客,原文链接:http://blog.51cto.com/xiamachao/1904093 ,如需转载请自行联系原作者