对于现代操作系统,通常情况下用户的应用程序运行在用户态,操作系统内核运行在内核态。用户态的应用对于系统硬件资源的访问是受限的,内核态则能够访问所有的系统硬件资源。操作系统的用户态和内核态是根据处理器的特权等级和运行模式进行硬件隔离的,这也极大的提高了操作系统的安全性。
安全扩展和虚拟化扩展
armv7-a体系结构支持安全扩展和虚拟化扩展。当处理器实现了安全扩展之后,处理器就存在普通世界(normal world)和安全世界(secure world)这两个世界,这在硬件层面上就可以将敏感数据和要求在安全环境运行的应用和普通应用完全隔离,如下图所示:
snipaste_2023-08-31_19-16-22
当处理器实现了虚拟化扩展之后,处理器就新增了一个hypervisor mode (hyp),并且也新增了一个特权级模式pl2。支持虚拟化扩展的处理器示意图如下所示:
snipaste_2023-08-31_19-28-22
虚拟化扩展允许在normal world运行多个操作系统,hypervisor只能运行在normal world。secure world可以运行trusted os和trusted services。
特权等级
处理器的模式,特权等级和安全状态的关系如下图所示:
snipaste_2023-08-31_19-48-19
本文仅讨论非安全状态。在非安全状态下,存在3种特权等级(privilege level):pl0、pl1和pl2,描述如下:
pl0:用户模式(user mode)运行的应用程序处于pl0特权等级。运行在用户模式的程序被称为非特权程序。非特权程序对于系统资源的访问是受限的,对应linux的用户态。
pl1:除了用户模式和hyp模式外,其他模式下的程序执行都处于pl1特权等级。pl1模式是指除了用户模式和hyp模式之外的其他模式。操作系统运行在pl1特权级。
pl2:如果实现了虚拟化扩展,hyp模式运行的系统管理程序处于pl2特权等级。系统管理程序将控制并启用多个操作系统在同一个处理器系统上共存和执行。
处理器模式
armv7-a体系结构提供了9种处理器模式,如下图所示:
snipaste_2023-09-01_20-59-03
从上图可以知道armv7-a提供的处理器模式有user、fiq、irq、supervisor(svc)、monitor(mon)、abort(abt)、hyp、undefined(und)、system(sys)模式,各个处理器模式的描述如下:
user:用户模式,用户程序运行在user模式下,拥有受限的系统资源访问权限。
fiq:快中断异常处理模式,发生fiq中断时的处理器模式,相对于中断而言,快中断拥有更高的响应等级和更低的延迟。
irq:中断异常处理模式,发生irq中断时的处理器模式。
supervisor(svc):管理员模式,操作系统内核通常运行在该模式下,在处理器复位或者应用程序调用svc指令的时候将会进入到该模式,系统调用就是通过svc指令完成的。
abort(abt):异常终止模式,当发生data abort exception或者prefetch abort exception异常的时候进入这个模式。
undefined(und):未定义指令模式,当执行未定义指令时进入这个模式。
system(sys):系统模式,系统模式和用户模式共享寄存器视图,并且目前大多数系统未使用该模式,利用这个特性我们可以在处理器启动时通过设置系统模式的sp寄存器来达到设置用户模式堆栈的目的,要设置用户模式的其他寄存器也可以这样操作。
monitor(mon):监视模式,实现了安全扩展的处理器才有该模式,在该模式下执行secure和non-secure处理器状态的切换。
hyp:实现了虚拟化扩展的处理器才有该模式。
user模式处于pl0特权等级。
fiq、irq、supervisor(svc)、monitor(mon)、abort(abt)、undefined(und)、system(sys)这些模式处于pl1特权等级。
hyp模式处于pl2特权等级。
本文不讨论支持安全扩展和虚拟化扩展的场景,因此对于monitor模式和hyp模式也不做深入探讨。
通常情况下,应用程序运行在user模式(pl0),运行在user模式下的应用程序对硬件没有直接访问权,所有的硬件操作都需要通过系统调用向内核进行申请。操作系统内核运行在管理员模式(pl1),对系统调用、中断、异常等系统事件进行响应、处理并返回,以这种硬件隔离的方式保证了操作系统内核的安全。
以linux操作系统为例,虽然armv7-a体系结构的处理器有9种模式,但是操作系统只工作在svc和usr模式,svc处于内核态,usr处于用户态。至于其他的异常模式,linux只是简单的略过。比如中断模式irq,linux只有很短的汇编代码在irq模式运行,主要是保存上下文,然后就立马切换到了svc模式,由内核进行统一处理。
寄存器集
armv7-a体系结构的处理器在不同处理器模式下,对于通用寄存器的使用情况也有所不同,如下图所示:
snipaste_2023-09-01_21-20-36
上图中蓝色背景的寄存器属于bank寄存器,也就是相同的寄存器名对应不同的寄存器实体。从上图可以看出:
r0~r7,pc在所有模式下是共享的。
系统模式和用户模式共享寄存器视图,系统模式没有bank寄存器。
fiq 模式下,r8~r12、sp、lr 都是该模式专门的寄存器,fiq比irq响应和处理速度更快,也得益于fiq模式具有比irq模式更多的bank寄存器。
fiq、irq、abt、svc和und模式,都有他们自己模式下专用的sp和lr,也就是说,在模式切换的时候,不需要针对这两个寄存器进行现场保护和恢复;
fiq、irq、abt、svc和und模式,都有他们自己模式下专用的spsr。在处理器发生中断或者异常时,处理器会自动的从一个模式a进入到另一个模式b,模式a的cpsr/apsr将会自动保存到模式b的spsr中,这样模式b中的处理程序能够通过访问spsr寄存器得到模式a下cpsr寄存器的信息。
处理器模式切换
armv7-a体系结构的处理器,处理器模式是由状态寄存器cpsr的m域(bit[4:0])来控制的。对于用户模式而言,是没有权限操作cpsr寄存器的m域的,只能通过svc指令进入到svc模式。对于sys、fiq、irq、abt、svc和und模式而言,可以通过给cpsr寄存器的m域赋值来达到切换处理器模式的目的。各个模式的编码如下图所示:
snipaste_2023-09-01_20-59-03
下述代码简单的演示了处理器模式切换:
reset_handler:cpsid i// ...// 切换到irq模式,并设置irq模式的堆栈cps #0x12ldr sp, =0x9ff00000// 切换到sys模式,并设置sys模式的堆栈// 由于sys模式和usr模式共享寄存器视图,sys模式一般情况下没有被使用,// 因此这里相当于在设置usr模式的堆栈cps #0x1fldr sp, =0x9fe00000// 切换到svc模式,并设置svc模式的堆栈cps #0x13ldr sp, =0x9fd00000// ...cpsie i// ...
在上述代码中,使用了cps #mode指令来完成处理器模式的切换,在切换到相应模式之后,设置了对应模式的堆栈。
在上述代码中,为什么不直接切换到usr模式,再设置usr模式的堆栈,而要借助sys模式来设置usr模式的堆栈呢?这个问题相信大家在学习了本节内容之后,应该还是比较简单的。
保护电动汽车和充电站:解决车辆和用户的网络安全问题
论新一代焊接趋势
复亚宣布已成功实现无人机自动巡逻、巡检高速公路
正式超越联发科,华为麒麟成市场份额第二大安卓芯片
大屏版小米6人脸解锁来袭?苹果新机演示人脸解锁失败?人脸解锁被网友玩坏!是大趋势?
ARMv7-A处理器模式与特权等级
回顾任正非 董明珠 褚时健 宗庆后他们的感人发言
定子串电阻减压起动控制电路
变频串联谐振试验装置常见故障及注意事项
【AI简报20230707】中国团队推出「全球首颗」AI 全自动设计 CPU!重磅,GPT-4 API 全面开放使用!
优化RF调谐电路的性能
投影仪亮度不够_投影仪怎么调亮度_投影仪亮度越高越好吗
华为P10只是其一,华为新品这次还有“双保险”!
华为P10国行版售价曝光 这价格让人措不及防!
如何通过专用LTE系统提供公共安全保障
COLMO重新定义家用中央空调 撬动高阶消费需求
物联网的智能配电室综合监控系统的研究应用
2012西部电子论坛再次起航,共拓西部热门市场
北京市经济和信息化局印发《北京市5G产业发展行动方案(2019年-2022年)》
常见的几种星载SAR传感器