NetBSD内存管理系统UVM浅析

综述

UVM 是 NetBSD 使用的虚拟内存系统. 与其他基于 4.4BSD 的系统如 FreeBSD 等不同, 它完全重写了4.4BSD 的 VM. 相对于 4.4BSD VM, 它有很多显著的改进. 简化了设计, 提高了效率, 特别是引入了amap, 很好地解决了COW 问题.

uvm 系统与系统 kernel 相对独立 (4.4BSD VM 基于 Mach VM, 与 Mach 微内核分离, 4.4BSD 和 NetBSD 虽然没采用微内核架构, 却也集成了这样的功能模块结构). 全部代码在代码树 src/sys/uvm 处, 下文提到的文件路径若非绝对路径 , 都是从该目录开始的路径.

核心数据结构

在 NetBSD 中, 每个进程拥有一个独立的进程空间. 这由 vmspace 结构表示, 每个 proc 接口都包含着一个执行 vmspace 的项p_vmsapce, 这个 uvm 系统与进程管理系统的接口.

vmspace 结构的声明在 uvm_extern.h, 我们看到, 除了一些审计信息之外, 它直接指向 uvm_map.h 中的 uvm_map 结构. 因此 uvm_map 结构才是代表一个地址空间, 顾名思义, 用于完成地址的映射 (mapping 功能). uvm_map 中最为重要的两项是指向硬件相关的地址空间描述结构 pmap 和 uvm_map_entry 的双向链表.

我们在下一节认真查看 uvm_map_entry 结构, 以后要经常跟它打交道. 在这里, 我们看到, 它的 start 和 end 项说明了这个 entry 映射到地址空间中的地址范围, 接下来是一个联合的指向 uvm_obj 或 sub_map 的 object 项, sub_map 是提供给内核地址空间的特殊机制, 我们很少讨论它. 可以这么说, uvm_map_entry 指向一个 uvm_obj 结构, 是该对象的映射. offset 项说明了它在 uvm_obj 中的偏移量. ps. 这都是注释写得很清楚的, 我在这里说干嘛...

我们还可以看到 aref 项, vm_aref 结构指向了一个 amap (匿名对象映射 XXX. 这个翻译准确么?), 是一种代替 4.4BSD 中多层 shadow 对象的机制.

uvm_obj, vm_amap 及一下的结构我们称为底层结构, 内存的实际分配和操作都在这以下的层面完成, 它们最终指向内存分配管理的最小单位 vm_page.

整个 uvm 的核心数据可以表示如下, vm_amap 和 uvm_obj 之间的虚线我们会在下面的章节解释. 并非真正表示指针引用关系.

vmspace
   |
   v
uvm_map_entry <--> vm_map_entry ...
   |  |
   |  v
   |  vm_pmap
   |
   +-----------------+
   |         |
   v         |
 vm_aref       |
   |         |
   v         v
 vm_amap < - - - > uvm_obj
   |         |
   v         v
 vm_anon ...    vm_page <-> vm_page ...
   |
   v
 vm_page

另外, 我们注意到 uvm.h 中有个 uvm 结构, 这是各种 uvm 资源和参数的集合, 系统中只存在一个 uvm 对象.

顶层映射机构 (vmspace, uvm_map, uvm_map_entry)

时间: 2024-10-21 06:21:13

NetBSD内存管理系统UVM浅析的相关文章

大数据管理系统:浅析并行数据库优缺点

文章讲的是大数据管理系统:浅析并行数据库优缺点,并行数据库是指那些在无共享的体系结构中进行数据操作的数据库系统.这些系统大部分采用了关系数据模型并且支持SQL语句查询,但为了能够并行执行SQL的查询操作,系统中采用了两个关键技术:关系表的水平划分和SQL查询的分区执行. 水平划分的主要思想就是根据某种策略将关系表中的元组分布到集群中的不同节点上,这些节点上的表结构是一样的,这样就可以对元组并行处理.现有的分区策略有哈希分区.范围分区.循环分区等.例如,哈希分区策略是将表T中的元组分布到n个节点上

内存管理内幕

动态分配的选择.折衷和实现 Jonathan Bartlett (johnnyb@eskimo.com), 技术总监, New Media Worx 本文将对 Linux 程序员可以使用的内存管理技术进行概述,虽然关注的重点是 C 语言,但同样也适用于其他语言.文中将为您提供如何管理内存的细节,然后将进一步展示如何手工管理内存,如何使用引用计数或者内存池来半手工地管理内存,以及如何使用垃圾收集自动管理内存. 好文章收藏! 原文地址:http://www.ibm.com/developerwork

