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. SQL element_at函数

    库里有类似josn形式的字符串数据attr{"a":"123","b":"234"."c":&quo ...

  2. Oracle 数据库优化

    Oracle 数据库优化 参考网址

  3. Borland C++ Builder 编译绿色Exe程序

    按照“打开Project/Option 翻到Packages页,去掉Build with runtime packages前面的勾. http://www.jinyuanbao.cn翻到Linker页 ...

  4. Centos安装GD库

    tar zxvf ncurses-5.6.tar.gz 进入目录 cd ncurses-5.6 生成 makefile文件,再进一步编译 ./configure --prefix=/usr --wit ...

  5. State Hook

    1 useState函数的第一个参数,是state变量的初始值. 2 每次渲染时,多个State Hook的顺序.数量都是一样的.(不能多.不能少) 3 state变量是只读的 4 state变量发生 ...

  6. Reading query string values in JavaScript

    时间 2016-01-23 13:01:14  CrocoDillon’s Blog 原文  http://crocodillon.com/blog/reading-query-string-valu ...

  7. Spring cloud学习--Zuul01

    Zuul解决的问题 作为系统的统一入口,屏蔽了系统内部各个微服务的细节 可以与微服务治理框架结合,实现自动化的服务实例维护以及负载均衡的路由转发 实现接口权限校验与微服务业务逻辑的解耦 搭建Zuul服 ...

  8. Java并发编程:线程的创建

    Java并发编程:线程的创建 */--> code {color: #FF0000} pre.src {background-color: #002b36; color: #839496;} J ...

  9. Codeforces Round #535 (Div. 3) F

    F. MST Unification 题目传送门 题意: 给你n个顶点,m条边:保证没有重边,其中存在多个MST(最小生成树), 你可以修改一些边的权值,让其中有且仅有一个最小生成树,求最少操作的边数 ...

  10. python学习第十五天字典的创建及增删改查操作方法

    字典是python比较常见的数据类型,跟列表一样,比如的字典的创建,字典的常见的操作的方法,增加,删除,修改,查找等方法,字典的一共的数据方法为 keys()  values() fromkeys() ...