Linux内存管理解析(二) : 关于Linux内存管理的大体框架
什么是内存管理 ?
首先内存管理管理的主要对象是虚拟内存,但是虚拟内存对应的映射主要为物理内存,其次也可能通过交换空间把虚拟内存与硬盘映射起来,既然如此,那我们先了解物理内存的管理。
对于物理内存而言,首先我们需要知道的是,linux x86体系结构中内核主要处于 0 - 1G(物理地址)中。而物理内存是有限的。但我们又要为每个程序提供相互独立且连续的内存空间。正因如此我们引出了虚拟内存。
什么是虚拟内存?
虚拟内存 是 段寄存器:段变址寄存器 结合的结果。但是仅仅依赖这两个寄存器并不能得到什么有效的东西。要得到线性地址我们需要依赖分段机制。要得到物理地址我们需要分页机制。简而言之,虚拟地址+分段机制的映射得到线性地址,线性地址+分页机制的映射得到物理地址(实际上这个映射到物理地址都是依赖MMU(内存管理单元)来寻址的)。
如何利用虚拟地址保证每个进程都拥有独立且连续的内存空间呢?
在Linux中,基本上没怎么依赖分段机制来实现,主要是依赖分页机制。为什么这么说呢?因为对于除特定的进程之外的各个段描述符(一个进程可以有多个段,例如代码段,数据段等)的段基址都是从0开始的(也就是说在这里 逻辑地址 = 线性地址)。
至于如何利用分页机制来实现虚拟内存这个问题,就需要很长的讨论了,我们不妨简单的先概述一下:

对于每个进程而言,都有4G的虚拟内存,每个进程都用 task_struct(进程描述符) 来描述,每个进程的虚拟内存都用 mm_struct(虚拟内存区域描述符) 来描述,对于每个进程而言,都有自己的页全局目录,页全局表指向一个中间页目录(页目录表),而每个页目录项指向一个页表,其实这个所谓的页全局表在x86体系结构中也就是 CR3,而修改CR3的值,就能切换整个页目录,也就达到了切换虚拟内存的作用。对于一个进程而言,并不是所有的4G虚拟地址都是在进程初始化的时候就分配,而是在进程运行时,如若需要分配才动态分配,但分配地址其实就是修改页表项,使得当前进程的虚拟地址映射到物理地址。
在linux中进程有两种形态,第一种是用户态,第二种是内核态。只有在内核态的时候才能访问内核的数据和得到某些权限(io操作权限),于是linux把虚拟内存页分为了两块 : 用户空间和内核空间。
虚拟内存的划分(对于每个进程而言,用户空间映射的物理内存才是自己私有的内存,内核空间映射的物理内存是大家共享的):
虚拟内存在linux中被划分为两个部分 :
内核空间 : 虚拟内存为 3 - 4G 被作为 内核空间(内核空间几乎都是线性映射, 即 物理内存 = 虚拟内存 - 3G)
用户空间 : 虚拟内存为 0 - 3G 被作为 用户空间
既然内核被划分为两个部分,且内核空间和用户空间有很大的不同,于是就必须要用两种管理方式。但无论是内核空间内存管理还是用户空间内核管理,其实都是内核来管理的(用户进程对于如何管理内存是没有权限的)!区别在于是内核管理内核空间还是内核管理用户空间。
内核管理内核空间:
我们之前说过 : 内核主要处于 0 - 1G(物理地址)中,而我们对 0 - 1G 物理内存也进行了一个分区 :

