VMM基础_MTM方法

VMM基础_MTM方法复杂度3/5机密度3/5最后更新2021/04/20VMMVirtualMemoryManagement是所有操作系统都要解决的问题,也是非常硬件相关的问题,必须从硬件CPU的地址管理开始谈起。

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

复杂度3/5
机密度3/5

最后更新2021/04/20

VMM Virtual Memory Management是所有操作系统都要解决的问题,也是非常硬件相关的问题,必须从硬件CPU的地址管理开始谈起。我们先了解一些术语:

Page 内存页,特定长度的一段内存,在AIX一般是4096Bytes, AIX/Power CPU现在支持small (4K), medium(64k), Large(16M), Scale(16G)大小的page,但需要AIX版本和Power CPU版本之间一定的配合关系,目前只以4K为page size讲述,以后将专题介绍如何设置、使用其它大小的page,以及其具体使用或访问方式。page size越大,对于消耗内存非常多的数据库或大型计算程序,可以降低OS管理内存的额外开销,提升内存使用率。
Page frame 与page对应的一段real memory(实内存),所谓实内存是通过服务器物理内存直接接驳的地址可以直接访问的内存
Page table 内存页映射表,用于实现虚拟内存页和real memory (page frames)或者磁盘(交换区、文件)进行映射
Paging space 交换区,是磁盘上保留的一块空间,用于保存内存页内的数据
Physical/real memory 物理/实内存,是服务器的真实RAM
Address space 地址空间,其中保存着数据的一段地址区间
AIX内存地址映射上图中可以看到有两个进程,都有自己的地址区间,甚至可能有相同的一段地址区间,但通过映射,会对应到不同的物理内存区间。也就是每个进程有自己独立的地址区间,他们通过映射进行区分。

Power CPU也就是AIX的载体支持两种地址映射模式,被称为translate on或off。如果translate off,则为实模式,这时所说的地址都是实地址,既real memory,无需进行地址映射。反之,translate on则实虚拟模式(可能通过多级映射),既上图显示的那种映射模式。

Power CPU通过MSR(Machine State Register)控制指令地址和数据地址的translate on/off状态:
如果设置了MSR_IR位,则指令重定向(映射),指令地址指针iar中的地址被当作实虚拟地址,反之则是实地址;
如果设置了MSR_DR位,则数据重定向(映射),load/stores的数据地址被当作虚拟地址

Power CPU / AIX支持3个地址空间:有效地址空间effective address space; 虚拟地址空间virtual address space和实/逻辑地址空间real/logical address space

在aix使用/管理内存时,会经过两次地址映射:有效地址空间地址映射为虚拟地址空间地址,虚拟空间地址再映射到实地址空间。

如前所述,每个(用户)进程都有它自己的有效地址空间,内核也有自己的有效地址空间。其中每个进程所涉及到的地址都是有效地址空间内的地址。然后,只有translation off的时候,内核的地址才是有效地址。

对于用户进程,不能把自己的有效地址和物理地址直接映射,因此上图的映射关系是省略了中间一个从虚拟地址到实地址映射环节的最终映射关系,真实情况还要增加一级映射过程,如下图所示:
三空间地址映射关系图下面我们来看一下具体的映射过程。还是要先说一些概念:

Physical/Real Address Space 物理地址、实地址空间,这是服务器内存条接驳的地址线路标记的地址区间,这个地址空间大小由物理内存大小决定,可以在内核disable translation的时候访问这个地址(两个前提,只有内核可以访问,必须关掉translation)。

无论是否可以直接访问实地址空间,虚拟地址空间的数据都是映射在对应的实地址空间内的物理内存条中的。这就类似一个人的绰号,这个人的大名和绰号各有各的适用称呼圈子,在不同的圈子里可能使用不同的称呼,但这两个名字其实都对应他一个人,只是场合不同,想要找到他的称呼也可能不同。

地址空间分配和映射以page为单位,就是一次分配或使用一块内存的最小单位是page。在实/物理地址空间,每一块的访问地址都通过一个页面号标识,这个页面号被称为Real Page Number (RPN)。

但是有效地址到虚拟地址的映射不能一页对一页映射,而是以segment为单位做的映射。此目的是为了减少映射表空间大小。如果以页为单位,则每一页都需要几个字节去标记有效地址页和虚拟地址页的对应关系,而且后面还有虚拟地址页到实/物理地址页的映射表,前一级有效地址到虚拟地址映射完全没有必要使用非常细的颗粒度。其实有效地址到虚拟地址映射的目的是分割地址空间,增加安全性管理,使得普通进程在CPU处理时缺省就无法越界访问(只能访问自己所在有效空间的数据),而且,普通用户进程通常也无需访问过大的地址空间。实际上,只有涉及到进程之间直接通信(mmap)或者进程访问内核,内核操作驱动程序做IO的时候,才有跨越不同进程各自有效地址空间访问的需求。

