各位小伙伴,我是小笨叔。笨叔尽量每天给大家分享一点点小东西,可能是笨笨的、傻傻的、甜甜的、酸酸的小点滴,记录这每一刻每一天的小感悟,就像小雨点一样,它会慢慢汇合到大江大海!

上次提到LinuxCon大会,这种大会正如笨叔说的

“听君一席话,胜读十年书”

笨叔有幸在北京拜访了Linux社区里面一位老前辈,聆听他当年在80~90年代做CPU处理器体系结构和Linux操作系统的鲜为人知的历史和对人生和技术的感悟,让笨叔大受启发。

在闲谈中,他提到为什么ARM32的处理器需要7种处理器模式,而且每一种处理器模式都需要一个单独的栈空间?比如irq模式,为什么ARM32的设计里需要一个单独的irq模式,而且这个irq模式只有12个字节?为什么不和SVC模式公用一个栈呢?比如x86等传统经典的处理器架构里,是没有为irq单独开辟一个栈的。

这些是非常好的问题,引发了笨叔回到上海继续思考。本文抛砖引玉,希望有兴趣的小伙伴可以在文章后面留言发表您的观点。

01 ARM32上的设计

我们来看一下ARM32上,如果发生了一个irq中断,ARM32处理器是怎么处理的?我们知道ARM32里面有一个奇葩的7个工作模式:

如上图所示,在ARMV6之前,ARM的处理器模式有7个。正常的内核是跑在SVC模式的,用户态app是跑在User模式,而其他几个就是我们常说的IRQ中断,FIQ中断和几个异常模式。如果对比x86的话,x86只有ring0 ~ ring3这4个特权级别,内核跑着ring 0里,而用户态跑在ring 3里,而没有区分SVC模式,IRQ模式等。

我们在看看ARMv7上改进。

抛开secure模式不谈,在non-secure即normal world来说,ARMv7在继续沿用7个模式的基础上又区分了PL0模式和PL1和PL2模式, PL是privilege level的意思。简单来说:

  1. PL0模式:用户模式,等同于以前的USER模式

  2. PL1操作系统模式:包含以前的SVC模式,IRQ模式,FIQ模式

  3. PL2虚拟化模式:新增的模式,有点类似x86上虚拟化扩展的root模式

如果说ARM32的设计的合理的话,我们看看ARM v8里的设计。

ARMv8里面已经完全抛弃ARMv7之前的做法了,连名字都该了,现在叫做EL,也就是exception level,而且每一个EL级别的异常也变了。其中

名字改了之后,每个EL级别管辖的范围和权利就不一样了,是不是很像x86里面的ring0~ring3呢,谁叫你x86在PC和服务器上这么火呢?所以,x86上的优点,ARM当然要好好学习啦。

除了这个之外,还完全抛弃了SVC, IRQ, FIQ等等那7个模式了,这和ARMv7又有很多不同了。现在ARMv8上,异常分成两种:

  1. 同步异常:比如MMU的一些访问权限问题

  2. 异步异常:这个就大家常见的IRQ, FIQ, ERR

而且还有一点,ARMv8里面,不再为每个异常类型设置一个专门的栈,比如IRQ已经没有单独的栈了,现在的栈,只有每个EL才有栈。

02 ARM32中断栈

ARM32发生中断之后,IRQ栈和SVC栈的情况如下:

上述这个图就是ARM32在Linux内核中,发生IRQ中,栈的变化情况,大家可以看《奔跑吧Linux内核》第621~626页。总的来说,IRQ模式下面的栈值保存了发生中断那个现场的SPSR, LR, SP_IRQ三个寄存器的内容。然后切换模式到SVC模式,进一步保存通用寄存器到SVC的栈空间里。所以在ARM32里,中断发生之后,其实是使用了两个模式的栈,一个是IRQ的栈,另外一个SVC模式的栈,这个SVC的栈,在Linux内核里其实就是内核栈。

