linux虚拟地址空间管理,Linux内存管理4---虚拟地址空间管理

1.前言

本文所述关于内存管理的系列文章主要是对陈莉君老师所讲述的内存管理知识讲座的整理。

本讲座主要分三个主题展开对内存管理进行讲解:内存管理的硬件基础、虚拟地址空间的管理、物理地址空间的管理.

本文将主要以X86架构为例来介绍虚拟地址空间的管理。

2.虚拟地址空间展示

9933dcb4fa710a66ccd672318d0988e8.png

图 进程地址空间

程序一旦被执行就成为一个进程,内核就会为每个运行的进程提供了大小相同的虚拟地址空间,这使得多个进程可以同时运行而又不会互相干扰

具体来说一个进程对某个地址的访问,绝不会干扰其他进程对同一地址的访问。

每个进程都拥有4GB(32位)大小的虚拟地址空间,每个进程都拥有私有的前3G空间,即“用户空间”;而后1G空间被每个进程所共享,即“内核空间”。

进程访问内核空间的唯一途径为系统调用。

在每个进程眼中,它们各自拥有4GB大小的地址空间;而在CPU眼中,任意时刻,一个CPU上只存在一个虚拟地址空间。虚拟地址空间随着进程间的切换而变化。

3.虚拟内存实现机制

3fd9b23dfcd0154230a0dfb50fc8f790.png

图 虚拟内存实现机制

地址映射

可执行文件从磁盘映射到虚拟地址空间

虚拟地址空间映射到物理地址空间

请页

将可执行文件从磁盘调入物理内存

内存的分配与回收

缓存和刷新

交换机制

把内存的内容换到磁盘,把磁盘内容换到内存,需要用到文件系统

4. 进程地址空间布局图

d55cb05782252d7cedeb584c55de8bd2.png

图 进程地址空间布局图

Linux把进程的地址空间划分为多个区间,这些区间称为虚拟内存区域(VMA)

可以通过cat /proc/进程号/maps来查看进程的地址空间布局

bffead57570de67468b9fb05a90f9941.png

图 mymmap可执行文件的内存布局

5. 进程用户空间的描述

一个进程的用户地址空间主要由mm_struct结构和vm_area_structs结构来描述

mm_struct结构对进程整个用户空间进行描述

mm_area_structs结构对用户空间中各个内存区进行描述

mm_struct内存描述符基本字段

fa6b792cb5649b55df5cd94251db8618.png

图 内存描述符基本字段

vm_area_structs主要字段

53ab86398670e762b54d0487ca216867.png

图 vm_area_structs主要字段

6. 相关数据结构之间的关系

b58499705f74595513e38bde3575d9b9.png

图 相关数据结构之间的关系

进程在内核中通过task_struct结构体进行描述

task_struct->mm指向与该进程用户空间对应的mm_struct结构体

mm_struct->mmap指向VMA双链表

使用current->mm->mmap可获得VMA链表的头指针

current->mm->mmap->vm_next获得指向该VMA双链表的下一个结点的指针

7. 新建虚拟内存区域

cb23e6e40e0ebd85b3a48ba4cd84aa80.png

图 mmap()和do_mmap()

在内核空间通过do_mmap()创建一个新的虚拟内存区域

在用户空间通过mmap()系统调用获取do_mmap()的功能

8.内存映射

内存映射

把文件从磁盘映射到进程用户空间的一个虚拟内存区域中,对文件的访问转化为对虚存区的访问。

当从这段虚拟内存中读数据时,就相当于读磁盘文件中的数据,将数据写入这段虚拟内存时,则相当于将数据直接写入磁盘文件。

这样就可以在不使用基本I/O操作函数read和write的情况下执行I/O操作。

有共享的、私有的虚存映射和匿名映射

mmap()函数

8c82486bf78ea12e3ce9a7d1fad25ae4.png

图 mmap函数说明

mmap的演示

如下实现了将磁盘文件mapping_file.txt映射到进程的虚拟用户空间,通过修改首字符,实现对文件的读写

6e4c7021682c8e757fd4dfdb3a3481c5.png

图 mmap的演示

9.虚拟内存与物理内存

(1)用户态的程序经过编译执行形成进程,进程虽然可以任意访问整个用户空间的内存,但这毕竟属于虚拟地址空间,因此进程最终必须访问到物理内存。

(2)将虚拟内存和物理内存连接起来的就是分页机制,它在虚拟地址和物理地址之间建立了一种映射关系。

(3)进程访问的是虚拟地址,虚拟地址通过页表的转换最终形成物理地址。如果某个虚拟地址在页表中并不存在和某个物理地址之间的映射,那么系统将发生一次缺页异常。

(4)当一个进程运行时,CPU访问的地址是用户空间的虚拟地址。Linux采用请页机制来节约物理内存,也就是说它仅仅将当前要使用的用户空间中少量页装入物理内存。

