历史上的今天
返回首页

历史上的今天

今天是:2024年11月26日(星期二)

正在发生

2021年11月26日 | ARM基础学习-存储管理单元MMU

2021-11-26 来源:eefocus

在ARM系统中,存储单元MMU的主要完成以下工作:

(1) 虚拟存储空间到物理存储空间的映射;ARM 采用页式虚拟存储管理,把虚拟空间分成固定大小的块,每一块称为一页;物理内存地址空间也分成同样大小的页;页的大小分为粗粒度和细粒度;MMU需要实现虚拟地址到物理地址的转换;

(2) 存储器访问权限的控制;

(3) 设置虚拟存储空间的缓冲的特性;


页表是实现MMU的重要手段,页表存储与内存中,表的每一行对应于虚拟空间的一个页,该行包含了虚拟内存页对应的物理内存页的地址;通过CP15协处理器的寄存器C2来保存页表的基地址;


TLB


(1)概念


在程序运行的一段时间内,对页表的访问只是局限在少数的几个单元中,可以采用一个容量更小,访问速度和通用寄存器相当的存储器来存放当前访问需要的地址变换条目;这个小容量的页表称为快表,也可以称为TLB(Translation Lookaside Buffer);


当CPU访问内存时,现在TLB中查找需要的地址变换条目。如果该条目不存在,CPU从位于内存的页表中查询,并把相应的结果添加到TLB中。这样,当CPU下一次又需要该地址变换条目时,可以从TLB中直接得到,从而使地址变换的速度大大加快。


当内存中的页表内容改变,或者通过修改CP15中的寄存器C2使用新的页表时,TLB的内容需要全部清除。MMU提供了相关的硬件支持这种操作。CP15中的寄存器C8用来 控制清除TLB内容的相关操作。


MMU可以将某些地址变换条目锁定在TLB中,从而使得进行与该地址变换条目相关的地址变换速度保持很快。在MMU中C10用于控制TLB内容的锁定。


注:TLB中存放的是地址变换条目,相当于一个小页表。


(2)TLB更新变化条目


a、使能MMU时的存储访问过程。


当ARM处理器请求存储访问时,首先在TLB中查找虚拟地址。如果系统中数据TLB和指令TLB是分开的,在取指令时,从指令TLB查找相应的虚拟地址,对于其他内存访问操作,从数据TLB中查找相应的虚拟地址。


如果虚拟地址对应的地址变换条目不在TLB中,CPU从位于内存的页表中查询,并把相应的结果添加到TLB中。如果TLB已经满了,还需要根据一定的淘汰算法进行替换。这样,当CPU下一次又需要该地址变换条目时,可以从TLB中直接得到,从而使地址变换的速度大大加快。


当得到了需要的地址变化条目以后,将进行以下操作

(1)得到该虚拟地址对应的物理地址;

(2)根据条目中的C(cache)控制位和B(Bufferable)控制位决定是否缓存该内存访问的结果 ;

(3)根据存取权限控制位和域访问控制位确定该内存访问是否被允许。如果该内存访问不被允许,CP15向ARM处理器报告存储访问中止。

(4)对于不允许缓存的存储访问,使用步骤(1)中得到的物理地址访问内存。对于允许缓存的存储访问,如果在cache命中,则忽略物理地址;如果cache没有命中,使用步骤(1)中得到的物理地址访问内存,并把该块数据读取到cache中。

这里写图片描述

b、禁止MMU时存储访问过程


禁止MMU时,是否支持cache和write buffer由各个具体芯片的设计确定。如果芯片规定禁止MMU时禁止cache和write buffer,则存储访问将不考虑C、B控制位。如果芯片规定当禁止MMU时可以使能cache和write buffer,则数据访问时,C=0,B=0;指令读取时,如果使用分开的TLB则C=1,如果使用统一的TLB则C=0;

存储访问不进行权限控制,MMU也不会产生存储访问中止信号;

所有的物理地址和虚拟地址相等,即使用平板模式;

c、禁止/使能MMU时应注意的问题


在使能MMU之前,要在内存中建立页号表,同时CP15中的各相关寄存器必须完成初始化。

如果使用的不是平板存储模式(物理地址和虚拟地址相等),在禁止/使能MMU时,虚拟地址和物理地址的对应关系会发生改变,这时应该清除cache中的当前地址变换条目;

如果完成禁止/使能MMU的代码的物理地址和虚拟地址不相同,则禁止/使能MMU时会造成很大麻烦,因此强烈建议完成禁止/使能 MMU的代码的物理地址和虚拟地址最好相同 ;

虚拟地址映射物理地址原理


多数使用虚拟存储器的系统都使用一种称为分页(paging)的机制。虚拟地址空间划分成称为页(page)的单位。而相应的物理地址空间也被进行划分,单位是页框(frame),页和页框的大小必须相同。


虚拟地址被MMU分为两部分:第一部分是页号索引(page Index),第二部分则是相对该页首地址的偏移量(offset);