那在X86里,是怎么样的呢?x86处理器里有一个TSS(Task State Segment),当中断发生时,用户进程或者处于用户态(特权级3)或者处于内核态(特权级0),如果是在用户态,那么会发生栈的切换问题,也就是会切换到内核态的栈,如果是在内核态,那么就没有栈切换的问题。但是x86处理器在特权级0上只有一个ESP,这意味着中断发生后,只能使用一个栈,这个栈就是内核栈(kernel stack)。处理器的硬件逻辑会将被中断进程的下条指令(CS,EIP)以及EFLAG压入栈,当然如果发生用户态栈向内核态栈的切换,处理器还会把用户态的(SS, ESP)也压入栈,此时使用的就是内核栈。这个行为属于处理器的硬件逻辑范畴,不是系统软件的行为。

另外一方面,现在Linux内核在x86或者其他体系结构里,已经支持内核栈和中断栈分离的方法了。当然,这里说的中断栈不是本文说的那个CPU内部的中断栈,而是和内核栈类似的一个栈,也就是在中断处理程序中,和SVC模式使用的内核栈分离。这是内核设计的问题了,总之,中断栈可与内核栈共享,也可重新分配一个独立的中断栈。但是负面因素是中断栈如果发生嵌套,可能破坏内核栈的一些数据,因为毕竟共享,所以栈空间有时候难免会捉襟见肘。所以在x86的Linux中,总是使用分离的内核栈设计。系统中每个进程都会拥有属于自己的内核栈,而系统中每个CPU都将为中断处理准备了两个独立的中断栈,分别是hardirq栈和softirq栈。注意,这是OS的设计问题,不是今天我们想讨论的CPU硬件设计上的中断栈分离。

下面是Linux内核里面x86架构使用分离的中断栈的补丁。

https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=7974891db234467eaf1fec613ec0129cb4ac2332

那为啥子ARM32要为IRQ模式设置单独一个12字节的栈呢,而不是复用SVC模式的栈呢?

笨叔翻阅了ARM相关的技术文档也没找到答案,我猜测可能是因为一个重要的原因是ARM32这个架构设计的时候是90年代,那个年代的ARM处理器是相当慢的,单独一个IRQ栈可以提高中断的响应速度,特别是早期的ARM处理器主要应用场景是嵌入式系统,支持中断嵌套的方式。从上面的x86的分离的中断栈的patch来看,分离的中断栈的确有不少优势,至少可以保证不会导致SVC模式的栈发生overflow。那究竟是ARM32这种设计先进呢还是ARMv8和x86的设计理念先进呢,是进步还是倒退呢?我有点confuse了!

笨叔抛砖引玉,希望感兴趣的同学可以在后面留言,大家一起讨论。

