关于RAMROM
RAM与ROM便是详细的存储空间,统称为存储器。
RAM(random access memory):运转内存,CPU能够直接拜访,读写速度非常快,可是不能掉电存储。它又分为:
动态DRAM,速度慢一点,需求定时的改写(充电),咱们常说的内存条便是指它,价格会稍低一点,手机中的运转内存也是指它。
静态SRAM,速度快,咱们常说的一级缓存,二级缓存便是指它,当然价格高一点。
ROM(read only memory):存储性内存,能够掉电存储,例如SD卡、Flash(机械磁盘也能够简略的理解为ROM)。用的多的:NandFlash,还有NorFlash,现在用的现已比较少了(两者首要区别是前者空间大,廉价,后者能够直接运转程序,读取速度快)。
由于RAM类型不具备掉电存储才干(即一中止供电数据全没了,重新上电后满是乱码,所以需求初始化),所以app程序一般寄存于ROM中。RAM的拜访速度要远高于ROM,价格也要高。
RAM与ROM协同作业
由于RAM不能掉电存储,所以咱们的APP程序,刷机包,下载的文件等等,都是在ROM里边存储的。
手机里边运用的ROM根本都是NandFlash,CPU是不能直接拜访的,而是需求文件体系/驱动程序(嵌入式中的EMC)将其读到RAM里边,CPU才干够拜访。别的,RAM的速度也比NandFlash快。
内存分区:能够分为5个区
提到内存分区,内存即指的是RAM。
栈区(stack): 这个一般由编译器操作,或许说是体系办理,会存一些局部变量,函数跳转跳转时现场维护(寄存器值保存于康复),这些体系都会帮咱们主动完成,无需咱们干涉。 所以很多的局部变量,深递归,函数循环调用都可能耗尽栈内存而形成程序溃散 。
堆区(heap): 一般由程序员办理,比方alloc请求内存,free开释内存。咱们创立的目标也都放在这儿。
大局区(静态区 static):大局变量和静态变量的存储是放在一块的,初始化的大局变量和静态变量在一块区域, 未初始化的大局变量和未初始化的静态变量在相邻的另一块区域。程序完毕后有体系开释。留意:在嵌入式体系中大局区又可分为未初始化大局区:.bss段和初始化大局区:data段。举例:int a;未初始化的。int a = 10;已初始化的。
常量区:常量字符串便是放在这儿的,还有const常量。
代码区:寄存代码,app程序会复制到这儿,程序不是在ROM里边存储吗?看下面的举例
图中各个区并不接连
memZonepic01.png
程序运转举例(CPU RAM ROM之间协同)
首要了解下:虚拟内存与物理内存。
手机上的一切程序都是依托操作体系,运转在虚拟内存上的,每一个APP都会认为自己具有一切的虚拟内存。比方一个手机,它是32位操作体系(一般也是32位总线),实在的物理内存为2G,那么他的寻址空间为4G(2的32次方),关于APP来说,它觉得自己具有4G的内存,尽管这是不可能的(或许说同一时间是不可能的),可是,操作体系只需确保APP其时用到的地址空间有实在的物理地址对应就能够,APP也不需求知道那对应的2G实在物理内存详细在哪里。不要求4G的虚拟内存同一时间都有实在的物理内存相对应,当然那也是不可能的,由于只要2G物理内存。
鄙人面的举例中,只考虑虚拟内存
当咱们点击手机屏幕APP的Icon发动一个APP(例如微信)时,操作体系会为微信拓荒4G的虚拟内存空间(拓荒实在的物理内存,对应一部分到4G的虚拟内存),操作体系会把存储在ROM里边微信的部分代码(受空间所限,不可能悉数复制),复制到上一步拓荒的4G内存空间的代码区,如上图,然后CPU就能够拜访RAM来运转微信的程序了 。
假定经过微信咱们下载了一个100M的视频,那么会从服务器一点一点的下载到RAM,然后再从RAM写到ROM存储。这样才干确保,咱们关掉微信并再次翻开时视频还在。假定隔一段时间,咱们要看视频,程序会将它从ROM读到RAM然后解码播映。
memZonepic002.png
编程留意
当一个app发动后,代码区,常量区,大局区地址已固定,因而指向这些区的指针不会为空而发生溃散性的过错。而堆区和栈区是时时刻刻改变的(堆的创立毁掉,栈的弹入弹出),所以当运用一个指针指向这两个区里边的内存时,必定要留意内存是否现已被开释,否则会发生程序溃散(编程中很常见)。