| |
这个概念在大概14年前第一次接触,当时本科的专业并不是计算机,记得当时坐在图书馆里抱着一本书硬啃,一直想把这个概念弄清楚。
费尽力气却仍然似是而非,似懂非懂,因此挫败感很大;后来读研后,方向一直不在这里,也没有再去看,但是当时抱着一本书“深入理解计算机系统”看了好多年,断断续续,仍然觉得没有真正理解。
后来工作后,一头扎在了各种小型芯片的设计中,各种ip的设计,各种SoC层面的调度调式,cpu性能加速优化,和模拟的各种掰扯,和软件一起定位各种奇怪的问题,因为数字系统比较小,距离“虚拟存储器”更加遥远了;后来又做了一个中型的系统,说是中型,也就是大几百万门的系统,但是在和软件的各种扯皮中,确实看到了复杂系统软件健壮性的严峻挑战,定位问题的困难程度,可是仍然没有接触“虚拟存储器”;再后来,终于看到了真正的大系统,正经的正在做的芯片中使用了“虚拟存储器”的概念。
终于,14年后,可以来谈这个问题了。
看看没有虚拟地址的处理器是怎么工作的,编译环境除了将高级语言转换成机器码外,linker把众多分散开发文件串起来,使得增量编译
成为可能;同时loader就要考虑把多个独立程序安排地址空间,例如操作系统,视频驱动,display驱动,IO驱动,wifi驱动等。
他们存储在nor-flash or nand flash等NVM中。注意这些程序大部分会使用相对的地址寻址(或长或短,提高存储密度必然要求),也有少量绝对跳转地址,
这些绝对跳转必须由loader(在这个语境下还是指 IDM PC环境)了解整个地址划分,最后根据情况修改这些绝对跳转地址;
然后程序开始执行时,操作系统先初始化,然后加载各个进程;
1. 指令
只是cache,不区分是谁的操作系统指令 or 进程指令;
但如果要卸载某个程序,或者update,只能重新编译,linker and loader;但这对于大型系统来说是不可接接受的;
因为假使某个程序卸载后,update后的程序比原来大,原来连续的地址空间不够用了,只能看看哪里还有空缺
- 用不连续的两块nor flash区域拼接;
但是complier会很痛苦,因为实际可能远远不止2块不连续,要处理address remap问题,即使是相对分支跳转指令;
- 或者干脆找一块足够大的区域,导致内存碎片,利用率不高;
note:当然处理器不会关心这些复杂的事情,它只傻傻的执行每一条指令规定的行为。
如果系统没有cache,这些指令直接就流进处理器;
如果系统有cache,它也傻傻的根据这些物理地址,一定的算法,例如LRU来管理高速缓存,因此对cache没什么影响;
ps:注意支持虚拟存储器与否,对cache没什么影响;
2. 数据
这里的数据专指程序执行过程产生的临时数据,存储在片上sram,or DDR中,而不是只一开始就存储在nor flash中的literal data
-------------------------------------------------------
系统如果没有d-cache(只有片上sram),且没有操作系统:所有全局变量,静态变量,全部由编译器分配好,称之为heap,然后分配一块向下生长的空间作为stack,编译器会根据某种算法估计要给stack开辟多少空间,例如这个程序就是一个大的while(1) {}, 在结尾处wfi进入休眠,由中断驱动,
编译器会计算最深的函数调用(stack向下生长最长) + 在这种情况下发生中断保存现场stack需要;
但如果有“递归调用”则是另外一回事,编译器可能并不知道实际工作情况,自然无法准确预估stack需要;
--------------------------------------------------------
系统如果没有d-cache(只有片上sram),有操作系统:因为操作系统有内存管理功能,一般programmer编程不当(内存要及时free),会造成内存泄露,这个和无操作系统场景不同;当然也可能纯粹应用需要的太多,系统能力有限支持不了;
--------------------------------------------------------
系统有d-cache(只有片上sram),有操作系统:和上一种区别不大,d-cache也是无脑工作,并不需要知道加载的到底是heap or stack,或者什么变量;
--------------------------------------------------------
问题:那么加入虚拟存储器会 make a difference ?对编译器没什么影响,但是对系统却有很大的影响。
分析:对于小型系统来说,各个程序系统开发者可以把关,并进行测试保证系统稳定性;
但对于大型系统来说,程序及其庞杂,开发者众多,开发者水平不一;有第三方开发的软件需要安装,甚至有些有些恶意软件要攻击别的软件;即某个程序可能异常可能会造成系统崩溃,或信息泄露,不管有意还是无意,最终导致这个后果。
未完待续。。。