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

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

3天内不再提示

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

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

这个概念在大概14年前第一次接触,当时本科的专业并不是计算机,记得当时坐在图书馆里抱着一本书硬啃,一直想把这个概念弄清楚。

费尽力气却仍然似是而非,似懂非懂,因此挫败感很大;后来读研后,方向一直不在这里,也没有再去看,但是当时抱着一本书“深入理解计算机系统”看了好多年,断断续续,仍然觉得没有真正理解。

后来工作后,一头扎在了各种小型芯片的设计中,各种ip的设计,各种SoC层面的调度调式,CPU性能加速优化,和interwetten与威廉的赔率体系 的各种掰扯,和软件一起定位各种奇怪的问题,因为数字系统比较小,距离“虚拟存储器”更加遥远了;后来又做了一个中型的系统,说是中型,也就是大几百万门的系统,但是在和软件的各种扯皮中,确实看到了复杂系统软件健壮性的严峻挑战,定位问题的困难程度,可是仍然没有接触“虚拟存储器”;再后来,终于看到了真正的大系统,正经的正在做的芯片中使用了“虚拟存储器”的概念。

终于,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

    文章

    19265

    浏览量

    229684
  • cpu
    cpu
    +关注

    关注

    68

    文章

    10855

    浏览量

    211610
  • 操作系统
    +关注

    关注

    37

    文章

    6808

    浏览量

    123292
  • 虚拟存储器
    +关注

    关注

    0

    文章

    12

    浏览量

    8782
  • 编译器
    +关注

    关注

    1

    文章

    1624

    浏览量

    49111
收藏 人收藏

    评论

    相关推荐

    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 2506次阅读
    用户态得到<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.4w次阅读
    <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 4928次阅读

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

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

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

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

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

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

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

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

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

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

    MMU虚拟地址空间布局

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