Linux内核中常见内存分配函数(三)

ioremap void * ioremap (unsigned long offset, unsigned long size) ioremap是一种更直接的内存"分配"方式,使用时直接指定物理起始地址和需要分配内存的大小,然后将该段 物理地址映射到内核地址空间.ioremap用到的物理地址空间都是事先确定的,和上面的几种内存 分配方式并不太一样,并不是分配一段新的物理内存. ioremap多用于设备驱动,可以让CPU直接访问外部设备的IO空间.ioremap能映射的内存由原有的物理

kernel学习之内存管理简介

内存是linux内核所管理的最重要的资源之一,内存管理子系统是操作系统中最重要的部分之一.对于立志从事内核开发的工程师来说,熟悉linux的内存管理系统是非常重要的.早些年的DOS是直接访问内存的,这样不同的应用程序很容易让系统死机.在现在的linux系统,应用程序会产生一个trap,进入内核,这时内核是安全的.虚拟内存可以使应用程序使用连续.比实际内存更大的内存空间,这些内存空间在物理上可能是离散的,甚至可能是交换到磁盘上的.可以 这么说现代操作系统的内存管理就是虚拟内存的管理. 一.存储器地

Linux系统基本的内存管理知识讲解

  内存是Linux内核所管理的最重要的资源之一.内存管理系统是操作系统中最为重要的部分,因为系统的物理内存总是少于系统所需要的内存数量.虚拟内存就是为了克服这个矛盾而采用的策略.系统的虚拟内存通过在各个进程之间共享内存而使系统看起来有多于实际内存的内存容量.Linux支持虚拟内存, 就是使用磁盘作为RAM的扩展,使可用内存相应地有效扩大.核心把当前不用的内存块存到硬盘,腾出内存给其他目的.当原来的内容又要使用时,再读回内存. 一.内存使用情况监测 (1)实时监控内存使用情况 在命令行使用"Fr

《iOS应用开发》——2.3节内存管理

2.3 内存管理 iOS应用开发 我不是吓唬你们.在iOS 5.0系统之前,内存管理毫无疑问是iOS开发最困难的部分.简而言之,问题是这样的.无论何时你创建了一个变量,你就要在内存中给它分配一定的空间.对于局部变量来说,我们通常使用栈上的内存,这些内存是自动管理的,当函数返回时,函数中定义的任何局部变量都会从内存中自动删除. 这听起来很棒,但是栈有两个严重的局限.首先,它的空间非常有限,如果用尽了内存,应用程序就会崩溃.其次,这些变量很难共享.请记住,函数使用值传参和返回.这意味着所有传入函数或

Unity3D占用内存太大的解决方法

最近网友通过网站搜索Unity3D在手机及其他平台下占用内存太大. 这里写下关于Unity3D对于内存的管理与优化. Unity3D 里有两种动态加载机制:一个是Resources.Load,另外一个通过AssetBundle,其实两者区别不大. Resources.Load就是从一个缺省打进程序包里的AssetBundle里加载资源,而一般AssetBundle文件需要你自己创建,运行时 动态加载,可以指定路径和来源的. 其实场景里所有静态的对象也有这么一个加载过程,只是Unity3D后台替你

C#中如何动态开辟大的内存区域?

问题描述 我要开辟一个10G大小的内存区域给系统保存BMP文件使用,不想频繁分配和回收内存.10G内存算好了给100个图片使用,轮询使用,程序结束时一起释放掉.C++中可以按照BYTE分配内存,C#中应该如何写呢? 解决方案 解决方案二:你牛B,要开10G内存区域!!!!!!解决方案三:能不能1.使用RamDisk内存模拟硬盘的软件,操作在此内存盘上,实现提高性能2.三星951PCISSD,理论性能是DDR3内存处理速度的三分之一,速度在1000M~1500M之间3.INETLPCISSD,价格

Unity 3D中的内存管理

本文欢迎转载,但烦请保留此行出处信息:http://www.onevcat.com/2012/11/memory-in-unity3d/ Unity3D在内存占用上一直被人诟病,特别是对于面向移动设备的游戏开发,动辄内存占用飙上一两百兆,导致内存资源耗尽,从而被系统强退造成极差的体验.类似这种情况并不少见,但是绝大部分都是可以避免的.虽然理论上Unity的内存管理系统应当为开发者分忧解难,让大家投身到更有意义的事情中去,但是对于Unity对内存的管理方式,官方文档中并没有太多的说明,基本需要依靠