charlie_zhang的个人空间 https://blog.eetop.cn/910906 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

关于对虚拟存储器的理解

已有 596 次阅读| 2022-5-20 23:03 |系统分类:芯片设计


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

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

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


未完待续。。。


点赞

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 30

    粉丝
  • 12

    好友
  • 73

    获赞
  • 18

    评论
  • 1101

    访问数
关闭

站长推荐 上一条 /2 下一条

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-4-24 01:35 , Processed in 0.021404 second(s), 15 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部