0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

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

星星科技指导员 来源:eetop 作者:eetop 2023-12-07 10:29 次阅读

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

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

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

审核编辑:黄飞

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

    关注

    68

    文章

    18298

    浏览量

    222210
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10451

    浏览量

    206580
  • 操作系统
    +关注

    关注

    37

    文章

    6290

    浏览量

    121898
  • 虚拟存储器
    +关注

    关注

    0

    文章

    11

    浏览量

    8764
  • 编译器
    +关注

    关注

    1

    文章

    1577

    浏览量

    48627
收藏 人收藏

    评论

    相关推荐

    linux虚拟地址如何转物理地址

    linux虚拟地址转物理地址
    发表于 05-13 09:31

    探讨一下ARM中的MMU虚拟地址

    的缓存效率较低。缓存效率较低,因为小内存块需要多次读取级别才能转换。处理器在开始表查找时不知道转换的大小。处理器通过执行表遍历计算出正在转换的块的大小。在ARMv8-A中有三个独立的虚拟地址空间,分别
    发表于 04-08 17:17

    ARM处理器使用虚拟地址来提供cache index和cache tag

    早期的ARM处理器使用虚拟地址(virtual addresses)来提供cache index和cache tag。VIVT优点这样做的好处是处理器内核可以使用虚拟地址进行cache
    发表于 06-20 15:22

    用户态得到虚拟地址对应的物理地址

    一般我们不需要从用户态得到进程虚拟地址对应的物理地址,因为一般来说用户进程是完全不关心物理地址的。
    的头像 发表于 10-10 14:10 2180次阅读
    用户态得到<b class='flag-5'>虚拟地址</b>对应的物理<b class='flag-5'>地址</b>

    鸿蒙内核中虚拟地址与物理地址之间是如何映射的

    虚拟地址(VA): 就是线性地址 鸿蒙内存部分全是VA的身影 是由编译器和链接器在定位程序时分配的,每个应用程序都使用相同的虚拟内存地址空间,而这些虚拟内存地址空间实际上分别映射到不同
    发表于 11-19 14:45 9次下载
    鸿蒙内核中<b class='flag-5'>虚拟地址</b>与物理<b class='flag-5'>地址</b>之间是如何映射的

    内核逻辑地址和内核虚拟地址到底有什么区别

      1) 凡是通过MMU页表访问的地址都叫虚拟地址,而一旦启用了MMU,那CPU发出的所有地址都是虚拟地址内核用到的地址范围是3G-4G(不
    发表于 03-11 10:10 6次下载

    虚拟地址和逻辑地址的区别是什么?

    先解释下一个困扰了我很久的问题:虚拟地址(vitural address)和逻辑地址(logical address)的区别。 大部分操作系统的书籍要么写的是虚拟地址,要么写的是逻辑地址
    的头像 发表于 06-17 14:08 2.1w次阅读
    <b class='flag-5'>虚拟地址</b>和逻辑<b class='flag-5'>地址</b>的区别是什么?

    虚拟地址物理地址等众多地址及MMU相关知识

    虚拟地址物理地址等众多地址及MMU相关知识先聊聊存储器STM32单片机存储器关于编译器生成的文件数据在存储器上的存储结构物理地址虚拟地址
    发表于 12-08 12:36 12次下载
    <b class='flag-5'>虚拟地址</b>物理<b class='flag-5'>地址</b>等众多<b class='flag-5'>地址</b>及MMU相关知识

    为什么要用MMU?为什么要用虚拟地址

    既然MMU开启后,硬件会自动的将虚拟地址转换成物理地址,那么还需要我们软件做什么事情呢?即创建一个页表翻译都需要做哪些事情呢?或者说启用一个MMU需要软件做什么事情呢?
    的头像 发表于 04-26 14:37 3890次阅读

    虚拟地址翻译物理地址的流程有哪些呢?

    现代的操作系统将可执行文件加载后,创建了进程,进程中每一条指令和数据都被分配了一个虚拟地址,CPU获取到这个虚拟地址后,需要翻译成内存的物理地址后,才能访问指令和数据
    的头像 发表于 08-14 10:30 571次阅读
    <b class='flag-5'>虚拟地址</b>翻译物理<b class='flag-5'>地址</b>的流程有哪些呢?

    Linux系统为什么需要引入虚拟地址

    ,这 4GB 的内存空间按照 3:1 的比例进行分配,其中用户进程享有 3G 的空间,而内核独自享有剩下的1G 空间,如下所示: 虚拟地址会通过硬件MMU(内存管理单元)映射到实际的物理地址空间中,建立虚拟地址到物理
    的头像 发表于 10-07 17:28 544次阅读
    Linux系统为什么需要引入<b class='flag-5'>虚拟地址</b>

    Linux虚拟地址空间和物理地址空间的关系

    过程,这其实也是MMU的工作原理。 我们知道,在Linux中,每个进程都有自己独立的地址空间,且互不干扰。每个进程的地址空间又分为用户空间和内核空间,但这些地址空间使用的都是
    的头像 发表于 10-08 11:40 510次阅读
    Linux<b class='flag-5'>虚拟地址</b>空间和物理<b class='flag-5'>地址</b>空间的关系

    Linux虚拟地址到物理地址转换过程

    虚拟地址到物理地址转换过程 虚拟地址和物理地址都被划分了两部分: 虚拟地址虚拟页面号VPN和
    的头像 发表于 10-08 11:45 862次阅读
    Linux<b class='flag-5'>虚拟地址</b>到物理<b class='flag-5'>地址</b>转换过程

    虚拟内存到物理地址的转换

    处理器根据页表基地址控制寄存器TTBCR和虚拟地址来判断使用哪个页表基地址寄存器,是TTBR0还是TTBR1。(一个基值是内核的,一个用户态的) 页表基
    的头像 发表于 10-30 17:34 397次阅读
    <b class='flag-5'>虚拟</b>内存到物理<b class='flag-5'>地址</b>的转换

    MMU虚拟地址空间布局

    当然虚拟地址空间划分不只是如此。因为目前应用程序没有那么大的内存需求,所以ARM64处理器不支持完全的64位虚拟地址,实际支持情况如下。 (1)-
    的头像 发表于 11-26 16:35 575次阅读