[笨叔点滴2] 为啥子ARM32体系结构中每个处理模式都有一个单独的栈?相关推荐

  1. [笨叔点滴3] “栈”谁便宜了?

    " 有一次和女同学A吃饭,她带着小姑凉一块.在吃饭期间,同学给夹了块豆腐,小姑凉用天真无邪的眼神看着我:笨叔,你除了占我妈便宜,你还占过谁的便宜?  我顿时无语了..." 上面是网 ...

  2. [笨叔点滴6] 叔,这个git咋玩啊?

    "今天在食堂门口遇到了暗恋已久的女神,女神笑着给我递了张纸条就进食堂了,我打开纸条看到上面写的两个字"钙氧钨氧",我以为是瞎写的就扔了,晚上我睡觉时越想越不对劲,现在我肠 ...

  3. 水货笨叔介绍MCS锁

    前几天小明同学和笨叔抱怨:现在的spinlock锁的代码变得越来越复杂了,我都看不懂了.的确spinlock的代码从原来简单的几行代码,变成现在复杂的几百行,除了代码变得复杂,里面隐含的原理也不简单. ...

  4. Android 的简介和体系结构中每个层的功能。

    Android 的简介和体系结构中每个层的功能. 1.简介 Android是由Google公司和开放手机联盟领导并开发的一种基于Linux的自由且开放源代码的操作系统,主要使用于移动设备. Andro ...

  5. 敲黑板 划重点 网络安全体系的9大知识点都在这里

    敲黑板 划重点 网络安全体系的9大知识点都在这里 首席数字官 2020-09-25 18:21:05 文丨赵博智 编辑丨秦丽 来源丨首席数字官 在新基建浪潮之下,云计算.大数据.物联网.人工智能为代表 ...

  6. 量子计算机的基本构成,量子计算机的硬件单元 文/李联宁 1. 量子寄存器 存储一系列量子比特的体系称为量子寄存器。假设有一个由3比特构成的寄存器,在经典计算机中,可... - 雪球...

    来源:雪球App,作者: 书生剑客,(https://xueqiu.com/3993902801/178623085) 文/李联宁 1. 量子寄存器 存储一系列量子比特的体系称为量子寄存器.假设有一个 ...

  7. 戴冀峰:城市中心体系与公共交通模式耦合发展——《大伦敦规划》的经验与启示...

    " 写在前面: 城市中心体系是制定并落实空间发展战略的核心内容,是优化空间结构的关键策略.城市中心体系与公共交通模式紧密耦合,是大伦敦空间发展战略的核心和标志性理念.首先,梳理大伦敦城镇中心 ...

  8. 深入原生冰山安全体系,详解华为云安全服务如何构筑全栈安全

    摘要:如果把云安全比作"冰山",不仅要关注冰山上的"安全服务和特性",还要关注冰山下各种基础安全建设. 本文分享自华为云社区<深入原生冰山安全体系,详解华 ...

  9. ubantu 黑屏_死机黑屏专题上线啦,早鸟只要299,看完薪水翻一番

    全程约5小时高清,140多页ppt,8大实验,基于x86_64的Centos 7.6和arm64,提供全套实验素材和环境.全面介绍kdump+crash在死机黑屏方面的实战应用,全部案例源自线上云服务 ...

最新文章

  1. qdockwidget设置隐藏标题栏,重叠时tab标签位置,自动填充满整个窗口
  2. 【SVN】在阿里云上创建svn服务器
  3. c语言自动机的建立,C语言最优状态机规范
  4. SharePoint的Workflow History列表在哪里?
  5. 算法练习day12——190331(并查集)
  6. [蓝桥杯][2018年第九届真题]版本分支(离线LCA模板)
  7. [LevelDB] 写批处理过程详解
  8. java 方法 示例_Java集合checkedList()方法与示例
  9. ajax传值controller怎么写,ajax如何传递参数给controller
  10. 第3节:vue-router如何参数传递
  11. ScreenToGif – 免费开源 GIF 录屏制作软件之王!对比多款主流 GIF 工具我选了它
  12. ACM大学生程序设计竞赛在线题库最新精选题解(赵端阳)解析
  13. vscode 之 code lens
  14. HTML5 video 视频标签使用介绍
  15. 漫画 | 放弃吧,技术分享根本搞不起来!
  16. latex 花体之英文字母
  17. 如何成为一名区块链工程师? | 附学习资源
  18. 测试小兵成长记:新兵营
  19. 连接服务器没有发挥作用,iPhone“连到系统上的设备没有发挥作用”原因分析及解决方法...
  20. moles-packer_Hashicorp的Packer-是否适合PHP开发人员?

热门文章

  1. Codeforces #985C Liebig's Barrels
  2. OnJava8读书笔记(java编程思想)--集合Collections
  3. 关于Vite项目打包后浏览器兼容性问题的解决方案
  4. 商场内如何导航?有没有在商场用的导航?
  5. 全网最好开源springboot开发的erp模板下载
  6. WM通信信息管理类软件评测
  7. 欢乐球球改分java_欢乐球球怎么玩分数高的窍门图解
  8. SAP中关于发票日期和凭证日期的异同原因分析
  9. 用Python实现超级玛丽游戏【示例代码】
  10. 三、Win10系统怎么自动清理缓存,无需手动按时清理磁盘,自动释放空间哦