os的内存管理大概可以分成两块:1.段页式管理(虚存)2.swap in 和 swap out

段页式管理

段式管理的图像:运行时重定位

多级页表的管理图像

 块表加速

用户(程序员)希望用段,物理内存希望用页来进行管理

所以引入虚存的概念:

  段面向用户,用户眼里的地址是0-4G,页面向物理内存,存储时,将段切割成一页一页存在物理内存里,

  同时,pcb内有虚拟页->物理页的映射表,物理页寻址时再按照多级页表那样寻址即可

 以系统调用fork为例来分析段页式内存管理的过程:

假设每个进程都在虚存里被分配到64M的内存,且互不重叠,通过简化,每个代码段,数据段都是一个段

现在已经有了进程0和进程1,新建的是进程1的子进程2

在fork调用的copy_process函数里调用了一个函数copy_mem

nr就是当前进程个数,这里先把进程2的虚存的基地址给确定下来

接下去是函数copy_page_table,将父进程的页表复制给子进程( 子进程复制父进程内存资源 )

接下去分析函数具体实现

第一句话:from_dir指向父进程虚存页目录

第二句话:to_dir指向子进程虚存页目录

第三句话:size为父进程拥有的虚存页目录条数

进入循环:遍历父进程的所有页表,在子进程新建出来

  枚举每条页目录,子进程都通过每条页目录新建一个页表

  from_page_table指向父进程的一个页表

  to_page_table指向子进程的一个新建页表

这句话修改子进程该页表的权限:注意此时 *to_dir & 0xFFFFF000 才和 to_page_table所指向的的那一页相同,*to_dir的前20位是页目录+页编号,后面几位已经是对应页的权限了

然后要将from_page_table指向的所有页都复制给to_page_table

循环:

  第一句:this_page指向from_page_table存的那一页

  第二,三,四句:将该页权限改为只读,同时父子进程都更新这个只读页

   第四,五句:将this_page对应的页号++即可,表示多了个指向这页的进程

如果子进程要修改某页的内容,因为其实只读的,所以子进程直接复制该页内容到新的一页,在新的一页上进行修改

swap in

由14号缺页中断引入

page.s中处理缺页中断edx存了缺少的那页虚存

address就是缺少的那页虚存地址,page是被加载进来的那页物理地址

把虚存页address和物理页page对应起来

page_table最后指向address虚页页表,最后一句把address的在中间十位(即页表)抠出来,和page建立起映射

linux内核源码——内存管理:段页式内存及swap的更多相关文章

  1. linux 内核源代码情景分析——i386 的页式内存管理机制

    可以看出,在页面目录中共有210 = 1024个目录项,每个目录项指向一个页面表,而在每个页面表中又共有1024个页面描述项. 由图看出来,从线性地址到物理地址的映射过程为: 1)从CR3取得页面目录 ...

  2. Linux内核源码分析 day01——内存寻址

    前言 Linux内核源码分析 Antz系统编写已经开始了内核部分了,在编写时同时也参考学习一点Linux内核知识. 自制Antz操作系统 一个自制的操作系统,Antz .半图形化半命令式系统,同时嵌入 ...

  3. linux内核源码注解

    轻松学习Linux操作系统内核源码的方法 针对好多Linux 爱好者对内核很有兴趣却无从下口,本文旨在介绍一种解读linux内核源码的入门方法,而不是解说linux复杂的内核机制:一.核心源程序的文件 ...

  4. Linux内核源码分析--内核启动之(3)Image内核启动(C语言部分)(Linux-3.0 ARMv7)

    http://blog.chinaunix.net/uid-20543672-id-3157283.html Linux内核源码分析--内核启动之(3)Image内核启动(C语言部分)(Linux-3 ...

  5. 和菜鸟一起学linux内核源码之基础准备篇

    来源:http://blog.csdn.net/eastmoon502136/article/details/8711104 推荐阅读:linux内核源码最初版linux内核源代码,简单易懂,适合初学 ...

  6. Linux内核源码特殊用法

    崇拜并且转载的: http://ilinuxkernel.com/files/5/Linux_Kernel_Source_Code.htm Linux内核源码特殊用法 1 前言 Linux内核源码主要 ...

  7. Linux内核源码分析之setup_arch (二)

    1. 概述 接着上一篇<Linux内核源码分析之setup_arch (一)>继续分析,本文首先分析arm_memblock_init函数,然后分析内核启动阶段的是如何进行内存管理的. 2 ...

  8. Linux内核源码分析之setup_arch (三)

    1. 前言 在 Linux内核源码分析之setup_arch (二) 中介绍了当前启动阶段的内存分配函数memblock_alloc,该内存分配函数在本篇将要介绍paging_init中用于页表和内存 ...

  9. Linux内核源码分析之setup_arch (四)

    前言 Linux内核源码分析之setup_arch (三) 基本上把setup_arch主要的函数都分析了,由于距离上一篇时间比较久了,所以这里重新贴一下大致的流程图,本文主要分析的是bootmem_ ...

随机推荐

  1. leetcode 238. 除自身以外数组的乘积 (python)

    给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积. 示例: 输入: [1 ...

  2. mysql_DML_索引、视图

    创建索引的语法格式:– 创建普通索引:• create index 索引名称 on 表名(列)• alter table 表名 add index 索引名称 (列)– 创建唯一索引:• create ...

  3. 利用Fiddler对手机应用抓包

    1.启动Fiddler,打开菜单栏中的 Tools > Fiddler Options,打开“Fiddler Options”对话框. 2.在Fiddler Options”对话框切换到“Con ...

  4. python字符串常见操作

    字符串常见操作 如有字符串mystr = 'hello world itcast and itcastcpp',以下是常见的操作 <1>find 检测 str 是否包含在 mystr中,如 ...

  5. P2009 跑步

    题目传送门 热烈庆祝SZM黄题破80,绿题破30,蓝题破20!!!(紫题还是2,,,,orz%%%) 非常水的一道最短路,小于等于100果断Floyd,要好好读题,别忘记特判,8分钟基本就能做出来啦~ ...

  6. 汇编语言之寄存器使用bx si di bp

    转载自:https://www.cnblogs.com/youxin/archive/2012/05/29/2524780.html 如果你看到这篇博客时正在做第七章问题,强烈建议先去把8.1~8.4 ...

  7. 请列举出JS对象的几种创建方式?

    javascript创建对象简单的说,无非就是使用内置对象或各种自定义对象,当然还可以用JSON:但写法有很多种,也能混合使用. 1.对象字面量的方式 var person={firstname:&q ...

  8. iOS crash log 解析

    iOS开发中,经常遇到App在开发及测试时不会有问题,但是装在别人的设备中会出现各种不定时的莫名的 crash,因为iOS设备会保存应用的大部分的 crash Log,所以可以通过 crash Log ...

  9. 20180209-os模块

    下面将学习关于os模块的相关操作 项目练习的目录结构如下:所有的操作都是基于os_exercise.py模块 1.获取当前的Python脚本的工作目录路径 os.getcwd() # 1.获取当前目录 ...

  10. 理解Thread.sleep()函数

    转载自:http://www.cnblogs.com/ILove/archive/2008/04/07/1140419.html 我们可能经常会用到 Thread.Sleep 函数来使线程挂起一段时间 ...