lec 07 操作系统管理页表映射

0 Contents

1 操作系统设置页表映射

何时设置页表映射?

  • 操作系统自己使用的页表

    -- 在启动时填写

    -- 映射全部物理内存

    • 虚拟地址 = 物理地址 + 固定偏移(直接映射,Direct Mapping)
    • 思考:为什么需要直接映射?
  • 应用进程的页表

    -- 何时设置?

2 立即映射

  • 创建进程时,OS按照虚拟内存区域填写进程页表

    -- 例如,代码段和数据段

    -- 具体步骤:

    • 步骤-1: 分配物理页(alloc_page)
    • 步骤-2: 把应用代码/数据从磁盘加载到物理页中
    • 步骤-3: 添加虚拟页到物理页的映射(add_mapping)
    • 步骤-4: 未加载完毕,回到步骤-1

分配物理页的简单实现

操作系统用位图记录物理页是否空闲

0:空闲;1:已分配

OS填写页表基地址

结构体保存页表的基地址

填写进程页表

!直接映射弊端

  • 立即映射是一种操作系统可以选择的页表填写策略

    -- 在初始化进程虚拟地址空间时,直接在进程页表中添加各虚拟内存区域的映射

  • 潜在弊端

    -- 以关卡/副本类型游戏加载为例:只玩1关,加载1000关

    • 物理内存资源浪费
    • 非必要时延

3 延迟映射

想法

  • 解决立即映射弊端的直观想法

    -- 操作系统按进程实际需要分配物理页和填写页表,避免分配的物理页实际不被用到的情况

  • 主要思路:解耦虚拟内存分配与物理内存分配

    -- 先记录下为进程分配的虚拟内存区域

    -- 当进程实际访问某个虚拟页时,CPU 会触发缺页异常

    -- 操作系统在缺页异常处理函数中添加映射

操作系统需要区分合法/非法缺页异常

执行以下代码,操作系统可以发现segmentation fault

#include<stdio.h>

int main()
{
char *p = NULL;
printf("%s\n",p);
return 0;
}

操作系统记录为进程分配的虚拟内存区域

  • 虚拟地址空间

    -- 若干非连续的虚拟内存区域

    • 每个虚拟内存中虚拟地址都是进程可用的,具有相同的访问权限。
    • 例如:代码,数据,堆,栈
    • 访问非法虚拟地址会触发CPU异常,操作系统将会跑出segmentation fault。

合法虚拟地址信息的记录方式

  • 记录进程已经分配的虚拟内存区域

    -- Linux: 对应结构体vm_area_struct,位于linux/include/linux/mm_types.h内定义。

(有意思的是,虚拟内存在linux内出现是在2008年)。

-- Chcore: 对应以下的结构体。

VMA 添加方式

1.OS创建进程时分配

  • 数据(对应ELF文件的数据段)
  • 代码(对应ELF文件的代码段)
  • 栈(初始没有内容)

2.进程运行时添加

  • 堆,栈
  • mmap/munmap

    -- 分配内存buffer和加载新的代码库

mmap: 分配一段虚拟内存区域

  • 通常用于把一个文件或一部分映射到内存
  • 也可以不映射任何文件,仅仅新建虚拟内存区域(匿名映射)

linux:

示例

执行mmap后,vma发生变化

mmap 映射文件

VMA如何添加

  • 途径2: 进程运行时添加/应用程序主动向OS发起系统调用

    -- mmap()

    • 申请空的虚拟内存区域
    • 申请映射文件数据的虚拟内存区域

      -- brk():扩大、缩小堆区域

      -- 栈VMA的可选策略
    • OS为进程初始分配固定大小的栈VMA,在发现stackoverflow之后自动扩大栈VMA

      -- 用户态的malloc(API)也可能改变VMA
    • 调用brk,在堆中分配新的内存
    • 调用mmap分配较大区域

VMA判断缺页异常的合法性

  • 缺页异常(page fault)

    -- AARCH64:触发(通用的)同步异常(8)

    -- 根据ESR信息判断是否为缺页异常

    -- 访问的虚拟地址存放在FAR_EL1

  • 操作系统的缺页处理函数

    -- FAR_EL1中的值不落在VMA区域内,则为非法

    -- 反之,则分配物理页,并在页表中添加映射

延迟映射与立即映射对比

  • 优势:节约内存资源
  • 劣势:却页异常导致访问延迟增加
  • tradeoff:

    -- 应用程序具有时空局部性

    -- 缺页异常处理中采用预先映射策略。节约内存并且减少缺页异常次数。

OS向应用提供灵活的内存管理系统调用

4 虚拟内存的扩展功能

1.共享内存

节约内存与进程通信作用。

2.写时拷贝



实现:修改页表项权限,在缺页时拷贝,恢复。

fork:节约物理内存,性能加速。

3.内存去重

  • memory deduplication

    -- 基于写时拷贝机制

    -- 在内存中扫描,发现具有相同内容的物理页面

    -- 执行去重

    -- 操作系统发起,对用户态透明

4.内存压缩

  • 基本思想

    -- 当内存资源不充足的时候, 选择将一些“最近不太会使用”的内存页进行数据压缩,从而释放出空闲内存

大页的利弊

  • 好处

    -- 减少TLB缓存项的使用,提高 TLB 命中率

    -- 减少页表的级数,提升遍历页表的效率
  • 案例

    -- 提供API允许应用程序进行显示的大页分配

    -- 透明大页(Transparent Huge Pages) 机制
  • 弊端

    -- 未使用整个大页而造成物理内存资源浪费

    -- 增加管理内存的复杂度

