原文:Linux内核分析(三)----初识linux内存管理子系统

Linux内核分析(三)

昨天我们对内核模块进行了简单的分析,今天为了让我们今后的分析没有太多障碍,我们今天先简单的分析一下linux的内存管理子系统,linux的内存管理子系统相当的庞大,所以我们今天只是初识,只要对其进行简单的了解就好了,不会去追究代码,但是在后面我们还会对内存管理子系统进行一次深度的分析。

在分析今天的内容之前,我们先来看出自http://bbs.chinaunix.net/thread-2018659-2-1.html的一位大神做的内存管理图,真心佩服大神。其实这张图可以分为两个部分,一部分是地址映射,另一部分就是内存分配。

所以今天我们会分析到以下内容:

1.      Linux地址映射

2.      Linux内存分配

Linux地址映射

下面的分析我们依据上图进行分析,首先我们来看其最右边的地址分布图(当然这是虚拟空间)。其地址分布总的可以分为两个部分我们下面慢慢分析(基于32位处理器)。

1.       用户空间(0~3G

a)      空间简介

其从0x00000000到0xBFFFFFFF共3GB的线性地址空间,每个进程都有一个独立的3GB用户空间,当然这是虚拟的空间。

b)      如何转换为物理空间

这一部分虚拟空间到物理空间的转换方法是我们以前在http://www.cnblogs.com/wrjvszq/p/4246634.html一文中分析过的MMU地址转换。

2.       内核空间(3~4G

其从0xC0000000到0xFFFFFFFF共1GB大小,内核空间又可以根据映射方式的不同分为下面四块,我们一一分析

a)        内核逻辑地址空间

空间简介

其从0xC0000000到high_memory(图中896MB的地方)最大为896MB(也就是说这块空间有可能不满,但最大为896MB),当然是虚拟空间。

注:在此注意一下896MB我们一会在分析。

如何转换为物理空间

这一部分虚拟地址与物理内存中对应的地址只差一个固定偏移量(3G),如果内存物理地址空间从0x00000000地址编址,那么这个固定偏移量就是PAGE_OFFSET(如上图)。

b)        Vmalloc空间

空间简介

其地址没有严格的界限,这段空间既可以访问到我们的高端内存,也可以访问到低端内存。(高端和低端一会解释)

如何转换为物理空间

不是通过简单的线性关系映射,在此不研究。

c)        永久内核映射

空间简介

其固定用来访问高端内存。

如何转换为物理空间

不是通过简单的线性关系映射,在此不研究。

d)        固定映射

空间简介

其在系统初始化期间永久映射I/O地址空间,或者特殊的寄存器。

3.       遗留知识

在刚才我们前面的分析中我们留下了一些问题下面进行解释。

a)        低端内存

内核逻辑地址空间所映射的物理内存就是低端内存(实际物理内存的大小,但是小于896MB)

b)        高端内存

低端内存地址之上的物理内存是高端内存(物理内存896MB之上)。

c)        896MB来由

Linux将内存分为内核空间和用户空间,其中内核空间中的0xC0000000~high_memory部分用来映射物理内存,但是我们还需要映射I/O空间和固定的寄存器,所以留出了high_memory~0xFFFFFFFF之间的地址来映射I/O空间和固定的寄存器,而在X86平台根据经验设定了这个high_memory为896MB。

Linux内存分配

通过上面的介绍我们对linux对内存的管理,以及地址的映射有了一个了解,下面我们来分析linux是如何进行内存分配的。

通过上图我们可以分析出内存的分配过程

1.        由malloc、fork等系统调用和kmalloc、vmalloc申请得到虚拟内存。

2.        在我们使用该内存的时候,产生请页异常(kmalloc除外)

3.        从空闲的页框分配物理内存,和虚拟地址建立映射。

注:kmalloc申请空间是不用经过请页异常的,返回的虚拟地址已经对应了物理内存。Kmalloc可以分配到连续的物理内存,vmalloc分配的是非连续的物理内存。

