【嵌入式】内存管理,虚拟存储

内存管理介绍

早期的计算机内存容量非常小,当时的PC主要使用DOS操作系统或者其它操作系统。早期的操作系统由于系统硬件的限制,无法支持内存管理,应用程序占用的空间和程序规模都比较小。随着计算机硬件性能不断提高,程序的处理能力也不断提高,应用程序占用的存储空间不断膨胀。实际上,程序的膨胀速度远远超过了内存的增长速度。不断增大的程序规模导致内存无法容纳下所有的程序。

早期程序处理内存不够使用的最直接的办法就是把程序分块。分块的思想是把程序等分成若干个程序块,块的大小足够装入内容即可。

当程序开始执行的时候,首先把第一个程序块装入内存。在程序执行过程中,由操作系统根据程序需要装入后面的程序块。程序分块的思想是虚拟存储器处理方法的前身。


虚拟存储

虚拟存储器的思想是允许程序占用的空间超过内存的大小,把程序划分为大小固定的页,由操作系统根据程序运行的位置把正在执行的页面调入内存,其他未使用的页面则保留在磁盘上。如一个系统有16M字节的内存需要运行32M字节大小的程序,通过虚拟存储技术,操作系统把程序中需要执行的程序段装入内存,程序其他部分存放在磁盘上。当程序运行走出装入内存的部分后,操作系统自动从磁盘加载需要的部分。

虚拟存储技术中,操作系统通过内存页面管理内存空间,在一个操作系统中内存页面的大小是固定的。程序被划分成与内存页面大小相同的若干块,便于操作系统加载程序到内存。操作系统根据内存配置决定一次可以加载多少程序页面到内存。在一个实际的系统中,虚拟存储通常是由硬件(内存管理单元MMU)和操作系统配合完成的。


内存访问顺序

计算机可以访问的地址是有限制的,通常称做有效地址范围。

地址范围的大小与计算机总线宽度有直接关系,如32位总线可以访问的地址范围是0x0~0xFFFFFFFF(4G)空间。

程序可以访问的地址空间与总线支持的地址相同,但是在实际系统中,地址空间所有的地址都是有效的。通常把程序能访问的地址空间称做虚拟地址空间。

在计算机系统上,受到内存空间大小的限制,实际的地址空间远小于虚拟地址空间。可访问的物理内存空间称做物理地址空间。程序访问的虚拟地址空间的地址需要转换为物理地址空间的地址才能访问。

在没有使用虚拟存储技术以前,程序访问的空间就是物理地址空间,访问地址无须转换。使用虚拟存储技术后,程序访问虚拟地址空间的地址需要经过内存管理单元的地址转换机制变换后,得到对应的物理地址才能访问,而转换的过程对用户来说是不可见的。

在进行虚拟地址和实际地址映射的时候,通过查内存表映射到不同的物理内存地址上。

没有MMU的管理,操作系统对内存空间是没有保护的,操作系统和应用程序访问的都是真实的内存物理地址。


地址翻译过程

使用虚拟存储的计算机系统可以提供超过内存地址空间大小的虚拟内存空间。如在64K地址空间的计算机上可以提供1M字节大小的虚拟地址空间。提供超过实际地址空间的虚拟空间后,计算机系统需要通过地址转换才能保证程序正确运行。

实际上,使用虚拟存储的计算机系统中,内存与外部存储器的数据传输也是按照页为单位进行的,从程序运行的角度看,程序可以访问超过实际内存大小的虚拟地址空间,这是由程序运行的局部性原理决定的。程序在运行的时候,在一段时间内总是限定范围的程序段内运行。因此,在程序访问某个虚拟内存空间的时候,可以通过内存管理单元把虚拟地址映射到实际的内存地址,这个过程称做地址翻译过程。

现代计算机体系结构中,地址翻译过程是由内存管理单元完成的。内存管理单元向操作系统提供了配置接口,在系统启动的时候,由操作系统向内存管理单元配置虚拟地址与物理地址之间的转换关系。在程序访问地址的时候由内存管理单元完成地址映射。一般来说,不同的处理器体系结构有不同的地址翻译方法。


