嵌入式linux开发 (三十五) 内存管理3.0(1) linux内存管理之用户空间 相当于 Linux内存管理的引言
上面这篇文章介绍了 linux OS 提供给 应用程序的 (虚拟)地址空间
应用程序的地址空间分6段(其实还可以更多),分别是 code段 ro-data段 data段 bss段 堆 栈
当然这是目前的 linux 现状,那么为什么linux会发展成这个样子,这当然是程序员对程序的要求决定的,
为了满足这些要求,提出了 进程地址空间抽象(1) , 其中 硬件上增加了新的模块MMU(2), 软件上根据MMU的使用手册(3)更新了系统
另外在 进程地址空间抽象 的基础上, 软件上更新了很多新的内存特性(4).
// CPU访问的地址为什么是虚拟地址 ? 而 为什么需要MMU?
1950年代的现状
现状1.0:
1950年代 , 单道处理系统 , 总是加载 用户程序到同一个地址内存管理简单
不需要地址保护
问题1.0:
无法运行比实际物理内存大的程序
只有一个进程,造成资源浪费
进程无法迁移到其他计算机上运行
给出解决方案,升级到现状2.0
现状2.0:
多道处理系统
为了处理多个进程的问题,出现了两种技术
固定分区 动态分区
问题2.0:
进程保护和安全(恶意程序可以修改其他进程数据)
内存使用效率低 // 经常需要换出,而有很多IO
程序地址重定位问题
给出解决方案(进程地址空间抽象),升级到现状3.0 // 需要硬件帮助解决这些问题
处理器引入的新思路
地址空间抽象:
程序代码
栈
堆
将三者的共同体 抽象为一个地址空间
对进程来讲,不需要关心三者具体在哪里,只管分配使用虚拟地址
处理器来对代码请求的虚拟地址转换为物理地址
进程地址空间抽象,让内存虚拟化得到了实现
三大抽象
进程地址空间抽象 // 进程是对处理器 主存 和IO设备的抽象表示
进程对CPU虚拟化 // 虚拟内存是对主存和磁盘IO设备的抽象表示
文件对存储地址空间的抽象 // 文件时对IO设备的抽象表示
进程地址空间抽象 是 组成操作系统的最重要的三个元素之一
处理器引入的新思路(进程地址空间抽象) 对 问题2.0 的解决
隔离性和安全性
进程可以随意访问内存空间,且访问的是虚拟内存
无法访问到另一个进程的物理内存
效率:
分页解决了
重定位:
进程换入换出访问的地址是固定的虚拟地址(链接地址)
进程地址空间抽象 的发展
1.分段
进程地址空间分为几个逻辑段(代码段,数据段,堆,栈),分别放在不同的物理内存区域里面
问题:粒度比较粗糙,导致外部碎片化
2.分页 (分段的改进)
按照固定大小的单元(1帧)来分配内存
现状3.0 // LTS
使能分页机制的处理器里面,cpu能寻址的地址空间叫做虚拟地址空间,地址先发送给MMU,MMU根据分页转换为物理地址
不使能分页机制的处理器里面,cpu直接寻址物理地址,把物理地址直接发送到内存控制器里面
对物理内存和虚拟内存的管理都是按照页帧(4K-1G)为单位来管理的
程序可以任意分配虚拟内存,当要访问或者修改该虚拟地址的时候,操作系统才会为他分配物理内存.
允许管理软件(例如,操作系统(OS))控制提供给软件的内存视图
它可用于将内存分配给具有潜在冲突地址映射的不同进程// 虚拟地址相同,物理地址不同
操作系统可以控制可见的内存,可见的虚拟地址以及允许对该内存进行的访问
允许操作系统对应用程序进行沙箱处理(将一个应用程序的资源与另一应用程序隐藏在一起)并提供来自底层硬件的抽象。
操作系统可以将内存的多个碎片物理区域作为单个连续的虚拟地址空间呈现给应用程序 // 虚拟地址连续,物理地址不连续
软件开发人员在编写应用程序时不会知道系统的确切内存地址。
使用虚拟地址,软件开发人员无需担心物理内存。
应用程序知道由OS和硬件共同协作来执行地址转换。
每个应用程序都可以使用自己的一组虚拟地址,这些地址将映射到物理系统中的不同位置。
当操作系统在不同的应用程序之间切换时,它将对地图进行重新编程。这意味着当前应用程序的虚拟地址将映射到内存中的正确物理位置。
抽象
不同编程语言提供不同形式和等级的抽象
指令集架构提供了对实际处理器硬件的抽象
文件是对IO的抽象
虚拟存储器是对程序存储器的抽象
进程是对一个正在运行的程序的抽象
虚拟机提供对整个个计算机(包括操作系统,处理器和程序的)的抽象
在深入理解计算机系统第一章中 我们分析了一个 helloworld 和运行过程,可以看出
在CPU(cpu运行速度最快)看来,系统中的最大时间消耗 都是花在了 拷贝 这个过程中
在这个过程中,cpu 处于 等待的过程
如果我们想改进的话,就要从减少 等待过程(即拷贝时间).
改进的思路 : 在 cpu register 和 main memory 中间 增加高速缓存
// cpu register < 1ns
+// L1 cache 1ns
+// L2 cache 3ns
+// L3 cache 12ns
// main memory 65ns
// flash
// 外设
MMU中的TLBs , write buffers , Ln cache , TCM 本质上都是 高速缓存