当CPU访问一个地址时,该地址是虚拟地址,于是该地址被送到MMU,MMU再根据虚拟地址的高几位作为页号索引,在页表中寻找对应的地址变换条目。从地址变换条目中找到物理地址的页基地址,再加上虚拟地址中的偏移量,便得到了真正的物理地址,然后由MMU将物理地址发送到地址总线上,访问物理内存。


例:如图所示,如果分页大小为1M,虚拟地址为0x30000012,

虚拟地址的二进制码为 00110000 00000000 00000000 00010010 前12位为页号索引,后20位为偏移量,因为2^20 = 1M

前12位页号索引为00110000 0000 = 768,所以在页表中找到相对于页表基地址的偏移量为768的地址,然后得到地址变换条目。于是0x0300 << 20位,便得到了物理页基地址,再加上虚拟地址中的偏移位 0000 00000000 00010010 = 0x12,便得到了真正的物理地址 0x30000012 。

一级地址变换

MMU中的地址变换过程


在ARM中,虚拟地址到物理地址的映射有两种方式,一级映射和二级映射。


(1)一级映射


当使用一级映射时,只会用到一张页表,我们将它称为一级页表,用L1表示。一级映射时,虚拟空间被划分成段的单位,每段的大小为1M。而相应的物理空间也被进行这样的划分,单位是段框,段和段框的大小必须相同。


首先在内存中建立一张页表(这个页表由我们自己建立),页表中的每一项存放的是一个物理段基地址,该页的访问权限和缓冲特性等。页表中每一项的大小为4字节,所以每一项的地址是字对齐。我们将页表中的每一格称为一个项。


因为ARM的可寻址范围为4G,且虚拟空间的每段大小为1M,所以如图所示,页表有4096个项。每一项对应一个段,每一项中存放的是一个物理段基地址,该页的访问权限和缓冲特性等。

虚拟地址被MMU分为两部分,第一部分为页索引号(bits[31:20]),第二部分是相对物理地址的偏移量(bits[0:19])。

所以当访问一个地址时,此地址是虚拟地址。MMU会用协处理器CP15的C2寄存器中的页表基地址+页索引号便查到了页表中对应的一项,从页表中相应的项中找到物理段基地址,然后:物理段基地址 + 偏移量(这个是虚拟地址的第二部分) = 物理地址。


例:

CPU要访问0x300008的地址,此地址为虚拟地址。MMU会根据页索引号(也就是 0x3 )找到相对页表基地址偏移量为0x3的项。这个项中的物理段基地址为0x006。

物理地址 = (0x006<<20)+0x8=0x600008

这里写图片描述

 b、二级映射

 

当使用二级映射时,一级页表L1仍然存在,但是一级页表中不再存放物理段基地址了,而是存放了二级页表的基地址,也就是二级页表的首地址。


一级页表要表示4G的地址范围,一共4096项,每一项都表示1M 的大小。二级页表相当于对一级页表这1M的范围作更详细的划分,所以每个二级页表要表示1M 的地址范围。


对这1M地址范围进行分页,有三种分法:

1. 大页:将这1M地址范围分成单位为64KB大小

2. 小页:将这1M地址范围分成单位为4KB大小

3. 极小页:将这1M地址范围分成单位为1KB大小


注:二级页表分为两类:粗粒度的二级页表和细粒度的二级页表。

这里写图片描述

一级和二级页表的理解


假设系统有4GB存储空间,规定页面大小为4KB(linux),那么就有1M个页面,由于页表中一个表项对应一个页面,那么采用一级页表需要4G/4K = 1M个页表项,如果每个页表项是4B,那么需要4MB的内存空间。


在看看二级页表:采用二级页表系统时,假设一级页表有1K个表项,那么每个二级页表应该有1K个表项,这里每个一级页表的表项存放的是对应二级页表的首地址(一个一级表项对应一个二级页表),二级页表的每个表项存放的是一个物理块号,那么就有1K个二级页表,二级页表项一共就有1K*1K=1M(单位:表项),再加上一级页表占用的1K,这个二级页表系统所有页表占用的内存(1M+1K)x 4B = 4MB + 4KB;


但是大多数程序根本用不到4G的虚拟内存空间,比如一个简单的hello world程序,这样一个几kb的程序却需要4MB的内存空间是很浪费的。如果采用二级页表,那么一级页表只需要(1K x 4b)4KB的空间用来索引二级页表的地址,像hello world这样的程序可能只需要一个物理页,那么只需要一条记录就可以了,故对于二级页表也只要(1K x 4b)4KB就足够了,而一级页表中的其他表项可能为空,所以这样只需要8KB就能解决问题。


所以二级页表是按程序需要来加载多少项的;


推荐阅读

史海拾趣

Eon公司的发展小趣事

随着全球对环保和可持续发展的关注日益增加,E.ON也开始加快绿色能源转型的步伐。公司加大了对可再生能源的投资力度,积极开发风电、太阳能等清洁能源项目。同时,E.ON还积极推广智能电网技术,提高能源利用效率,降低环境污染。

