大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新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 地址空间,其中保存着数据的一段地址区间
上图中可以看到有两个进程,都有自己的地址区间,甚至可能有相同的一段地址区间,但通过映射,会对应到不同的物理内存区间。也就是每个进程有自己独立的地址区间,他们通过映射进行区分。
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地址映射
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/190717.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...