首页 > 系统相关 >22/8/25 深入理解计算机系统第九章 虚拟内存

22/8/25 深入理解计算机系统第九章 虚拟内存

时间:2022-08-25 21:34:48浏览次数:82  
标签:25 22 私有 vm 区域 内存 虚拟内存 页面

9.7 案例:Intel Core i7/Linux 内存系统

见书576

9.8 Linux虚拟内存系统

与进程相关的数据结构
(比如:页表、task和mm结构、内核栈)
对每个进程不同
物理内存内核虚拟内存
内核代码和数据对每个进程一样
用户栈进程虚拟内存
共享库的内存映射区域
运行时堆(malloc分配)
未初始化数据(.bss)
已初始化数据(.data)
代码(.text)

每个存在的虚拟页面都保存在某个区域中,这样可以允许虚拟内存有间隙,内核不用记录不存在的虚拟页。
内核为系统中每个进程维护一个单独的任务结构(task_struct)。任务结构中的元素包括或者指向内核运行该进程所需要的全部信息。(PID,指向用户栈的指针,可执行文件的名字,程序计数器等)
mm_struct 描述了虚拟内存的当前状态:
其中pgd指向第一级页表的基址
mmap指向vm_area_structs的链表。每个vm_area_structs都描述了当前虚拟地址空间的一个区域。
vm_area_structs包含以下字段:
vm_start:指向这个区域的起始处
vm_end:指向这个区域的结束处
vm_prot:描述这个区域内包含的所有页的读写许可权限
vm_flags:描述这个区域的页面是和其他区域共享的,还是私有的。
vm_next:指向链表中下一个区域结构。

linux缺页异常处理

  1. 缺页处理程序会先判断虚拟地址是否合法,通过和每个区域结构中的vm_start和vm_end比较判断,如果是不合法的,就会触发段错误。
  2. 判断试图进行内存访问是否合法,如果不合法就会触发一个保护异常。
  3. 选择一个牺牲页面,如果这个页面修改过就交换,换入新的页面并更新页表,然后重启引起缺页中断的指令。

9.8 内存映射

定义:将一个虚拟内存区域和一个磁盘上的对象关联起来,以初始化这个虚拟内存区域的内容的过程被称为内存映射。

虚拟内存区域可以映射到下面两种类型的对象中的一个:

  1. Linux文件系统中的普通文件:因为按需进行页面调度,所以这些虚拟页面没有实际交换进入物理内存,而是等到CPU第一次引用这个页面(发射一个落在这个页面范围内的虚拟地址)。如果区域比文件大小大,则用零填充剩下区域。
  2. 匿名文件:匿名文件由内核创建,包含的全是二进制的零。CPU第一次引用这个区域内的虚拟页面之后,内核就换出一个牺牲页面,并用二进制0覆盖并更新页表,然后把这个页面标记为驻留在内存中。注意:磁盘和内存没有实际的数据传输,所以映射到匿名文件中的页面也叫请求二进制零的页。

进程的共享区域和私有区域。
私有对象使用一种叫做写时复制的技术,私有对象开始生命周期的方式基本与共享对象一样,在物理内存中只保存一份私有对象的副本。
每个映射私有对象的进程,相应私有区域的页表条目被标记为只读。区域结构被标记为私有的写时复制,只要没有进程试图写自己的私有区域,它们就继续共享一份物理内存的副本。如果一个进程试图写私有区域的某个页面,就会触发一个保护故障。

故障处理程序会在物理内存中创建这个页面的一个新副本,并更新页表指向这个新副本,然后恢复这个页面的可写权限。
当故障处理程序返回时,CPU重新执行这个写操作,之后在这个新页面上的写操作就可以正常运行了。
注意:是以页面为单位。
图片见书P584

标签:25,22,私有,vm,区域,内存,虚拟内存,页面
From: https://www.cnblogs.com/hy227/p/16625821.html

相关文章

  • 2022-8-25第一组孙乃宇JavaScript
    JavaScript最后元素的属性获取元素的属性所有的HTML元素,我们可以根据具体需求,自定义添加属性<divhaha="abc"id="xyz"name="123"></div>获取这个属性的值为什么na......
  • dremio 22.1.1 发布
    这次dremio的发布从功能上更多是bug修复比较多,对于增强上主要是调整了对于嵌入nessie历史数据的处理,允许对于非分片列的运行时过滤优化bug修复还是比较多的,具体可以参......
  • leetcode223-矩形面积
    矩形面积计算重叠面积重叠面积计算方法如下:重叠部分如果有的话肯定是一个矩形,这个矩形的左边界是两个矩形的左边界取较大值,右边界是两个矩形的右边界取较小值。上下边......
  • leetcode225-用队列实现栈
    用队列实现栈classMyStack{LinkedList<Integer>list=newLinkedList<>();publicMyStack(){}publicvoidpush(intx){list.a......
  • leetcode226-翻转二叉树
    翻转二叉树递归classSolution{publicTreeNodeinvertTree(TreeNoderoot){if(root==null)returnroot;TreeNodel=invertTree(roo......
  • 2022/8/25 总结
    A.幸福考场上没想起矩阵,写了个\(\mathtt{O(n)}\)的暴力,得\(\mathtt{70pts}\);Solution矩阵乘法。对\(F_n\)进行化简,就可以化得一个式子:\(F_n=F_{n-1}+F_{n-2}......
  • 2022-08-25 第五组 赖哲栋 学习笔记
    元素的设置<!--所有的HTMl元素,我们可以根据具体需求,自定义添加属性--><divhaha="abc"id="xyz"></div>获取属性的值元素.属性名的方式只适用于元素原生的属性......
  • leetcode222-完全二叉树的节点个数
    完全二叉树的节点个数递归classSolution{publicintcountNodes(TreeNoderoot){if(root==null)return0;returncountNodes(root.le......
  • 2022-08-25 第二组刘禹彤 学习笔记
    打卡40天###学习内容Javascript自定义属性获取属性所有的html元素,我们可以根据具体需求,自定义添加属性元素.属性名的方式只适用于元素原生的属性自定义属性di......
  • NOI 2022 游记
    Day1挂了。挂了30分,不知道哪里挂的,看完分自闭了没调。Day2又挂了。挂了48分。放平心态调了调,调完更自闭了。T1自然溢出被卡,加个模数就过了。-32T2暴力没判......