linux内核源码——内存管理:段页式内存及swap
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的更多相关文章
- linux 内核源代码情景分析——i386 的页式内存管理机制
可以看出,在页面目录中共有210 = 1024个目录项,每个目录项指向一个页面表,而在每个页面表中又共有1024个页面描述项. 由图看出来,从线性地址到物理地址的映射过程为: 1)从CR3取得页面目录 ...
- Linux内核源码分析 day01——内存寻址
前言 Linux内核源码分析 Antz系统编写已经开始了内核部分了,在编写时同时也参考学习一点Linux内核知识. 自制Antz操作系统 一个自制的操作系统,Antz .半图形化半命令式系统,同时嵌入 ...
- linux内核源码注解
轻松学习Linux操作系统内核源码的方法 针对好多Linux 爱好者对内核很有兴趣却无从下口,本文旨在介绍一种解读linux内核源码的入门方法,而不是解说linux复杂的内核机制:一.核心源程序的文件 ...
- Linux内核源码分析--内核启动之(3)Image内核启动(C语言部分)(Linux-3.0 ARMv7)
http://blog.chinaunix.net/uid-20543672-id-3157283.html Linux内核源码分析--内核启动之(3)Image内核启动(C语言部分)(Linux-3 ...
- 和菜鸟一起学linux内核源码之基础准备篇
来源:http://blog.csdn.net/eastmoon502136/article/details/8711104 推荐阅读:linux内核源码最初版linux内核源代码,简单易懂,适合初学 ...
- Linux内核源码特殊用法
崇拜并且转载的: http://ilinuxkernel.com/files/5/Linux_Kernel_Source_Code.htm Linux内核源码特殊用法 1 前言 Linux内核源码主要 ...
- Linux内核源码分析之setup_arch (二)
1. 概述 接着上一篇<Linux内核源码分析之setup_arch (一)>继续分析,本文首先分析arm_memblock_init函数,然后分析内核启动阶段的是如何进行内存管理的. 2 ...
- Linux内核源码分析之setup_arch (三)
1. 前言 在 Linux内核源码分析之setup_arch (二) 中介绍了当前启动阶段的内存分配函数memblock_alloc,该内存分配函数在本篇将要介绍paging_init中用于页表和内存 ...
- Linux内核源码分析之setup_arch (四)
前言 Linux内核源码分析之setup_arch (三) 基本上把setup_arch主要的函数都分析了,由于距离上一篇时间比较久了,所以这里重新贴一下大致的流程图,本文主要分析的是bootmem_ ...
随机推荐
- rssi pdf 单双峰正态发布 与 定位
- 140、spring webflux 高并发的spring组件
最近公司可谓是风云变幻,年前说要拆开卖,后来说要整体卖,表示像我这种渣渣,始终逃脱不掉被卖的命运 下面进入正题 spring webflux 是spring 支持的高并发web框架,将每个http请求 ...
- RESTful_URI资源
目录 目录 RESTful的资源 URI 标识资源 URL 定位资源 URI与URL的区别 为什么使用资源的概念 对资源的操作 URI的设计 RESTful的资源 在RESTful基础知识篇中,介绍了 ...
- Vagrant 官网文档翻译汇总
入门 Vagrant 入门 - 项目设置 Vagrant 入门 - box Vagrant 入门 - 启动 vagrant 及 通过 ssh 登录虚拟机 Vagrant 入门 - 同步目录(synce ...
- 第 1 章 前端之html
一.html初始 1.web服务本质 import socket def main(): sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM ...
- Python笔记(二十)_多态、组合
多态 对于函数中的变量,我们只需要知道它这个变量是什么类,无需确切地知道它的子类型,就可以放心地调用类的方法,而具体调用的这个方法是作用在父类对象还是子类对象上,由运行时该对象的确切类型决定,这就是多 ...
- Convolutional Neural Networks(3):Convolution and Channels
在CNN(1)和CNN(2)两篇文章中,主要说明的是CNN的基本架构和权值共享(Weight Sharing),本文则重点介绍卷积的部分. 首先,在卷积之前,我们的数据是4D的tensor(width ...
- 03 synchronized
synchronized 1. 锁机制的特性 互斥性:在同一时间只允许一个线程持有某个对象锁(原子性) 可见性:必须确保在锁被释放之前,对共享变量所在的修改,对于随后获得该锁的另一个线程是可见的 2. ...
- JVM(14)之 类加载机制
开发十年,就只剩下这套架构体系了! >>> 从本篇博文开始,我们就进入虚拟机类加载机制的学习了.那么什么是类加载呢?当我们写完一个Java类的时候,并不是直接就可以运行的,它还要 ...
- JavaScript中正则使用
字符串是编程时涉及到的最多的一种数据结构,对字符串进行操作的需求几乎无处不在.比如判断一个字符串是否是合法的Email地址,虽然可以编程提取@前后的子串,再分别判断是否是单词和域名,但这样做不但麻烦, ...