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分配的是非连续的物理内存。

时间: 2024-12-24 23:53:27

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

Linux内核分析(四)----进程管理|网络子系统|虚拟文件系统|驱动简介

Linux内核分析(四) 两天没有更新了,上次博文我们分析了linux的内存管理子系统,本来我不想对接下来的进程管理子系统.网络子系统.虚拟文件系统在这个阶段进行分析的,但是为了让大家对内核有个整体的把握,今天还是简单的介绍一下剩余的几个子系统,我们对这几个子系统的分析,只要了解其作用和部分内容即可,不必深究,等我们写上几个驱动,到时候按照驱动再来分析这几个子系统我们就清晰多了. 在http://www.cnblogs.com/wrjvszq/p/4257164.html一文我们提到过linux

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

1.页 芯作为物理页存储器管理的基本单元,MMU(内存管理单元)中的页表,从虚拟内存的角度来看,页就是最小单位. 内核用struct page结构来标识系统中的每个物理页.它的定义例如以下: flag域用来存放页的状态(是不是脏的.是不是被锁定在内存中等等)._count表示这一页被引用了多少次.当次数为0时,表示此页没有被引用,于是在新的分配中就能够使用它.virtual域是页的虚拟地址. 2.获得页 内核提供了一种请求内核的底层机制,并提供了对它进行訪问的几个接口. 全部这些接口都以页为单位

Linux内核分析——第一章 Linux内核简介

第一章   Linux内核简介 一.Unix的历史 1.Unix系统成为一个强大.健壮和稳定的操作系统的根本原因: (1)简洁 (2)在Unix中,很多东西都被当做文件对待.这种抽象使对数据和对设备的操作都是通过一套相同的系统调用借口来进行的:open(),read(),write(),lseek()和close(). (3)Unix的内核和相关的系统工具软件是用C语言编写而成.(移植能力) (4)进程创建非常迅速,并且有一个非常独特的fork()系统调用. (5)Unix提供了一套非常简单但又

linux内核分析之文件系统

linux内核分析之文件系统 linux内核分析之文件系统 一文件系统的安装和卸载分析 1 文件系统的安装 11 总领提纲 12 代码分析 13 实例考察path_walk 2 文件系统的卸载 21 提纲 22 代码分析 二问答归纳 1 问题 2 回答 三文件的打开 1打开文件的本质 2打开文件的过程 四文件创建 1 文件创建的过程 2 关于文件创建的理解 一.文件系统的安装和卸载分析 1.1 文件系统的安装 1.1.1 总领提纲 文件系统的安装过程中,有几个重要的数据结构: file_syst

《Linux内核分析》期中总结

                             <Linux内核分析>期末总结                                                                            20135109 高艺桐 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000  一.博客地址汇总 第一周学习笔记计算机是如何工作的 第二周学习笔记深入理解计算机 第三

[转]linux内核分析笔记----内存管理

转自:http://blog.csdn.net/Baiduluckyboy/article/details/9667933 内存管理,不用多说,言简意赅.在内核里分配内存还真不是件容易的事情,根本上是因为内核不能想用户空间那样奢侈的使用内存. 先来说说内存管理.内核把物理页作为内存管理的基本单位.尽管处理器的最小可寻址单位通常是字,但是,内存管理单元MMU通常以页为单位进行处理.因此,从虚拟内存的交代来看,页就是最小单位.内核用struct  page(linux/mm.h)结构表示系统中的每个

linux内核分析 第三周 构造一个简单的Linux系统MenuOS

一.计算机的三个法宝 存储程序计算机,函数调用堆栈,中断二.操作系统的两把剑:1.中断上下文的切换,保存现场和恢复现场2.进程上下文的切换. 三.linux内核源代码的分析: ·arch/目录保存支持多种CPU类型的源代码,重点是x86·init目录:含有main.c,内核启动相关的代码基本都在init目录下·ipc目录:进程间的通信·kernel目录:有Linux内核的核心代码.四.构造一个简单的Linux系统 使用实验楼的虚拟机打开shell 1.cd LinuxKernel/2.qemu

20135327郭皓--Linux内核分析第三周 构造一个简单的Linux系统MenuOS

Linux内核分析第三周  构造一个简单的Linux系统MenuOS 前提回顾 1.计算机是如何工作的三个法宝 1.存储程序计算机 2.函数调用堆栈 3.中断 2.操作系统的两把宝剑 中断上下文的切换 进程上下文的切换 第一讲  Linux内核源代码介绍 arch目录包括了所有和体系结构相关的核心代码.它下面的每一个子目录都代表一种Linux支持的体系结构,例如i386就是Intel CPU及与之相兼容体系结构的子目录.PC机一般都基于此目录. init目录包含核心的初始化代码(不是系统的引导代

Linux内核分析 笔记三 构造一个简单的Linux系统MenuOS ——by王玥

一.知识点总结 (一)Linux源代码简介 arch/x86目录下的代码是我们重点关注的 内核启动相关代码都在init目录下 start_kernel函数相当于普通C程序的main函数 linux的核心代码都在kernel目录中 arch/ 支持不同cpu的源代码 Documentations/ 文档存储 init/ 内核启动相关代码 kenerl/ 进程调度相关代码 ipc/ 进程间通信 lib/ 公共库文件 mm/ 内存管理相关的代码 (二)构造一个简单的Linux系统 启动MenuOS系统