- 论坛徽章:
- 0
|
所谓的程序空间包括程序的指令,堆,栈,数据,可以简单理解为就是程序指令的总条数
这个问题可以从单片机开始谈起:
1:考虑使用的是没有mmu的单片机,对于单片机来说整个程序就是一个进程,只要一上电这个进程就会无休止的跑下去。假设一个单片机的地址线是8位,那么你整个程序的地址空间就不能超过256B,即使你有1M的RAM也是枉然,因为程序计数器的偏移最大只有256B,超过这个数PC就无法正确的指到相应的位置。如果该用户有128B的RAM,1M的flash,用户编译的程序大小为150B,那么用户可以选择在flash中跑程序(必须是nand flash),或者128B在RAM中其他的22B在FLASH中(maybe??)
总结:如果你想把程序全部放在ram中跑,单片机程序空间的大小受到两个因素的限制:a:地址线的宽度 b:ram的大小
2:对于有mmu的mcu来说,我们可不用理会实际的ram的大小,因为mmu会很YD得帮你替换来替换去(实际上是os做的,这就是mmu的存在一般都伴随着os,os里面有很完善的替换机制),但是因素a的影响还是存在的。可以把任何一个有mmu的32位的系统想象为带了4G的物理内存,OS总是占据着虚拟地址0-1G的空间(EG:LINUX),假设编写了程序A,B,C。分别的大小是1,2,3G。再假设A,B同时运行.再假设分给A的虚拟地址是1-2G,分给B的是2-4G,正好很和谐。A,B跑完了以后虚拟空间释放出来给C用,至于虚拟空间对应的物理空间是什么那不用担心,总会从硬盘里找到的,访问硬盘和访问内存的方式不一样,有可能硬盘的接口地址就已经超过了32位宽,硬盘的大小不受地址线的宽度限制。
但是那么如果A,C一起运行呢?我觉得是不可以的,因为虚拟地址都没法分了。OS那1G你不能动他,C在跑,A就不能跑。
[ 本帖最后由 schordinge 于 2008-8-28 13:58 编辑 ] |
|