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

简介:

内存管理介绍

   早期的计算机内存容量非常小,当时的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的内容。这个时候就需要访问权限机制来处理不同进程访问同一地址内存的问题。





本文转自infohacker 51CTO博客,原文链接:http://blog.51cto.com/liucw/1200107

相关文章
|
4月前
|
存储 分布式计算 Hadoop
HadoopCPU、内存、存储限制
【7月更文挑战第13天】
268 14
|
3月前
|
存储 编译器 C语言
【C语言篇】数据在内存中的存储(超详细)
浮点数就采⽤下⾯的规则表⽰,即指数E的真实值加上127(或1023),再将有效数字M去掉整数部分的1。
295 0
|
5天前
|
存储 C语言
数据在内存中的存储方式
本文介绍了计算机中整数和浮点数的存储方式,包括整数的原码、反码、补码,以及浮点数的IEEE754标准存储格式。同时,探讨了大小端字节序的概念及其判断方法,通过实例代码展示了这些概念的实际应用。
13 1
|
9天前
|
存储
共用体在内存中如何存储数据
共用体(Union)在内存中为所有成员分配同一段内存空间,大小等于最大成员所需的空间。这意味着所有成员共享同一块内存,但同一时间只能存储其中一个成员的数据,无法同时保存多个成员的值。
|
13天前
|
存储 弹性计算 算法
前端大模型应用笔记(四):如何在资源受限例如1核和1G内存的端侧或ECS上运行一个合适的向量存储库及如何优化
本文探讨了在资源受限的嵌入式设备(如1核处理器和1GB内存)上实现高效向量存储和检索的方法,旨在支持端侧大模型应用。文章分析了Annoy、HNSWLib、NMSLib、FLANN、VP-Trees和Lshbox等向量存储库的特点与适用场景,推荐Annoy作为多数情况下的首选方案,并提出了数据预处理、索引优化、查询优化等策略以提升性能。通过这些方法,即使在资源受限的环境中也能实现高效的向量检索。
|
18天前
|
存储 编译器
数据在内存中的存储
数据在内存中的存储
35 4
|
17天前
|
存储 Java
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
这篇文章详细地介绍了Java对象的创建过程、内存布局、对象头的MarkWord、对象的定位方式以及对象的分配策略,并深入探讨了happens-before原则以确保多线程环境下的正确同步。
34 0
JVM知识体系学习四:排序规范(happens-before原则)、对象创建过程、对象的内存中存储布局、对象的大小、对象头内容、对象如何定位、对象如何分配
|
24天前
|
存储 机器学习/深度学习 人工智能
数据在内存中的存储
数据在内存中的存储
|
19天前
|
存储 C语言
深入C语言内存:数据在内存中的存储
深入C语言内存:数据在内存中的存储
|
27天前
|
存储
整型在内存中的存储
本文详细解释了计算机中整型数据的三种二进制表示方法:原码、反码和补码,并展示了如何将正数和负数的原码转换为反码和补码。
35 0