Linux内核分析(三)----初识linux内存管理子系统相关推荐

  1. linux内核编程13期:内存管理

    内管管理子系统是Linux内核中比较复杂的一个模块,也是很多Linux开发者的"梦魇",无论是Linux新手.运维.应用开发者,还是有多年经验的驱动工程师,在学习内存管理时,面对错 ...

  2. linux内核分析 网络九,“Linux内核分析”实验报告(九)

    一 Linux内核分析博客简介及其索引 本次实验简单的分析了计算机如何进行工作,并通过简单的汇编实例进行解释分析 在本次实验中 通过听老师的视频分析,和自己的学习,初步了解了进程切换的原理.操作系统通 ...

  3. 《Linux内核设计与实现》内存管理札记

    1.页 芯作为物理页存储器管理的基本单元,MMU(内存管理单元)中的页表,从虚拟内存的角度来看,页就是最小单位. 内核用struct page结构来标识系统中的每个物理页.它的定义例如以下: flag ...

  4. 《深入理解Linux内核》笔记5:内存管理

    本文介绍内核如何给自己分配物理内存并管理.对应<深入>第8章. 在<深入>第2章"内存寻址"(或者是我博客中的这篇文章,点这里)中,已经介绍了内核如何给自己 ...

  5. Linux内核分析考试试题,linux内核分析第二周作业

    #include #include "mypcb.h" extern tPCB task[MAX_TASK_NUM]; extern tPCB * my_current_task; ...

  6. linux内核启动分析 三,Linux内核分析 实验三:跟踪分析Linux内核的启动过程

    贺邦 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程 http://mooc.study.163.com/course/USTC-1000029000 一. 实验过程 ...

  7. linux内存管理子系统采用基于内存区域,Linux 内存管理之highmem简介

    一.Linux内核地址空间 一般来说Linux 内核按照 3:1 的比率来划分虚拟内存(X86等):3 GB 的虚拟内存用于用户空间,1GB 的内存用于内核空间.当然有些体系结构如MIPS使用2:2 ...

  8. Linux内核的各个组成部分,Linux 内核的组成部分

    linux内核主要由进程调度(SCHED).内存管理(MM).虚拟文件系统(VFS).网络接口(NET).和进程间通信(IPC)等5个子系统组成 他们的关系如下图 所示: 1.进程间调度: 精度调度控 ...

  9. linux内核x86内存,Linux内核在X86上的虚拟内存管理

    前言 Linux支持很多硬件运行平台,常用的有:Intel X86,Alpha,Sparc等.对于不能够通用的一些功能,Linux必须依据硬件平台的特点来具体实现.本文的目的是简要探讨Linux在X8 ...

最新文章

  1. C++ 与 JAVA区别
  2. RESTful Web Services初探
  3. NXT(未来币)(阿朵)节点钱包
  4. Windows Phone 7 开发资源汇总
  5. 三体智能革命_《三体》之人类的科技文明发展历史其实很诡异
  6. Http协议(2)—客户端的识别与cookie机制
  7. 数学家看到就把持不住,高斯被它迷得神魂颠倒,2600年的数学史里的一个奇迹……...
  8. std::string的resize()与reserve()的区别
  9. 3大AI事件入围百度2017科技热搜,柯洁对战AlphaGo排名第一
  10. 蓝绿部署、滚动发布、灰度发布等方案对比总结
  11. 使用Visual Studio进行单元测试-Part4
  12. 计算机文化基础考试 名词解释,《计算机文化基础》模拟试卷.doc
  13. 今日头条正式发布小程序
  14. linux教学之安装python与pip环境
  15. 【IDEA/SVN】IDEA 从SVN导入项目到本地
  16. 施耐德 m340 编程手册_M251M340在自动化立体仓储的应用
  17. 飞机大战源码php,飞机大战源码 - 丁小未的个人页面 - OSCHINA - 中文开源技术交流社区...
  18. C++Comb Sort梳排序的实现算法(附完整源码)
  19. VirtualBox+CentOS6.5安装增强功能包 - Building the main Guest Additions module [失败]
  20. len计算机语言,python中len的使用方法

热门文章

  1. 李宏毅机器学习课程4~~~分类:概率生成模型
  2. OpenCV自带dnn的Example研究(3)— object_detection
  3. js获取页面的各种高度与宽度
  4. laravel 分页
  5. 最详细的java泛型详解
  6. Ansible基础概述
  7. Podfile grammar
  8. 21、python基础学习-new_three_menu
  9. Effective Java(1)-创建和销毁对象
  10. mac上安装Chromedriver注意事宜