没有虚拟地址的处理器是怎么工作的?

描述

这个概念在大概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 ?对编译器没什么影响,但是对系统却有很大的影响。

分析:对于小型系统来说,各个程序系统开发者可以把关,并进行测试保证系统稳定性;

但对于大型系统来说,程序及其庞杂,开发者众多,开发者水平不一;有第三方开发的软件需要安装,甚至有些有些恶意软件要攻击别的软件;即某个程序可能异常可能会造成系统崩溃,或信息泄露,不管有意还是无意,最终导致这个后果。

审核编辑:黄飞

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分