而 0 - 896M是内核在初始化的时候就已经映射到内核空间 3G -- 3G + 896M上了,且满足 物理内存 = 虚拟内存 - 3G。
为什么要设立三个分区?
ZONE_DMA : 为了兼容某些只能直接内存访问(也就是不通过MMU进行分段和分页),例如ISA设备只能访问物理内存的前16MB。
ZONE_NORMAL : 这部分已经很早就映射了。
ZONE_HIGHMEM : 为了解决一些体系结构(x86)物理寻址范围大于虚拟地址寻址范围(也就是多出来了物理地址)。于是采取动态映射的方式来利用一些未被映射的页。或者借助128MB高端内存地址空间访问所有物理内存(借一段地址空间,建立临时地址映射,用完后释放,达到这段地址空间可以循环使用,访问所有物理内存)。
Linux内存管理解析(二) : 关于Linux内存管理的大体框架的更多相关文章
- Linux学习之CentOS(二)--初识linux的一些常用命令
Linux学习之CentOS(二)--初识linux的一些常用命令 在VM上安装完了CentOS6.4以后,看着linux系统成功跑起来,心里小激动了一把......但是前方学习的道路还很遥远... ...
- FFMPEG内存操作(二)从内存中读取数及数据格式的转换
相关博客列表: FFMPEG内存操作(一) avio_reading.c 回调读取数据到内存解析 FFMPEG内存操作(二)从内存中读取数及数据格式的转换 FFmpeg内存操作(三)内存转码器 在雷神 ...
- DPDK内存管理-----(二)rte_mempool内存管理
DPDK以两种方式对外提供内存管理方法,一个是rte_mempool,主要用于网卡数据包的收发:一个是rte_malloc,主要为应用程序提供内存使用接口.本文讨论rte_mempool.rte_me ...
- 教老婆学Linux运维(二)Linux常用命令指南【上】
目录 教老婆学Linux(二)Linux常用命令指南[上] 一.概述 二.常用命令 教老婆学Linux(二)Linux常用命令指南[上] 作者:姚毛毛的博客 tips:文章太长,分两篇发出,本篇发前三 ...
- 教老婆学Linux运维(二)Linux常用命令指南【下】
目录 tips:紧接上一篇,Linux常用命令指南[上] 2.4 文件解压缩 2.4.1 官宣的linux压缩工具:tar tar的基本命令格式为 tar [参数选项] [文件或目录] 我们前面学的命 ...
- Linux学习之CentOS(二)--初识linux的一些常用命令(基础命令)
初次学习linux系统,首先也得会一些linux的基本命令.至少要先学会开启和关闭系统吧!我称为 基础命令! linux命令是对Linux系统进行管理的命令.对于Linux系统来说,无论是中央处理器. ...
- linux进阶之路(二):linux文件目录
Linux的目录结构: Linux文件系统采用级层式的目录结构,最上层是根目录"/",在此目录下再创建其他目录. 树状的文件目录.再Linux世界,一切皆文件. /etc 所有系统 ...
- Linux系列教程(二)——Linux系统安装(手把手学安装centos6.8)
在上一篇博客我们简单的介绍了Linux系统的起源,这篇博客我们将通过图示一步一步教大家如何安装Linux系统.注意这里我们选择安装的Linux系统是其一种发行版本 CentOS,这里给大家普及一个概念 ...
- Linux常用命令(二)之权限管理、文件搜索、帮助、压缩命令及管道
在(一)中提到过rwx的含义,但是我们还需深入理解,明白其真正的含义和权限,对于文件和目录,rwx权限是不同的,尤其是目录的权限往往是被忽略的: 对于目录,其权限和对应的操作: r-ls w-touc ...
随机推荐
- 创建一个区域(Creating an Area) |使用区域 | 高级路由特性 | 精通ASP-NET-MVC-5-弗瑞曼
摘自:http://www.cnblogs.com/chenboyi081/p/4472709.html#tar2015050302 下面的AdminAreaRegistration继承自AreaRe ...
- crtmpserver服务器的搭建
https://blog.csdn.net/wutong_login/article/details/7612477 https://www.cnblogs.com/wangqiguo/p/60145 ...
- volatile梳理
volatile 可见性也就是说一旦某个线程修改了该被volatile修饰的变量,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,可以立即获取修改之后的值. 在Java中为了加快程序的运行 ...
- 关于基本布局之——Flex布局
Flex布局 1.Flex为"Flexible Box"的简称,即为弹性布局,可作用于任何容器上.给div这类块状元素元素设置display:flex或者给span这类内联元素设置 ...
- Linux(Centos)安装tomcat并且部署Java Web项目
步骤一.下载安装包 a. 下载tomcat linux安装包,地址:http://tomcat.apache.org/download-80.cgi , 我们下载的版本是8.0,下载方式如图: b ...
- 快速理解 VUEX 原理
1. vuex 的作用: vuex其实是集中的数据管理仓库,相当于数据库mongoDB,MySQL等,任何组件都可以存取仓库中的数据. 2. vuex 流程和 vue 类比: 我们看一下一个简单的vu ...
- 物流跟踪API-快递单订阅
上一篇文章我们讲解了轨迹查询的接口,通过快递鸟接口可以实现实时查询物流轨迹,这次给大家推荐订阅服务功能. 为了更好的理解订阅服务,我们来做个对比, 即时查询是主动查询物流轨迹,需要我们主动调用接口才能 ...
- Sophus库CMakeLists.txt内容详解笔记
CMakeLists.txt: SET(PROJECT_NAME Sophus) PROJECT(${PROJECT_NAME}) CMAKE_MINIMUM_REQUIRED(VERSION 2.6 ...
- golang学习笔记(二):流程控制
欢迎访问我的博客和github! 今天咱们把烦人的事情丢一丢,继续来学习go的基础知识. 这篇文章记录go语言的流程控制和更多类型. 流程控制 for Go 只有一种循环结构:for 循环. 基本的 ...
- cookie理解与实践【实现简单登录以及自动登录功能】
cookie理解 Cookie是由W3C组织提出,最早由netscape社区发展的一种机制 http是无状态协议.当某次连接中数据提交完,连接会关闭,再次访问时,浏览器与服务器需要重新建立新的连接: ...