(5)当访问的虚拟内存页面尚未装入物理内存时,处理器将产生一个缺页异常。当发生缺页异常时,操作系统必须从磁盘或交换文件中将要访问的页装入物理内存。

10. 参考文献

9dcaf042beb03e7e0a072ee62f4a0641.png

[7].GNU的C语言,http://www.faqs.org/docs/learnc/

[8].GCC参考手册

Linux进程虚拟地址空间管理2

2017-04-12 前篇文章对Linux进程地址空间的布局以及各个部分的功能做了简要介绍,本文主要对各个部分的具体使用做下简要分析,主要涉及三个方面:1.MMAP文件的映射过程 2.用户 内存的动态 ...

linux内核分析之进程地址空间管理

1.struct task_struct 进程内核栈是操作系统为管理每一个进程而分配的一个4k或者8k内存大小的一片内存区域,里面存放了一个进程的所有信息,它能够完整的描述一个正在执行的程序:它打开的 ...

【转】 linux内存管理

一 为什么需要使用虚拟内存 大家都知道,进程需要使用的代码和数据都放在内存中,比放在外存中要快很多.问题是内存空间太小了,不能满足进程的需求,而且现在都是多进程,情况更加糟糕.所以提出了虚拟内存,使得 ...

linux内存管理(repost)

一 为什么需要使用虚拟内存 大家都知道,进程需要使用的代码和数据都放在内存中,比放在外存中要快很多.问题是内存空间太小了,不能满足进程的需求,而且现在都是多进程,情况更加糟糕.所以提出了虚拟内存,使得 ...

[国嵌攻略][106][Linux内存管理子系统]

内存管理子系统 1.虚拟地址与物理地址的映射 2.物理内存的分配 Linux虚拟地址空间分布 设备最后访问的一定是物理地址,但Linux系统中使用的都是虚拟地址.虚拟地址简单的来说就是程序中使用的地址 ...

Linux内存管理(一)

Linux内存管理之一:基本概念篇 物理地址.线性地址(虚拟地址)和逻辑地址:阐述段式管理和页式管理基本概念:Linux操作系统内存管理和虚拟内存概念:为内核开发做一个基础铺垫. 内存是linux内核 ...

LInux进程虚拟地址空间的管理

2017-04-07 脱离物理内存的管理,今天咱们来聊聊进程虚拟内存的管理.因为进程直接分配和使用的都是虚拟内存,而物理内存则是有系统“按需”分配给进程,在进程看来,只知道虚拟内存的存在! 前言: 关 ...

linux 内存地址空间管理 mm_struct

http://blog.csdn.net/yusiguyuan/article/details/39520933 Linux对于内存的管理涉及到非常多的方面,这篇文章首先从对进程虚拟地址空间的管理说起 ...

把握linux内核设计思想(十三):内存管理之进程地址空间

[版权声明:尊重原创,转载请保留出处:blog.csdn.net/shallnet.文章仅供学习交流,请勿用于商业用途] 进程地址空间由进程可寻址的虚拟内存组成,Linux 的虚拟地址空间为0~4G字 ...

随机推荐

jenkins无法重启tomcat的原因

在使用Hudson的执行sh脚本的时候,如果sh脚本是一个后台进程,如 Tomcat 这样的服务.如果使用Hudson的默认配置,会发现这些sh 进程有启动的过程,但是不会常驻后台,看Hudson 输 ...

Linux基础介绍【第九篇】

服务器添加3块磁盘的体系结构 [root@oldboylinux test]# free -m              total used free shared buffers cached M ...

C#-WebForm-表单元素

表单元素共12个,分三大类: 文本类: - 文本框

JDBC使用步骤

JDBC编程步骤 加载驱动程序:Class.forName(driverClass) 加载Mysql驱动:Class.forName("com.mysql.jdbc.Driver" ...

窗体移动API

//窗体移动API [DllImport("user32.dll")] public static extern bool ReleaseCapture(); [DllImport ...

JS分割字符串并放入数组的函数

JS分割字符串并放入数组的函数: var InterestKeywordListString = $("#userInterestKeywordLabel").html();  v ...

c# 提取word文件中的图片问题

最近遇到一个项目就是要从一份word中提取出所有的图片信息,功能看起来不是很难,只要使用office自带的Microsoft.Office.Interop.Word就可以解决问题.网上也有不少的文章来 ...

解决No enclosing instance of type * is accessible

写一个内部类,并在构造函数中初始化时,遇到报错,搜索问题后发现,有网友出现过类似的问题,下面这个是说的浅显明白的,并确实解决了问题.于是,以下内容照搬过来,不再多费键盘了. public class ...

零基础学Python--------第8章 模块

第8章 模块 8.1 模块概述 模块的英文是Modules,可以认为是一盒(箱)主题积木,通过它可以拼出某一个主题的东西.这与第6章介绍的函数不同,一个函数相当于一块积木,而一个模块中可以包括很多函数 ...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值