收藏在iOS开发的道路上越走越远iOS

程序底层——程序如何在RAM ROM运行,内存分配与分区

2016-05-14  本文已影响2370人  时间已静止

关于RAM ROM

RAM与ROM就是具体的存储空间,统称为存储器

由于RAM类型不具备掉电存储能力(即一停止供电数据全没了,从新上电后全是乱码,所以需要初始化),所以app程序一般存放于ROM中。RAM的访问速度要远高于ROM,价格也要高。

RAM与ROM协同工作

由于RAM不能掉电存储,所以我们的APP程序,刷机包,下载的文件等等,都是在ROM里面存储的。

手机里面使用的ROM基本都是NandFlash,CPU是不能直接访问的,而是需要文件系统/驱动程序(嵌入式中的EMC)将其读到RAM里面,CPU才可以访问。另外,RAM的速度也比NandFlash快。

内存分区:可以分为5个区

说到内存分区,内存即指的是RAM

图中各个区并不连续

程序运行举例(CPU RAM ROM之间协同)

首先了解下:虚拟内存与物理内存

手机上的所有程序都是依托操作系统,运行在虚拟内存上的,每一个APP都会以为自己拥有所有的虚拟内存。比如一个手机,它是32位操作系统(一般也是32位总线),真实的物理内存为2G:

那么他的寻址空间为4G(2的32次方),对于APP来说,它觉得自己拥有4G的内存,虽然这是不可能的(或者说同一时间是不可能的),但是,操作系统只要保证APP当时用到的地址空间有真实的物理地址对应就可以,APP也不需要知道那对应的2G真实物理内存具体在哪里。不要求4G的虚拟内存同一时间都有真实的物理内存相对应,当然那也是不可能的,因为只有2G物理内存

在下面的举例中,只考虑虚拟内存

当我们点击手机屏幕APP的Icon启动一个APP(例如微信)时

假设通过微信我们下载了一个100M的视频,那么会从服务器一点一点的下载到RAM,然后再从RAM写到ROM存储。这样才能保证,我们关掉微信并再次打开时视频还在

假设隔一段时间,我们要看视频,程序会将它从ROM读到RAM然后解码播放

编程注意

当一个app启动后,代码区,常量区,全局区地址已固定,因此指向这些区的指针不会为空而产生崩溃性的错误。而堆区和栈区是时时刻刻变化的(堆的创建销毁,栈的弹入弹出),所以当使用一个指针指向这两个区里面的内存时,一定要注意内存是否已经被释放,否则会产生程序崩溃(编程中很常见)。

上一篇 下一篇

猜你喜欢

热点阅读