内存管理以及内存管理单元简介(MMU)
- 格式:pdf
- 大小:631.70 KB
- 文档页数:14
什么是MMU,MMU的作用MMU是Memory Management Unit的缩写,中文名是内存管理单元。
针对各种CPU,MMU是个可选的配件。
它是中央处理器(CPU)中用来管理虚拟存储器、物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权。
MMU的相关概念地址范围、虚拟地址映射为物理地址以及分页机制任何时候,计算机上都存在一个程序能够产生的地址集合,我们称之为地址范围。
这个范围的大小由CPU的位数决定,例如一个32位的CPU,它的地址范围是0~0xFFFFFFFF (4G),而对于一个64位的CPU,它的地址范围为0~0xFFFFFFFFFFFFFFFF (64T).这个范围就是我们的程序能够产生的地址范围,我们把这个地址范围称为虚拟地址空间,该空间中的某一个地址我们称之为虚拟地址。
与虚拟地址空间和虚拟地址相对应的则是物理地址空间和物理地址,大多数时候我们的系统所具备的物理地址空间只是虚拟地址空间的一个子集。
这里举一个最简单的例子直观地说明这两者,对于一台内存为256M的32bit x86主机来说,它的虚拟地址空间范围是0~0xFFFFFFFF(4G),而物理地址空间范围是0x000000000~0x0FFFFFFF(256M)。
在没有使用虚拟存储器的机器上,虚拟地址被直接送到内存总线上,使具有相同地址的物理存储器被读写;而在使用了虚拟存储器的情况下,虚拟地址不是被直接送到内存地址总线上,而是送到存储器管理单元MMU,把虚拟地址映射为物理地址。
大多数使用虚拟存储器的系统都使用一种称为分页(paging)机制。
虚拟地址空间划分成称为页(page)的单位,而相应的物理地址空间也被进行划分,单位是页桢(frame).页和页桢的大小必须相同。
在这个例子中我们有一台可以生成32位地址的机器,它的虚拟地址范围从0~0xFFFFFFFF(4G),而这台机器只有256M的物理地址,因此他可以运行4G的程序,但该程序不能一次性调入内存运行。
下列针对内存管理单元mmu的说法内存管理单元(MMU)是计算机系统中重要的组成部分,负责实现虚拟位置区域到物理位置区域的转换,以及实现内存保护和访问权限控制等功能。
下面我将针对内存管理单元MMU的一些说法进行全面评估,并撰写一篇有价值的文章。
1. 内存管理单元(MMU)是计算机系统中重要的组成部分,负责实现虚拟位置区域到物理位置区域的转换。
在现代计算机系统中,MMU 的作用十分重要,它可以有效地管理系统内存,并且保障程序之间的隔离和保护。
2. 内存管理单元(MMU)对系统性能有着重要的影响。
通过对虚拟位置区域到物理位置区域的映射,MMU可以提高内存访问效率,从而加速程序的执行速度。
3. 内存管理单元(MMU)在操作系统中起到关键作用,它能够实现内存的动态分配和回收,从而更好地满足不同程序的内存需求。
4. 内存管理单元(MMU)对系统的安全性和稳定性具有重要影响。
通过内存保护和访问权限控制等功能,MMU可以有效防止程序之间的干扰和非法访问,提高系统的稳定性和安全性。
5. 个人观点和理解:内存管理单元(MMU)是计算机系统中不可或缺的部分,它不仅可以提高系统的性能,而且能够保障系统的安全和稳定。
在未来的计算机发展中,MMU将继续发挥着重要作用。
总结回顾:通过对内存管理单元(MMU)的全面评估,我们深入了解了其在计算机系统中的重要作用和影响。
从虚拟位置区域到物理位置区域的转换,到内存访问效率的提升,再到系统安全性和稳定性的保障,MMU无疑是计算机系统中不可或缺的部分。
在未来的计算机发展中,我们需要更加重视对MMU的研究和应用,以更好地推动计算机系统的发展和进步。
内存管理单元(MMU)是计算机系统中不可或缺的重要组成部分,其作用不仅限于实现虚拟位置区域到物理位置区域的转换,还涵盖了内存保护和访问权限控制等功能。
在现代计算机系统中,MMU对系统性能、安全性和稳定性都有着重要的影响,其作用和意义愈发凸显。
关于虚拟位置区域到物理位置区域的转换,MMU的作用是至关重要的。
CPU的多核心架构及计算单元详解中央处理器(CPU)是计算机系统中的核心组件之一,它承担着执行计算和控制操作的任务。
随着计算机的快速发展,人们对于性能的要求也越来越高。
为了满足用户对于多任务处理和高性能计算的需求,CPU的多核心架构逐渐兴起。
本文将详细介绍CPU的多核心架构以及其中的计算单元。
一、CPU的多核心架构1.1 多核心概念及发展多核心是指在一个CPU芯片上集成多个独立的处理器核心。
与传统的单核心CPU相比,多核心架构能够同时处理多个线程或任务,提升计算机的整体性能。
多核心架构的发展源于摩尔定律的进展。
根据摩尔定律,集成电路中的晶体管数量每18个月翻倍,这意味着CPU的计算能力也在同期间不断提升。
然而,到了一定程度,提升频率并不能显著增加CPU的性能,因为频率增加会导致功耗和发热的问题。
因此,为了进一步提升性能,多核心架构成为了解决方案。
1.2 多核心的优势多核心架构具有如下几个优势:1.2.1 提升系统性能:多核心能够同时处理多个任务或线程,有效提高了系统的整体性能。
特别是对于多线程应用程序或者同时执行多个任务的场景,多核心能够更好地满足用户需求。
1.2.2 节能降耗:与提升频率相比,多核心架构能更好地平衡性能和功耗。
通过将任务分配到多个核心上执行,每个核心的工作频率可以降低,从而减少功耗和发热,延长电池续航时间。
1.2.3 增强并行计算能力:多核心为并行计算提供了强大的支持。
对于需要大量计算的应用程序,多个核心可以同时进行计算,加速处理过程。
1.3 多核心架构的实现方式多核心架构的实现方式主要有对称多处理(SMP)和复杂指令集计算(CISC)。
对称多处理(SMP)是指每个核心拥有相同的访问权限和权力,可以独立运行不同的任务。
SMP架构中,每个核心可以共享同一份操作系统,从而实现大部分应用程序的并行执行。
复杂指令集计算(CISC)则是在一个CPU芯片上,集成多个核心以及专用的计算单元,每个计算单元负责执行特定类型的计算任务。
ARM存储管理单元MMU和存储保护单元MPU展开全文MMU提供的一个关键服务是,能使各个任务作为独立的程序在其自己的私有存储空间运行.地址转换过程允许运行的多个程序使用相同的虚拟地址,而各自存储在物理存储器的不同位置.区域可以是活跃的,也可以是睡眠的:活跃区域包含当前系统正在使用的代码或数据;睡眠区域包含当前不使用,但可能在短时间内变为活跃的代码或数据.睡眠区域是被保护的,因此当前正在运行的任务是不能访问的.MPU和MMU的主要区别是,MMU中增加了额外的硬件,以支持虚存.一个重定位寄存器只能转换一块存储空间.这块存储空间的大小由虚拟地址的偏移量部分所占的位数所决定.ARM的MMU中临时存放转换数据的一组重定位寄存器实际上是一个由64个重定位寄存器组成的全相联cache.这个cache就是转换旁路缓冲器--TLB.TLB缓存最近被访问的页的转换数据.MMU 还使用主存中的表来存放描述系统中用到的虚拟存储器映射数据,这些转换数据的表就是页表.页表中的每个项代表了将虚拟存储器的一个页转换到物理存储器的一个页帧所需要的所有信息.在MMU中,区域被定义为一组页表的集合,并作为虚存中的连续页完全由软件控制.除了L1一级页表外,所有其他的页表都代表虚存的1MB空间.如果一个区域的大小大于1MB或者它跨过页表的1MB边界地址,那么就必须使用一组页表来描述这个区域.页表可以驻留在存储器中,而不必映射到MMU硬件.当在2个应用程序任务间实现上下文切换时,处理器其实要发生多次上下文切换.它先从用户模式任务切换到内核模式任务,以处理准备运行下一个应用程序任务时的上下文数据的移动;然后,它从内核模式任务切换到下一个上下文的新的用户模式任务.MMU在转换一个地址时失败,就会产生一个中止异常.MMU只有在转换失败,权限错误和域错误时,才会中止.L1住页表包含2种类型的页表项:保存指向二级页表起始地址指针的页表项和保存用于转换1MB页的页表项.L1页表也称为段页表.当L1页表作为页目录时,其页表项包含的是1MB虚拟空间的L2粗页表或L2细页表指针;当L1页表用于转换一个1MB的段时,其页表项包含的是物理存储器中1MB页帧的首地址.目录页表项和1MB的段页表项可以共存于L1主页表.CP15:c2寄存器保存转换表基地址TTB--指向L1主页表在虚存中的位置.TLB只支持两种类型的命令:清除TLB和锁定TLB中的转换数据.存储器访问时,MMU将虚拟地址的一部分与TLB中的所有值进行比较.如果TLB中已有所要的转换数据,即为一次TLB命中,则由TLB提供物理地址的转换数据.如果TLB中不存在有效的转换数据,即为一次TLB失效,则MMU会由硬件自动处理TLB失效,通过主存中的页表搜索有效的转换数据,并将其装入TLB的64行的一行.如果TLB中的某一行是锁定的,则当TLB清除命令发出时,它仍然保留在TLB中.在受保护的系统中,主要有两类资源需要监视:存储器系统和外围设备.存储器中对区域的访问可以是读/写,只读或不可访问,基于当时的处理器模式--管理模式或用户模式,还有一些附加的权限.区域还有控制cache和写缓冲器属性的cache写策略.当处理器访问主存的一个区域时,MPU比较该区域的访问权限属性和当时的处理器模式.如果请求符合区域访问标准,则MPU允许内核读/写主存;如果存储器请求导致存储器访问违例,则MPU产生一个异常信号.区域与内核是冯.诺依曼结构还是哈佛结构无关.每个区域通过0~7的号码来标识和引用.区域的属性如下:(1)区域可以相互重叠;(2)每个区域都分配有一个优先级,该优先级与分配区域的权限无关;(3)当区域重叠时,具有最高优先级的区域的属性可以覆盖其他区域的属性,优先级仅作用于重叠部分的地址;(4)区域的起始地址必须是其大小的倍数;(5)区域的大小可以是4KB~4GB之间的任何2的乘幂;(6)访问所定义区域外的存储器将产生异常.如果是内核预取指令,则MPU产生预取指令中止异常;如果是存储器数据请求,则产生数据中止异常.在启用存储器保护单元之前,必须至少定义一个数据区域和一个指令区域,而且必须在启用cache和写缓冲器之前(或同时)启用存储器保护单元.控制器通过设置CP15的主寄存器c1~5来配置MPU.通过配置寄存器c2和c3来设置区域的cache和写缓冲器的属性,寄存器c5控制区域的访问权限,在寄存器c6里有8个或16个次寄存器用来定义每个区域的大小和位置.初始化MPU,cache和写缓冲器需要以下步骤:(1)使用CP15:c6来定义指令和数据区域的大小和位置(2)使用CP15:c5来设置每个区域的访问权限(3)分别使用CP15:c2和CP15:c3来设置每个区域的cache和写缓冲器属性(4)使用CP15:c1来使能cache和MPU每个内核有3个CP15寄存器用来控制区域的cache和写缓冲器属性.其中CP15:c2:c0:0和CP15:c2:c0:1两个寄存器保存D- cache和I-cache区域属性;第三个寄存器,CP15:c3:c0:0用于保存区域写缓冲器属性,并应用于存储器数据区域.当配置数据区域时,区域的cache位和写缓冲器位一起决定区域的策略.写缓冲器位有2个用途:使能和禁止区域的写缓冲器和设置区域的cache策略.区域的cache位控制写缓冲器位的作用.当cache位为0时,写缓冲器位为1,则使能写缓冲器;写缓冲器位为0,则禁用写缓冲器.当cache位为1时,cache和写缓冲器都被使能,此时写缓冲器位决定cache策略.若写缓冲器位为0,则区域使用直写策略;若写缓冲器位为1,则区域使用回写策略.。
简单介绍MMU的工作原理
MMU(Memory Management Unit,内存管理单元)是计算机系统中的一种硬件设备,负责将逻辑地址转换为物理地址,实现虚拟内存和物理内存之间的映射和管理。
MMU的工作原理如下:
1. 虚拟地址转换:当CPU访问一个地址时,MMU首先接收到这个地址(即虚拟地址),然后根据内部的地址映射表将其转换为物理地址。
2. 地址映射表:MMU内部有一个地址映射表,它记录了虚拟地址和物理地址之间的对应关系。
这个表中的每一项称为页表项。
通常,虚拟地址被划分为若干个页面,而物理地址也被划分为相同的大小的内存块。
每个页表项记录了虚拟页面和物理页面之间的对应关系。
3. 地址转换:MMU根据地址映射表中的对应关系,将虚拟地址中的页号(Page Number)转换为物理地址中的页号,以及虚拟地址中的页面内偏移(Page Offset)转换为物理地址中的页面内偏移。
4. 访问权限控制:MMU还会根据地址映射表中的附加信息,如权限位,来判断对于特定的虚拟地址,是否允许对其进行读、写、执行等操作。
如果权限不足,则会触发异常或终止进程。
通过MMU的工作,操作系统可以实现虚拟内存的概念。
虚拟内存可以将大于物理内存的程序部分存储在辅助存储设备上,而只将当前需要的部分调入物理内存中,从而实现更高效的内存管理和更大的可用内存空间。
MMU浅析1.MMU是什么?MMU(Memory Management Unit)内存管理单元,位于bcm芯片的入口逻辑和出口逻辑中间,负责包的缓存和调度。
芯片接收到数据包之后先存储在缓存中,即CBP(cell buffer pool),然后再发送时加以调度。
一个芯片所拥有的cell个数是有限制的,每个cell大小是128byte,每个包进入芯片后占用一个或者多个cell,例如一个64byte到128byte大小的包就占用一个cell,一个1408byte到1536byte的包就占用12个cell,每个芯片cell总大小不一,如何把这些有限的cell分配和使用是提高BCM芯片转发能力和效率的关键。
2.MMU工作机制MMU在芯片中主要有两种分配方式,动态和静态,每个出端口有8个cos,每个cos有使用的静态阈值,当然也有公共部分的cell,同时每个端口也有公共cell 的动态阈值。
对于某个cos,在使用的cell超过静态阈值的时候就需要共享动态cell,如果使用的动态cell超过本端口cell的共享阈值或者整个动态区的cell使用超过阈值,那么这个端口就会进入hold状态,造成丢包。
每个入端口也有自己的cell限制阈值,当入端口的数据包计数超过该端口的阈值之后,端口就会进入阻塞态,就会发送pause帧。
芯片的buffer是有限的,一个包在入口被计数,在出口也被计数。
3.MMU寄存器PORT_MIN:针对入端口,每个端口所拥有cell的最小保证数量,静态PORT_SHARED_LIMIT:入端口,每个端口所能使用的共享区cell的数量,超过此阈值,端口就会发pause 帧TOTAL_SHARED_LIMIT:公共区的动态cell个数限制OP_BUFFER_SHARED_LIMIT:针对出端口,出口所能共享到的cell个数OP_QUEUE_CONFIG:配置出口cos的寄存器,其中Q_MIN是配置每个出口cos所拥有的最小保证数量,静态OP_SHARED_LIMIT:每个出口8个cos所能共享的cell阈值还有其他很多可配置寄存器,下面以56820芯片为例来说明具体使用。
8086的内部结构
1.寄存器:
8086包含了8个16位的通用寄存器,分为AX、BX、CX、DX、SI、DI、BP和SP。
其中AX寄存器又被分为两个8位的子寄存器AH和AL。
这些寄
存器用于存储数据、地址和控制信息,可以进行各种算术和逻辑操作。
此外,8086还有一些特殊的寄存器,如标志寄存器FLAGS用于存储标志位,IP指令指针寄存器用于存储下一条指令的地址。
2.执行单元:
8086的执行单元包括指令执行单元、算术逻辑单元(ALU)和控制单元。
指令执行单元负责从内存中读取指令,并根据指令的操作码执行相应
的操作。
ALU用于进行算术和逻辑操作,如加减、与或非等。
控制单元用
于控制指令的执行顺序和分支跳转。
3.数据总线和地址总线:
8086有一个16位的数据总线,用于传输数据。
它还有一个20位的
地址总线,用于寻址内存中的数据和指令。
通过这两条总线,8086能够
与外部存储器、输入输出设备等进行数据的读写和通信。
4.总线控制器:
5.输入输出控制器:
6.内存管理单元(MMU):
7.控制信号产生器:
总的来说,8086的内部结构是一个复杂的系统,包括寄存器、执行单元、数据总线和地址总线、总线控制器、输入输出控制器、内存管理单元和控制信号产生器等组件。
这些组件相互协作,使得8086能够进行数据的处理和存储,实现指令的执行和数据的输入输出。
mmu 的工作原理介绍:在计算机科学中,存储器管理单元(Memory Management Unit, MMU)是一种硬件设备,它管理着计算机的物理内存并将虚拟内存地址转换成物理内存地址。
当应用程序请求访问某个虚拟内存地址时,MMU 就会根据内存页面表进行地址映射,并将相应的物理地址返回给 CPU。
工作原理:MMU 的工作原理可以分为以下几个步骤:1. 地址转换首先,当应用程序请求访问某个虚拟地址时,CPU 会将该地址传递给 MMU,然后 MMU 会将该地址与一个内存地址映射表进行比较。
这个内存映射表是由操作系统在启动时创建的。
2. 缺页错误处理如果 MMU 没有找到相关的物理地址,则会发生缺页错误。
此时,操作系统会寻找相应的虚拟地址的页面,并将其加载到物理内存中。
之后,MMU 会再次进行地址映射,这次应该就能找到相应的物理地址了。
3. 映射缓存为了加速地址转换的速度,MMU 通常会采用一个映射缓存。
这个缓存保存了最近使用过的页面映射,以便在下一次访问时能够更快地找到相应的物理地址。
4. 权限检查在地址转换时,MMU 会进行一些权限检查,以确保当前用户有权访问该地址。
如果用户没有该地址的访问权限,则 MMU 会触发一个内存访问异常。
总结:MMU 内存管理单元是计算机硬件中的一部分,它管理着计算机的物理内存并将虚拟内存地址转换成物理内存地址。
MMU 的工作原理可以分为地址转换、缺页错误处理、映射缓存、权限检查等多个方面,它通过这些步骤来完成地址转换工作。
MMU 的存在为应用程序提供了显式地址转换抽象,为大型操作系统提供了基础,并且是操作系统能够在统一地址空间下为多个应用程序提供有效内存管理的基础。
1模块名称:存储管理1.1 术语1.存储器管理(memory manager):在操作系统中存储器层次的结构。
2.存储器层次结构:由少量的非常快速、昂贵、易变的高速缓存(cache),由若干兆字节的中等速度、中等价格、易变的主存储器(RAM)和数百兆或数千兆字节的低速、廉价、不易变的磁盘组成。
3.随机存取存储器(RAM)4.只读存储器(ROM)5.基本输入输出系统(BIOS):在IBM PC计算机中,系统位于ROM中的部分。
6.链接:把主程序、用户编写的例程、库例程结合到同一个地址空间中。
7.基本输入输出系统(BIOS,Basic Input Output System):在ROM中的那部分系统。
8.多道程序设计道数(degree of multiprogramming)9.MFT(OS/MFT):具有固定数目任务的多道程序。
10.重定位(relocation)11.程序状态字(Program Status Word)12.基址(base)寄存器和界限(limit)寄存器:解决重定位和保护问题时设置的两个专门的寄存器。
13.交换(swapping):存储管理的一种方案。
14.虚拟存储器(virtual memory):存储管理的另一种方案。
基本思想是程序、数据和堆栈的大小可能超过可用物理内存的大小,由操作系统把程序当前使用的那些部分保留在主存中,其他部分保留在磁盘上,在需要时调入内存。
15.虚地址空间(virtual address space):虚地址构成的空间。
16.缺页故障:由于虚页的数目大于页框的数目,因此一些虚页无法直接映射到页框中。
17.脏(dirty):当一个页已经被修改过,则它是“脏”的。
18.页面故障率(Page Fault Frequency)19.空洞(hole):也称为空闲区,是由于交换而在内存中产生的。
20.内存紧缩(memory compaction):通过把所有进程尽可能向下移动,尽可能将这些小的空闲区合并成一个大块的过程。
MMU简介1.概念MMU是Memory Management Unit的缩写,中文名是内存管理单元,它是中央处理器(CPU)中用来管理虚拟存储器、物理存储器的控制线路,同时也负责虚拟地址映射为物理地址,以及提供硬件机制的内存访问授权。
虚拟地址映射为物理地址内存访问授权另一个概念:内存管理,是指软件运行时对计算机内存资源的分配和使用的技术。
其最主要的目的是如何高效,快速的分配,并且在适当的时候释放和回收内存资源。
2.术语虚拟地址空间——又称逻辑地址空间,CPU看到的使用的地址空间。
32位CPU可以使用0~0xFFFFFFFF(4G)的地址空间。
物理地址空间——实际的内存空间,例如一个256M的内存,实际地址空间也就是0~0x0FFFFFFF(256M)。
VA——virtual address,虚拟地址PA——physical address,物理地址3.背景内存有限内存保护内存碎片1)内存有限——交换程序很大,而内存不够一次装入太大的程序。
在磁盘中分配虚拟内存。
进程在内存中执行,可以暂时从内存中交换(swap)出去到备份存储上,当需要时再调回到内存中。
2)内存保护不同进程使用不同的物理地址空间,必须防止不同进程使用同一块内存产生冲突。
内存保护最基本的思路是操作系统为不同进程分配不同的地址空间。
可以是逻辑地址,也可以是实际物理地址。
(但如果是实际物理地址,操作系统还要负责实际物理地址的分配调度,任务过重,因此设计MMU减轻操作系统负担,负责逻辑地址到物理地址的映射。
)3)内存碎片最初操作系统的内存是连续分配的,即进程A需要某一大小的内存空间,如200KB,操作系统就需要找出一块至少200KB的连续内存空间给进程A。
随着系统的运行,进程终止时它将释放内存,该内存可以被操作系统分配给输入队列里的其他等待内存资源的进程。
可以想象,随着进程内存的分配和释放,最初的一大块连续内存空间被分成许多小片段,即使总的可用空间足够,但不再连续,因此产生内存碎片。
一个办法是不再对内存空间进行连续分配。
这样只要有物理内存就可以为进程进行分配。
而实际上,不进行连续分配只是相对的,因为完全这样做的代价太大。
现实中,往往定出一个最小的内存单元,内存分配是这最小单元的组合,单元内的地址是连续的,但各个单元不一定连续。
这样的内存小单元有页和段。
当然,分段和分页也会产生碎片,但理论上每个碎片的大小不超过内存单元的大小。
另外,操作系统分配给进程的逻辑地址就可以是连续的,通过MMU的映射,就可以充分利用不连续的物理内存。
4.MMU原理分页页表查找(映射)以S3C2440的MMU为例,(ARM920T内核,三星产)MVA——modified virtual address,变换后的虚拟地址。
一般是在虚拟地址上再标记上进程号。
4.1分页机制虚拟地址最终需要转换为物理地址才能读写实际的数据,通过将虚拟地址空间和物理空间划分为同样大小的空间(段或页),然后两个空间建立映射关系。
在虚拟地址空间上划分的空间单元称为页(page,较大的则称为段section)。
在物理地址空间上划分的同样大小的空间单元称为页帧(page frame,或叫页框)。
Linux上地址空间单元大小为4k。
由于虚拟地址空间远大于物理地址,可能多块虚拟地址空间映射到同一块物理地址空间,或者有些虚拟地址空间没有映射到具体的物理地址空间上去(使用到时再映射)。
S3C2440最多会用到两级页表,以段(Section,1M)的方式进行转换时只用到一级页表,以页(Page)的方式进行转换时用到两级页表。
页的大小有3种:大页(64KB),小页(4KB),极小页(1KB)。
MVA,32位。
TTB base代表一级页表的地址将它写入协处理器CP15的寄存器C2(称为页表基址寄存器)即可。
一级页表的地址使用[31:14]存储页表基址,[13:0]为0。
一级页表使用4096个描述符来表示4GB空间,每个描述符对应1MB的虚拟地址,存储它对应的1MB物理空间的起始地址,或者存储下一级页表的地址。
每个描述符占4个字节,格式如下:使用MVA[31:20]来索引一级页表(20-31一共12位,2^12=4096,所以是4096个描述符)。
4.2转换机制①页表基址寄存器位[31:14]和MVA[31:20]组成一个低两位为0的32位地址,MMU利用这个地址找到段描述符。
②取出段描述符的位[31:20](段基址,section base address),它和MVA[19:0]组成一个32位的物理地址(这就是MVA对应的PA)4.3TLB从MVA到PA的转换需要访问多次内存,大大降低了CPU的性能,有没有办法改进呢?程序执行过程中,用到的指令和数据的地址往往集中在一个很小的范围内,其中的地址、数据经常使用,这是程序访问的局部性。
由此,通过使用一个高速、容量相对较小的存储器来存储近期用到的页表条目(段、大页、小页、极小页描述符),避免每次地址转换都到主存中查找,这样就大幅提高性能。
这个存储器用来帮助快速地进行地址转换,成为转译查找缓存(Translation Lookaside Buffers,TLB)当CPU发出一个虚拟地址时,MMU首先访问TLB。
如果TLB中含有能转换这个虚拟地址的描述符,则直接利用此描述符进行地址转换和权限检查,否则MMU访问页表找到描述符后再进行地址转换和权限检查,并将这个描述符填入TLB中,下次再使用这个虚拟地址时就直接使用TLB用的描述符。
若转换成功,则称为"命中"。
Linux系统中,目前的"命中"率高达90%以上,使分页机制带来的性能损失降低到了可接收的程度。
若在TLB中进行查表转换失败,则退缩为一般的地址变换,概率小于10%。
5.Linux内存管理补充概念逻辑地址线性地址物理地址5.1逻辑地址转线性地址在x86保护模式下,段的信息(段基线性地址、长度、权限等)即段描述符占8个字节,段信息无法直接存放在段寄存器中(段寄存器只有2字节)。
Intel 的设计是段描述符集中存放在GDT或LDT中,而段寄存器存放的是段描述符在GDT或LDT内的索引值(index)。
Linux中逻辑地址等于线性地址。
为什么这么说呢?因为Linux所有的段(用户代码段、用户数据段、内核代码段、内核数据段)的线性地址都是从0x00000000开始,长度4G,这样线性地址=逻辑地址+ 0x00000000,也就是说逻辑地址等于线性地址了。
Linux主要以分页的方式实现内存管理。
5.2线性地址转物理地址在保护模式下,控制寄存器CR0的最高位PG位控制着分页管理机制是否生效,如果PG=1,分页机制生效,需通过页表查找才能把线性地址转换物理地址。
如果PG=0,则分页机制无效,线性地址就直接做为物理地址。
分页的基本原理是把内存划分成大小固定的若干单元,每个单元称为一页(page),每页包含4k字节的地址空间。
这样每一页的起始地址都是4k字节对齐的。
为了能转换成物理地址,我们需要给CPU提供当前任务的线性地址转物理地址的查找表,即页表(page table)。
注意,为了实现每个任务的平坦的虚拟内存,每个任务都有自己的页目录表和页表。
为了节约页表占用的内存空间,x86将线性地址通过页目录表和页表两级查找转换成物理地址。
32位的线性地址被分成3个部分:最高10位Directory页目录表偏移量,中间10位Table是页表偏移量,最低12位Offset是物理页内的字节偏移量。
页目录表的大小为4k(刚好是一个页的大小),包含1024项,每个项4字节(32位),项目里存储的内容就是页表的物理地址。
如果页目录表中的页表尚未分配,则物理地址填0。
页表的大小也是4k,同样包含1024项,每个项4字节,内容为最终物理页的物理内存起始地址。
每个活动的任务,必须要先分配给它一个页目录表,并把页目录表的物理地址存入cr3寄存器。
页表可以提前分配好,也可以在用到的时候再分配。
还是以mov 0x80495b0, %eax中的地址为例分析一下线性地址转物理地址的过程。
假设要转换的线性地址就是0x80495b0。
转换的过程是由CPU自动完成的(应该是通过MMU),Linux所要做的就是准备好转换所需的页目录表和页表(假设已经准备好,给页目录表和页表分配物理内存的过程很复杂,后面再分析)。
内核先将当前任务的页目录表的物理地址填入cr3寄存器。
线性地址0x80495b0转换成二进制后是0000 1000 0000 0100 1001 0101 1011 0000,最高10位0000 1000 00的十进制是32,CPU查看页目录表第32项,里面存放的是页表的物理地址。
线性地址中间10位00 0100 1001的十进制是73,页表的第73项存储的是最终物理页的物理起始地址。
物理页基地址加上线性地址中最低12位的偏移量,CPU就找到了线性地址最终对应的物理内存单元。
我们知道Linux中用户进程线性地址能寻址的范围是0~3G,那么是不是需要提前先把这3G虚拟内存的页表都建立好呢?一般情况下,物理内存是远远小于3G的,加上同时有很多进程都在运行,根本无法给每个进程提前建立3G的线性地址页表。
Linux利用CPU的一个机制解决了这个问题。
进程创建后我们可以给页目录表的表项值都填0,CPU在查找页表时,如果表项的内容为0,则会引发一个缺页异常,进程暂停执行,Linux内核这时候可以通过一系列复杂的算法给分配一个物理页,并把物理页的地址填入表项中,进程再恢复执行。
当然进程在这个过程中是被蒙蔽的,它自己的感觉还是正常访问到了物理内存。
5.3物理内存管理(页管理)Linux内核管理物理内存是通过分页机制实现的,它将整个内存划分成无数个4k(在i386体系结构中)大小的页,从而分配和回收内存的基本单位便是内存页了。
利用分页管理有助于灵活分配内存地址,因为分配时不必要求必须有大块的连续内存,系统可以东一页、西一页的凑出所需要的内存供进程使用。
虽然如此,但是实际上系统使用内存时还是倾向于分配连续的内存块,因为分配连续内存时,页表不需要更改,因此能降低TLB的刷新率(频繁刷新会在很大程度上降低访问速度)。
内核分配物理页面时为了尽量减少不连续情况,采用了“伙伴”关系(Buddy 算法)来管理空闲页面。
设置了一个mem_map[]数组管理内存页面page,其在系统初始化时由free_area_init()函数创建。
数组元素是一个个page结构体,每个page结构体对应一个物理页面typedef struct page {struct page *next;struct page *prev;struct inode *inode;unsigned long offset;struct page *next_hash;atomic_t count;unsigned flags;unsigned dirty,age;struct wait_queue *wait;struct buffer_head * buffers;unsigned long swap_unlock_entry;unsigned long map_nr;} mem_map_t;把内存中所有页面按照2n划分,其中n=0~5,每个内存空间按1个页面、2个页面、4个页面、8个页面、16个页面、32个页面进行六次划分。