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 ...
随机推荐
- CSS中设置元素的圆角矩形
圆角矩形介绍 在CSS中通过border-radius属性可以实现元素的圆角矩形. border-radius属性值一共有4个,左上.右上.左下.右下. border-radius属性值规则如下:第一 ...
- Java入门 - 语言基础 - 03.基础语法
原文地址:http://www.work100.net/training/java-basic-syntax.html 更多教程:光束云 - 免费课程 基础语法 序号 文内章节 视频 1 第一个Jav ...
- 60 个让程序员崩溃的瞬间,太TM真实了
前方高能!笑死人不偿命系列~ 表演即将开始,吃东西的请停下来,不然你会后悔的 1. 公司实习生找 Bug 2. 在调试时,将断点设置在错误的位置 3. 当我有一个很棒的调试想法时 4. 偶然间看到自己 ...
- ps入门
目标:把运动截图的日期改掉.一次运动,天天装逼! 1 左上角 文件 -> 打开 选中要P的图片 2 CRTL 和 +号 放大 3 摁住空格键就可以用鼠标拖动图片(把要P的部分放到中间) ...
- xlwings excel(四)
前言 当年看<别怕,Excel VBA其实很简单>相见恨晚,看了第一版电子版之后,买了纸质版,然后将其送人.而后,发现出了第二版,买之收藏.之后,发现Python这一编程语言,简直是逆天, ...
- xlwings API Documentation
http://docs.xlwings.org/en/stable/api.html Top-level functions xlwings.view(obj, sheet=None) Opens a ...
- 源码详解系列(七) ------ 全面讲解logback的使用和源码
什么是logback logback 用于日志记录,可以将日志输出到控制台.文件.数据库和邮件等,相比其它所有的日志系统,logback 更快并且更小,包含了许多独特并且有用的特性. logback ...
- C语言寒假大作战01
问题 回答 这个作业属于哪个课程 2019软件四班C语言寒假作业大作战 这个作业要求在哪里 作业要求 我在这个课程的目标是 gitee 与 git基础命令学习与使用 这个作业在那个具体方面帮助我实现目 ...
- 关于基本布局之——Flex布局
Flex布局 1.Flex为"Flexible Box"的简称,即为弹性布局,可作用于任何容器上.给div这类块状元素元素设置display:flex或者给span这类内联元素设置 ...
- Linux基础:简介安装、常用命令和JDK、Mysql、Tomcat的安装
一.Linux的简介 1.Linux的概述 Linux是基于Unix的开源免费的操作系统,由于系统的稳定性和安全性几乎成为程序代码运行的最佳系统环境.Linux是由Linus Torvalds(林纳斯 ...