基于这些考虑,有效地址空间到虚拟地址空间的分配粒度时segment段,每段大小为256MB。这样就可以使用一个比较小的映射表(SLB,segment lookaside buffer),同时,对于内存访问授权的限制也以segment为单位,在同一个segment内的所有page,具有相同的被访问授权。换句话说,相同特性的page会在相同的segment中分配。而每个segment都有自己的SCB segment control block标记此segment的访问特性。

segment类型并不多,只有这么几种:

  • Working storage segment
    用于保存变化数据页,这些数据和磁盘地址可以有对应关系,能够交换到磁盘交换区。例如进程/内核数据和堆栈
  • Persistent storage segment
    用于缓存JFS文件系统数据(由于现在几乎没有使用JFS的场景,这种类型segment也许要被淘汰了)
  • Client storage segment
    用于缓存client 文件系统数据,JFS2,NFS,Veritas文件系统都使用这种方式
  • Mapping segment
    用于mmap,既进程之间共享内存
  • RMMAP segment
    用于I/O通信编程,特别是设备驱动程序

下一篇继续介绍:
VMM地址映射

VMM偷页算法

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/190717.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • [转]tika支持的文件格式

    [转]tika支持的文件格式SupportedDocumentFormatsThispagelistsallthedocumentformatssupportedbytheparsersinApacheTika1.13.Followthelinkstothevariousparserclassjavadocsformoredetailedinformatio…

    2025年7月11日
    5
  • android studio toast不显示_androidtoast封装

    android studio toast不显示_androidtoast封装AndroidToast用于在手机屏幕上向用户显示一条信息,一段时间后信息会自动消失。信息可以是简单的文本,也可以是复杂的图片及其他内容(显示一个view)。1.简单用法Toast.makeText(midlet.getApplicationContext(),”用户名不能为空”,Toast.LENGTH_LONG).show();2.自定义显示位置效果代码toast=Toast.mak…

    2025年8月30日
    7
  • idea最好用的插件_ios12.4必备插件源

    idea最好用的插件_ios12.4必备插件源01、ChineseLanguage汉化必备02、OneDarktheme代码主题03、AtomMaterialIcon图标主题04、RainbowBrackets多彩花开括号05、Translation翻译快捷键:Ctrl+Shift+Y06、Codata代码提示07、TabnineAICodeCompetion代码提示08、any-rule正则表达式09、GenerateAllSetter一键生成se

    2022年10月17日
    3
  • 青蛙过河谁先过_python knn算法实现

    青蛙过河谁先过_python knn算法实现一只青蛙想要过河。 假定河流被等分为若干个单元格,并且在每一个单元格内都有可能放有一块石子(也有可能没有)。 青蛙可以跳上石子,但是不可以跳入水中。给你石子的位置列表 stones(用单元格序号 升序 表示), 请判定青蛙能否成功过河(即能否在最后一步跳至最后一块石子上)。开始时, 青蛙默认已站在第一块石子上,并可以假定它第一步只能跳跃一个单位(即只能从单元格 1 跳至单元格 2 )。如果青蛙上一步跳跃了 k 个单位,那么它接下来的跳跃距离只能选择为 k – 1、k 或 k + 1 个单位。 另请注意

    2022年8月9日
    4
  • mysql的可视化工具_Mysql可视化工具Navicat的基本使用

    mysql的可视化工具_Mysql可视化工具Navicat的基本使用一、写在前面的话相信大多数php初学者刚学习mysql的时候,应该都是在cmd黑窗口中进行一些基本sql的增删改查操作,但是在企业中几乎不会在黑窗口环境中进行sql的编写,主要有两点原因:1.界面不友好(虽然有点逼格)2.容易造成数据的误删除(不像女朋友没了可以再找),下面就给大家介绍mysql可视化工具navicat的常用的操作。至于怎么安装navicat相信大家都会,基本一路next,然后选…

    2025年7月23日
    3
  • compass 制作精灵图

    compass 制作精灵图用compass快速制作精灵图1.现在images文件夹新建一个文件夹装各种小图标,命名为Icon;2.然后再sass文件加上这几句命令:@import”compass/utilities/sprites” ; //导入compass精灵模块;$Icon-spacing:5px; //设置生成的精灵图里面每个小图标的间距是5px;如果只是想设置某个图标的间距可以这样做:

    2022年5月3日
    42

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号