Beta Dyne Inc公司的发展小趣事

随着社会对环保问题的关注度不断提高,Beta Dyne也积极响应国家号召,将环保理念融入公司的经营发展中。公司采用环保材料和生产工艺,减少生产过程中的污染排放。同时,Beta Dyne还积极参与社会公益事业,为当地社区的发展做出了积极贡献。

这些故事虽然是以虚构的形式呈现,但它们反映了电子行业中许多公司可能经历的发展阶段和挑战。每个公司都有其独特的发展历程和故事,Beta Dyne Inc也不例外。如果您对该公司的具体发展情况感兴趣,建议查阅相关资料或联系该公司以获取更准确的信息。

Epistar Corp公司的发展小趣事

近年来,随着OLED(有机发光二极管)技术的兴起,LED行业面临着巨大的挑战。Epistar敏锐地意识到了这一点,开始积极调整战略方向,加大在OLED技术领域的研发力度。同时,公司还通过优化产品结构、提高生产效率等措施降低成本、提升竞争力。这些努力使Epistar在OLED技术浪潮中保持了稳健的发展态势。

Condor公司的发展小趣事

作为一家电子产品制造企业,Epistar始终关注环保和可持续发展问题。公司积极采用环保材料和生产工艺减少污染排放和能源消耗;同时,Epistar还加强了对废旧产品的回收和处理工作以减少对环境的负面影响。这些努力不仅提升了公司的社会形象也增强了公司的市场竞争力。

General Electric Solid State公司的发展小趣事

Epistar的成立之初,正是LED(发光二极管)技术逐渐崭露头角的时代。公司创始人看到了LED技术的巨大潜力,决定投身这一领域。起初,Epistar面临技术壁垒高、市场接受度低等问题。然而,公司团队通过不懈的研发和技术积累,逐渐攻克了技术难关,并成功开发出多款性能优异的LED产品。这些产品在市场上取得了良好的反响,为Epistar的后续发展奠定了坚实的基础。

EUCHNER公司的发展小趣事

EUCHNER公司一直将产品创新视为其核心竞争力。公司不断投入研发资源,推出了一系列具有创新性的产品,如安全限位开关CES-CMFS系列、机械式安全开关MGB系列以及多光束安全栅ESPE系列等。这些产品在汽车制造、轨道交通、环保监测等领域得到了广泛应用,并赢得了客户的广泛赞誉。通过产品创新和市场拓展,EUCHNER公司的市场份额逐年提升。

问答坊 | AI 解惑

功率放大器知识

功率放大电路的原理及其知识........ …

查看全部问答>

帮忙看看这个消抖动程序有什么问题

library ieee;--消抖动 延迟10msuse ieee.std_logic_1164.all;use ieee.std_logic_unsigned.all;entity dou isport(s,clk1k:in std_logic;     so:Put std_logic);end;architecture one of dou issignal cout4 :std_logic_vect ...…

查看全部问答>

博创pxa270开发板WINCE内核不支持VGA输出,请求帮助

WINCE系统驱动上面我一点都不懂,公司前两天买了博创的PXA270开发板,没有买LCD屏,LINUX下我用普通电脑显示屏,它是可以显示内容的.后来我刷了它的WINCE5.0内核,一直在电脑显示屏上显示不出来图像,咨询售后说是,没有买他们的LCD屏的问题? 大家手里有 ...…

查看全部问答>

【求助】SPI(DMA方式),代码分析!

void SPI_Init() {         //----------- IMPORTANT: By default, the internal clock is disabled.  To configure the controller ------         //          & ...…

查看全部问答>

workbench下编译下载的一个问题,请教

用的workbench3.0 选的是SIMNTdiab,编译通过,但是下载.OUT文件的时候 提示如下: “Please resolve following symbols before next download semBSmCreate smNameAdd” 不知道该如何解决,我是初学者一个。 源程序如下: #include #inc ...…

查看全部问答>

51单片机控制SIM300收发数据

各位高手,我想用51通过串口来控制SIM300收发数据,现在已经把SIM300模块和51实验板通过串口连接起来了,可写完程序后模块没有反应,不知道为什么,需要对模块初始化吗?我把程序贴上来麻烦大家看看有什么问题。另外我想用串口接收字符串并判断接 ...…

查看全部问答>

有关PIC系列单片机?

我想请问一个,有没有谁知道PIC系统单片机的编程工具和开发平台? 还有关于PIC18F6622芯片简介? 谢谢…

查看全部问答>

如何调用系统的手写输入?

VC中,如何去调用WinCE系统的自带的手写输入法? 谢谢!…

查看全部问答>

【求助】宏定义时溢出,想用unsigned int,怎么办?

宏定义时溢出,想用unsigned int,怎么办? ============================================================ 有如下一句定义: #define TIMER_A_50 (750*50) // 50ms 程序中有: CCR0 = TIMER_A_50; // 50 ...…

查看全部问答>