访问权限

现代的多用户多进程操作系统,需要MMU才能每个用户进程都拥有自己的独立的地址空间的目标。使用MMU,OS划分出一段地址区域,在这块地址区域中,每个进程看到的内容都不一定一样。

例如Microsoft Windows操作系统,地址4M~2G处划分为用户地址空间。进程A在地址0x400000映射了可执行文件。进程B同样在地址0x400000映射了可执行文件。如果A进程读地址0x400000读到的是A的可执行文件映射到RAM的内容,而进程B读取地址0x400000时则读取到的是B的可执行文件映射到RAM的内容。这个时候就需要访问权限机制来处理不同进程访问同一地址内存的问题。

本文出自 “成鹏致远” 博客,请务必保留此出处http://infohacker.blog.51cto.com/6751239/1200107

(0)

相关推荐

  • 计算机操作系统原理

    最近准备i面试,抽时间回顾一下计算机操作系统原理.  -2018.10.1 1.硬件基础 计算机的构成: 处理器(CPU):主要包括运算器.控制器 内存(主存储器) 输入输出设备 详细的讲,CPU内部 ...

  • CUDA学习笔记-硬件构架

    https://github.com/ArchaeaSoftware/cudahandbook http://www.cudahandbook.com/ 这个是最近全新一版的书 这个是我目前看的书 代 ...

  • 15分钟!一文帮小白搞懂操作系统之内存

    前言 操作系统是一门比较难啃的课程,同时操作系统知识对开发者们来说是十分重要,相信各位在学操作系统的时候,有太多的抽象难以理解的词汇与概念,把我们直接劝退,即使怀着满腔热血的心情学操作系统,不到 3 ...

  • 嵌入式操作系统FreeRTOS内存管理

    FreeRTOS的内存管理和堆的问题.从 V9.0.0 开始,FreeRTOS 应用程序可以完全静态分配,这意味着无需包含堆内存管理器. FreeRTOS内存管理地址: https://www.fre ...

  • 万字整理,肝翻Linux内存管理所有知识点

    Linux的内存管理可谓是学好Linux的必经之路,也是Linux的关键知识点,有人说打通了内存管理的知识,也就打通了Linux的任督二脉,这一点不夸张.有人问网上有很多Linux内存管理的内容,为什 ...

  • 图解 Go 内存管理分配

    GCTT:dust347 Go语言中文网 今天 Illustration created for "A Journey With Go", made from the origin ...

  • Linux 内存管理之vmalloc

    走进vmalloc 根据前面的系列文章,我们知道了buddy system是基于页框分配器,kmalloc是基于slab分配器,而且这些分配的地址都是物理内存连续的.但是随着碎片化的积累,连续物理内存 ...

  • Python一切皆是对象,但这和内存管理有什么关系?

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以点击下方链接自行获取 Python免费学习资料 ...

  • Linux 内存管理之CMA

    什么是CMA CMA是reserved的一块内存,用于分配连续的大块内存.当设备驱动不用时,内存管理系统将该区域用于分配和管理可移动类型页面:当设备驱动使用时,此时已经分配的页面需要进行迁移,又用于连 ...

  • HBase原理|HBase内存管理之MemStore进化论

    Java工程中内存管理总是一个绕不过去的知识模块,无论HBase.Flink还是Spark等,如果使用的JVM堆比较大同时对读写延迟等性能有较高要求,一般都会选择自己管理内存,而且一般都会选择使用部分 ...

  • 看完这篇你还能不懂C语言/C 内存管理?

    C 语言内存管理指对系统内存的分配.创建.使用这一系列操作.在内存管理中,由于是操作系统内存,使用不当会造成毕竟麻烦的结果.本文将从系统内存的分配.创建出发,并且使用例子来举例说明内存管理不当会出现的 ...

  • 操作系统的内存管理算法

    本文主要介绍内存的基本概念以及操作系统的内存管理算法. 嵌入式专栏 1 内存的基本概念 内存是计算机系统中除了处理器以外最重要的资源,用于存储当前正在执行的程序和数据.内存是相对于CPU来说的,CPU ...