Lec 07 操作系统管理页表映射的更多相关文章

  1. 【原创】ARMv8 MMU及Linux页表映射

    背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...

  2. 《Java核心技术卷二》笔记(二)文件操作和内存映射文件

    文件操作 上一篇已经总结了流操作,其中也包括文件的读写.文件系统除了读写以为还有很多其他的操作,如复制.移动.删除.目录浏览.属性读写等.在Java7之前,一直使用File类用于文件的操作.Java7 ...

  3. 第3章 文件I/O(7)_高级文件操作:存储映射

    8. 高级文件操作:存储映射 (1)概念: 存储映射是一个磁盘文件与存储空间的一个缓存相映射,对缓存数据的读写就相应的完成了文件的读写. (2)mmap和munmap函数 头文件 #include&l ...

  4. x86平台上的Windows页表映射机制

    首先,在x86架构的处理器上,一个正常页面大小为4KB,非PAE模式下,CR3持有页目录页面的物理地址,PDE和PTE格式相同大小为4字节.此时每个页表页面包含1024个PTE,可以映射1024个页面 ...

  5. Spring JDBC Framework详解——批量JDBC操作、ORM映射

    转自:https://blog.csdn.net/yuyulover/article/details/5826948 一.spring JDBC 概述 Spring 提供了一个强有力的模板类JdbcT ...

  6. Linux kernel 内存 - 页表映射(SHIFT,SIZE,MASK)和转换(32位,64位)

    0. Intro 如下是在32位下的情况,32位下,只有三级页表:PGD,PMD,PTE 在64位情况下,会有四级页表:PGD,PUD,PMD,PTE 但是原理基本上是一样的,本文主要是想记录一下页表 ...

  7. docker的简单操作和端口映射

    一:简介 Docker镜像 在Docker中容器是基于镜像启动的 镜像是启动容器的核心 镜像采用分层设计,最顶层为读写层 使用快照COW技术,确保底层不丢失 通过ifconfig(ip  a)来查看d ...

  8. windows下操作linux虚拟机映射网络驱动器中文件提示chmod权限不足解决方案

    为了方便操作,linux虚拟机会通过windows下连接网络驱动器的方式共享自己的文件,对于前端来说,我想把gulp放在windows磁盘,操作虚拟机中的php文件,一来节省虚拟机磁盘大小,二来解决虚 ...

  9. 操作系统管理CPU的直观想法

    CPU的工作原理 要想管理CPU,就要先学会如何使用CPU.我们先从一个程序的执行来看看CPU是如何工作的. void main(){ int i , sum; ; i < ; i++){ su ...

  10. Selenium系列之--07 操作远程浏览器

    Selenium远程控制浏览,可以通过如下两种方式实现,本质上都是Selenium Grid a.  客户机启Selenium Standalone Server 作为远程服务,服务端通过调用Remo ...

随机推荐

  1. Delaunay 三角化 学习3

    简介 还是太菜从解析官方代码开始. 官方代码共有三个核心函数. 参考链接 http://blog.sina.com.cn/s/blog_6029f0330101irlh.html http://pau ...

  2. ETL与ELT核心技术解析:如何选择最优数据集成方案

    在数字化转型浪潮中,数据集成作为企业数据战略的核心环节,ETL与ELT两种技术路径的抉择直接影响着数据处理效率.本文将通过谷云科技在数据集成领域的实践经验,深入解析两种模式的本质差异与应用场景. 技术 ...

  3. Git-进阶1 git reset 加不加 --hard的区别 --九五小庞

    通常我们提交代码一般都是 git add ,git commit -m, git push的这么个流程.添加到暂存区,提交到git库生成版本号,push到远程仓库以供他人可以使用.这是一个完整的且非常 ...

  4. mongodb查询指定字段

    mongodb查询指定字段 @Test public void fun1() { DBObject fieldsObject = new BasicDBObject(); fieldsObject.p ...

  5. 将openGLProgrammingGuide7/8版和openGLSuperBible7的源代码转换为C#

    我找到的openGL示例代码一般都是C++写的,编译起来很是困难,不是缺这个lib就是少那个模型,要不就是一堆令人绝望的bug. 最近终于得到了OpenGL Programming Guide 7th ...

  6. Linux C编程之三 静态库的制作和使用(lib + 名字 + .a)

    摘自:https://www.cnblogs.com/xuejiale/p/10788320.html 一.整体大纲 二.静态库的制作 1)命名规则        lib + 库的名字 + .a    ...

  7. 【攻防世界】Banmabanma

    1. 首先下载附件,解压出来之后得到的是一张png图片. 2. 观察图片,我们发现这斑马的条纹还有粗有细,间隔也不一样,真正的斑马是这样的吗? 3. 这不禁让人联想到超市扫的那种条形码--额么么,好的 ...

  8. 查看字符段在哪些SP中出现

    查看SQL的字段在哪些Stored Procedure中有出现 SQL: declare @i varchar(100) select @i = '%FieldName%' select distin ...

  9. Apple Pen Gym - 102680B

    https://vjudge.net/problem/Gym-102680B/origin https://vjudge.net/contest/396206#problem/B After visi ...

  10. Docker Swarm Keepalived Operator:高可用集群虚拟 IP 管理方案

    在生产环境中,服务的高可用性往往是一个必要但复杂的需求.传统的容器化高可用部署面临着不少挑战,今天来介绍一个针对 Docker Swarm 设计的 Keepalived Operator,看看它如何简 ...