前言:
为什么要复习MMU和Cache,因为我之前就学习过uboot,但是当初跳过了MMU,另外我平时学习过程中基本上忽略了内存管理。只是了解一个皮毛,没有深入思考过。而这次要准备自制系统而重学uboot,当然不能放过MMU啦~
问题1:MMU就是虚拟地址转物理地址的作用吗?
谈论到MMU我首先想到的是内存映射即虚拟地址和物理地址转换,然后想到的是rtos没有MMU但是linux有的这句话,但是这句话开始就想不通了,就比如我现在用的tc275就是地址转换的呀,以前用过的D-flash动态窗口也是有地址转换的呀,不都是MMU吗?后来网上查资料,发现MMU是一种内存管理技术。虚拟地址转物理地址是它其中一种基本能力而已。开启和关闭MMU功能,说明MMU是内核中的一个模块,所以说Cortex-M内核不支持而Cortex-A内核支持。从这句话来理解也可以知道MMU的功能不是软件实现的,而是芯片内部实现的。
问题2:Cache能通过寄存器控制吗?和MMU有什么关系?
最近看到了Cache,其实我也知道Cache就是速度更快的内存,其它就没有研究了,现在在深入理解MMU那么就一起了解了Cache。当前的理解MMU可以管理所有内存,所有当然可以控制Cache。因为Cache也是内存的一种。会把一小段程序放入指令Cacche中,把变量
放入Data Cache中,这样cpu就不用访问SDRAM,直接访问Cache.,如果Cache中没有,就访问SDRAM中的。uboot中数据cache必须关闭bai指令cache可以关闭也可以启动Bootloader主要是装载内核镜像,镜像数据必须真实写回SDRAM中,所以数据cache必须关闭,而对于指令cache,不存在强制性的规定,但在一般情况下,推荐关闭cache。
问题3:MMU到底什么功能?
网上搜索的内容太碎片化,而且准确度不高,还是看书吧!我家什么最多,就是书最多,每年双11我都会买很多,但是都是囫囵吞枣看一下V。翻阅《深入理解计算机系统》第9章的首页概述中我get到3个信息。
a.还记得linux的用户空间和内核空间吧,这样的空间保护这就是靠MMU,而RTOS就没有。
b.提到了malloc的段错误和保护错误,这部分我从没了解过,只是freertos之前简单了解过heap处理,目的就是要让内存都存在在一起,这样可以加快访问速度,而非碎片化访问。而linux中防止碎片估计就是靠MMU。然后我想起来AutosarOS为每个component通过lds来分配空间,也是不能访问其它空间的,AutosarOS也有内存保存功能,这个MMU有异曲同工之妙。
c.虚拟内存和共享空间的关系,通过读写某个内存位置修剪过一个磁盘文件内容。这部分暂时猜测就是同一个物理映射到了不同的虚拟地址,所以实现了共享吧。
好了只看了第一页我就开始想入非非了,还有60页边看边写吧,一定会有新的认识~
问题4:第二页中写了将DRAM缓冲来表示虚拟内存系统的缓存,DRAM是什么和L1 L2 cache有什么区别?
网上搜索了DRAM 只能将数据保持很短的时间。为了保持数据,DRAM 必须隔一段时间刷新。cache一般是sram访问速度比dram快10倍。所以DRAM可以理解为物理介质,而cache的物理介质一般是sram。
问题5:说到PTE分页条目,缓存,未缓存和未分配。这个和虚拟地址和物理地址有什么关系?
不着急,先记录问题,要继续向后看,这个图让我搞明白了。首先通过PTE进行地址翻译是芯片硬件做的事。PTE就是我以前在单片机中会用到的page+offset的寄存器。关于缓存,未缓存和未分配其实是一种MMU的管理技术中的对象,会有些算法策略来应对这些对象,否则大的不命中及访问第一个字节的开销会比较大。所以对应这3个对象的管理算法决定了虚拟地址转物理地址的性能消耗。
问题6:上图中的虚拟地址和cache有什么关系?
上图中的表都是有地方存储的,物理内存当然是保存在磁盘等设置上,而虚拟内存是保存在闪存上,可以理解为sram。那些表之后还有多级分页表示保存在cache上的。
问题7:程序必须复制到内存中才能运行吗?
我很早就是知道虚拟内存的概念,那个例子就是火车轨道只有火车长度的1/4,那么火车能开到目的地吗?只要铺设轨道的速度为火车快,就可以到达目的。程序要复制到内存中运行,主要是内存去数据速度为磁盘要快100倍。但是单片机应该就是直接中flash中取代码运行的吧!所以不是必须的,但是linux有虚拟内存,所以都是这样运行程序的。
问题8:为什么说nandflash无法运行程序而norflash可以独立运行程序?
原因是nandflash没有地址总线。啊!没有地址总线怎么取数据呀!它有它特殊的通信协议,数据总线和地址总线公用,主要是需要驱动程序去配置nandflash,所以不能独立运行里面保存的代码。而norflash有地址总线,所以它可以独立运行程序。
问题9:高速缓存中到此保存怎么样的转换表?
MMU生成一个PTE需要花时间,所以先准备好多级分页表,保存在高速缓存中即可。所以高速缓存中会保存转换表。其实在第6章存储器存储结构有具体描述,但是我今天没看。
现在基本上理解了
其实我的这些疑惑主要是不清楚到底哪些是软件干的活,哪些是芯片硬件干的活。并且我之前没有搞清楚虚拟内存和虚拟地址的关系。也没有搞清楚虚拟内存是保存在哪个器件上的,虚拟内存应该是保存在ddr上,所以内存越大加载软件越快。而对于虚拟地址如何转物理地址的方案我早就了解过,包括未命中缺页的处理也早就了解过。
《深入理解计算机系统》9.7.2章节后都是说的Linux虚拟内存管理,和物理内存无关
1.包括一个进程的虚拟内存分区
2.段错误的原因是访问了未分配区域,保护异常访问无权限的段。这些都是一个vm_area_structs结构体就可以标记这些信息了,虚拟内存做权限管理果然方便
3.c语言共享内存机制,fork机制都用到了写时复制。
4.为什么要动态分配空间的原因,就是要充分利用空间,通过不断的申请和释放,否则静态分配没有那么多空间了。
5.堆栈碎片的处理算法。包括最简单的边界标记。看到这里我想起来之前学习tr-thread貌似为task任务块分配空间heap有3种算法可选。
6.链表存储及垃圾回收机制。不可达的就是垃圾。
7.介绍了c语言中与内存有关的错误,确实以前出现段错误或者内存溢出,就是犯下了这些错误。