[笨叔点滴2] 为啥子ARM32体系结构中每个处理模式都有一个单独的栈?
“ 各位小伙伴,我是小笨叔。笨叔尽量每天给大家分享一点点小东西,可能是笨笨的、傻傻的、甜甜的、酸酸的小点滴,记录这每一刻每一天的小感悟,就像小雨点一样,它会慢慢汇合到大江大海!”
上次提到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的意思。简单来说:
PL0模式:用户模式,等同于以前的USER模式
PL1操作系统模式:包含以前的SVC模式,IRQ模式,FIQ模式
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上,异常分成两种:
同步异常:比如MMU的一些访问权限问题
异步异常:这个就大家常见的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体系结构中每个处理模式都有一个单独的栈?相关推荐
- [笨叔点滴3] “栈”谁便宜了?
" 有一次和女同学A吃饭,她带着小姑凉一块.在吃饭期间,同学给夹了块豆腐,小姑凉用天真无邪的眼神看着我:笨叔,你除了占我妈便宜,你还占过谁的便宜? 我顿时无语了..." 上面是网 ...
- [笨叔点滴6] 叔,这个git咋玩啊?
"今天在食堂门口遇到了暗恋已久的女神,女神笑着给我递了张纸条就进食堂了,我打开纸条看到上面写的两个字"钙氧钨氧",我以为是瞎写的就扔了,晚上我睡觉时越想越不对劲,现在我肠 ...
- 水货笨叔介绍MCS锁
前几天小明同学和笨叔抱怨:现在的spinlock锁的代码变得越来越复杂了,我都看不懂了.的确spinlock的代码从原来简单的几行代码,变成现在复杂的几百行,除了代码变得复杂,里面隐含的原理也不简单. ...
- Android 的简介和体系结构中每个层的功能。
Android 的简介和体系结构中每个层的功能. 1.简介 Android是由Google公司和开放手机联盟领导并开发的一种基于Linux的自由且开放源代码的操作系统,主要使用于移动设备. Andro ...
- 敲黑板 划重点 网络安全体系的9大知识点都在这里
敲黑板 划重点 网络安全体系的9大知识点都在这里 首席数字官 2020-09-25 18:21:05 文丨赵博智 编辑丨秦丽 来源丨首席数字官 在新基建浪潮之下,云计算.大数据.物联网.人工智能为代表 ...
- 量子计算机的基本构成,量子计算机的硬件单元 文/李联宁 1. 量子寄存器 存储一系列量子比特的体系称为量子寄存器。假设有一个由3比特构成的寄存器,在经典计算机中,可... - 雪球...
来源:雪球App,作者: 书生剑客,(https://xueqiu.com/3993902801/178623085) 文/李联宁 1. 量子寄存器 存储一系列量子比特的体系称为量子寄存器.假设有一个 ...
- 戴冀峰:城市中心体系与公共交通模式耦合发展——《大伦敦规划》的经验与启示...
" 写在前面: 城市中心体系是制定并落实空间发展战略的核心内容,是优化空间结构的关键策略.城市中心体系与公共交通模式紧密耦合,是大伦敦空间发展战略的核心和标志性理念.首先,梳理大伦敦城镇中心 ...
- 深入原生冰山安全体系,详解华为云安全服务如何构筑全栈安全
摘要:如果把云安全比作"冰山",不仅要关注冰山上的"安全服务和特性",还要关注冰山下各种基础安全建设. 本文分享自华为云社区<深入原生冰山安全体系,详解华 ...
- ubantu 黑屏_死机黑屏专题上线啦,早鸟只要299,看完薪水翻一番
全程约5小时高清,140多页ppt,8大实验,基于x86_64的Centos 7.6和arm64,提供全套实验素材和环境.全面介绍kdump+crash在死机黑屏方面的实战应用,全部案例源自线上云服务 ...
最新文章
- 手机全部零件名称图片_机械制图零件测绘
- matplotlib 入门之Image tutorial
- 满城尽带比特币:程序员如何发布自己的 ICO?
- POJ 3624 Charm Bracelet
- android使用桢布局,Android 常用布局
- 依赖包报错Invalid options object. Less Loader has been initialized using an options object that does not
- executable file and DLL
- tp5使用layui表格_tp5+layui增、删、改、查。
- 卷积自编码器_GCLGP | 图卷积高斯过程
- Chrome去广告插件-Adblock Plus
- 制作纯天然无污染的微软官方win10Pe(超详细)
- (外接屏幕亮度控制软件)AOC显示器、Dell显示器
- Win10 ipv4无网络访问权限的解决办法
- 乘法鉴相器的matlab仿真,Matlab中基于dq变换的锁相环仿真研究
- C语言中IO模型实现并发服务器
- redis主从、集群
- 稀疏数组(二维数组)
- Pascal游戏开发入门(二):渲染图片
- Alextnet网络
- ubuntu、win跨平台局域网文件传输工具
热门文章
- 免费的仿真软件LTSpice
- 【JavaWeb开发】base64加密(利用java.util包)
- Unix系统环境中“I have no name!”用户名问题处理
- python自定义包出现ModuleNotFoundError: No module named ‘package_name‘故障
- python基础单词
- paste命令,合并多个文件的“同行数据”
- SpringCloud10 - 分布式配置中心--config
- 粤嵌GEC6818板子TCP网络编程发送命令控制音视频
- 全球及中国商业保理行业融资规模现状与盈利价值分析报告2022-2028年
- 物联网全栈教程--手把手教你开发一个智能浇花器