ARMv7-A 那些事 - 4.处理器模式与特权等级

news2024/11/24 19:39:30

By: Ailson Jack
Date: 2023.09.23
个人博客:http://www.only2fire.com/
本文在我博客的地址是:http://www.only2fire.com/archives/156.html,排版更好,便于学习,也可以去我博客逛逛,兴许有你想要的内容呢。

对于现代操作系统,通常情况下用户的应用程序运行在用户态,操作系统内核运行在内核态。用户态的应用对于系统硬件资源的访问是受限的,内核态则能够访问所有的系统硬件资源。操作系统的用户态和内核态是根据处理器的特权等级和运行模式进行硬件隔离的,这也极大的提高了操作系统的安全性。

安全扩展和虚拟化扩展

ARMv7-A体系结构支持安全扩展和虚拟化扩展。当处理器实现了安全扩展之后,处理器就存在普通世界(Normal world)和安全世界(Secure world)这两个世界,这在硬件层面上就可以将敏感数据和要求在安全环境运行的应用和普通应用完全隔离,如下图所示:

在这里插入图片描述
当处理器实现了虚拟化扩展之后,处理器就新增了一个hypervisor mode (Hyp),并且也新增了一个特权级模式PL2。支持虚拟化扩展的处理器示意图如下所示:

在这里插入图片描述
虚拟化扩展允许在Normal world运行多个操作系统,Hypervisor只能运行在Normal world。Secure world可以运行Trusted OS和Trusted services。

特权等级

处理器的模式,特权等级和安全状态的关系如下图所示:

在这里插入图片描述
本文仅讨论非安全状态。在非安全状态下,存在3种特权等级(Privilege level):PL0、PL1和PL2,描述如下:

  • PL0:用户模式(User mode)运行的应用程序处于PL0特权等级。运行在用户模式的程序被称为非特权程序。非特权程序对于系统资源的访问是受限的,对应Linux的用户态。
  • PL1:除了用户模式和Hyp模式外,其他模式下的程序执行都处于PL1特权等级。PL1模式是指除了用户模式和Hyp模式之外的其他模式。操作系统运行在PL1特权级。
  • PL2:如果实现了虚拟化扩展,Hyp模式运行的系统管理程序处于PL2特权等级。系统管理程序将控制并启用多个操作系统在同一个处理器系统上共存和执行。

处理器模式

ARMv7-A体系结构提供了9种处理器模式,如下图所示:

在这里插入图片描述
从上图可以知道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体系结构的处理器在不同处理器模式下,对于通用寄存器的使用情况也有所不同,如下图所示:

在这里插入图片描述
上图中蓝色背景的寄存器属于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域赋值来达到切换处理器模式的目的。各个模式的编码如下图所示:

在这里插入图片描述
下述代码简单的演示了处理器模式切换:

Reset_Handler:
	cpsid i

	// ...
	// 切换到IRQ模式,并设置IRQ模式的堆栈
	cps #0x12
	ldr sp, =0x9FF00000
	
	// 切换到SYS模式,并设置SYS模式的堆栈
	// 由于SYS模式和USR模式共享寄存器视图,SYS模式一般情况下没有被使用,
	// 因此这里相当于在设置USR模式的堆栈
	cps #0x1f
	ldr sp, =0x9FE00000
	
	// 切换到SVC模式,并设置SVC模式的堆栈
	cps #0x13
	ldr sp, =0x9FD00000
	// ...

	cpsie i
	
	// ...

在上述代码中,使用了cps #mode指令来完成处理器模式的切换,在切换到相应模式之后,设置了对应模式的堆栈。

在上述代码中,为什么不直接切换到USR模式,再设置USR模式的堆栈,而要借助SYS模式来设置USR模式的堆栈呢?这个问题相信大家在学习了本节内容之后,应该还是比较简单的。

欢迎关注博主的公众号呀(微信搜索公众号:嵌入式那些事),可以扫描下面的公众号二维码(如果公众号图片被CSDN处理了,也可以直接访问我的个人博客文章获取公众号二维码图片):

在这里插入图片描述
如果文中有什么问题欢迎指正,毕竟博主的水平有限。

如果这篇文章对你有帮助,记得点赞和关注博主就行了^_^。

排版更好的内容见我博客的地址:http://www.only2fire.com/archives/156.html

注:转载请注明出处,谢谢!^_^

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1034501.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二、iMove-cli 本地开发模式

引言:iMove cli肩负着落库逻辑代码的重要责任,本文主要介绍本地开发模式下cli的工作。 书接上文,iMove主要由3个包组成:cli、compile-code、core,此外还有一个插件库plugin-store,这个后续文章再出&#xf…

机器学习的数据

数据 数据整体的信息 我们整个数据就可以表示成这样 上图中的数据整体叫数据集(data set)图中每一行数据称为一个样本(sample)。除最后一列,每一列表达样本的一个特征(feature)最后一列称为标记(label) 除了第一行和最后一列以外的信息就是…

el table 修改鼠标在行上改变背景颜色

el table 在制作的时候&#xff0c;需要修改当鼠标停留在指定行上的时候&#xff0c;修改背景颜色等相关样式。 这里面记录一下 1. 首先&#xff0c;在table上面添加class&#xff0c;如下图: 2. 然后再最下面下面创建style样式&#xff0c;是<style scoped> 的&#x…

滑动窗口9.23

1876.长度为3且各字符不同的子字符串 1876. 长度为三且各字符不同的子字符串 - 力扣&#xff08;LeetCode&#xff09;https://leetcode.cn/problems/substrings-of-size-three-with-distinct-characters/?envTypelist&envId24zW97w8自写思路&#xff1a; 数组充当哈希表…

Spring面试题16:Spring框架中的单例bean是线程安全的吗?Spring框架中bean的生命周期?哪些是重要的bean生命周期方法?

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:Spring框架中的单例bean是线程安全的吗?为什么? 是的,Spring框架中的单例Bean是线程安全的。 Spring中的单例Bean默认是在容器启动时创建的,并…

【Cpp】位图Bitmap

code #include <iostream> #include <vector> #include <stdio.h> #include <stdint.h>class Bitmap { private:std::vector<uint8_t> data; // 存储位图数据的字节数组uint32_t size; // 位图的大小&#xff08;以位为单位&#x…

springboot整合aop,实现日志操作

前言&#xff1a; 整合之前&#xff0c;我们要明白aop是什么&#xff0c;为什么要用aop&#xff0c;aop能帮我们做什么。 答&#xff1a;AOP是面向切面编程&#xff08;Aspect-Oriented Programming&#xff09;的简称&#xff0c;它是一种编程思想&#xff0c;旨在在面向对象…

【AI视野·今日Sound 声学论文速览 第十期】Fri, 22 Sep 2023

AI视野今日CS.Sound 声学论文速览 Fri, 22 Sep 2023 Totally 1 papers &#x1f449;上期速览✈更多精彩请移步主页 Daily Sound Papers Performance Conditioning for Diffusion-Based Multi-Instrument Music Synthesis Authors Ben Maman, Johannes Zeitler, Meinard M lle…

数据库中的DDL与DML

标签&#xff1a;数据库 记录下DDL和DML的相关概念。 数据定义语言 定义数据库模式 数据定义语言DDL(Data-Definition Language)可定义数据库模式。数据库模式在之前的文章中已经提到过了。简单来说&#xff0c;建表用的SQL语句就是DDL。如下代码 CREATE TABLE department(de…

使用Python做一个微信机器人

介绍 简介 该程序将微信的内部功能提取出来&#xff0c;然后在程序里加载Python&#xff0c;接着将这些功能导出成库函数&#xff0c;就可以在Python里使用这些函数 程序启动的时候会执行py_code目录下的main.py&#xff0c;类似于你在命令行使用python main.py。 现在会以…

用《斗破苍穹》的视角打开C#多线程开发1(斗帝之路)

Thread.Start() 是的&#xff0c;我就是乌坦城那个斗之气三段的落魄少爷&#xff0c;在我捡到那个色眯眯的老爷爷后&#xff0c;斗气终于开始增长了。在各种软磨硬泡下&#xff0c;我终于学会了我人生中的第一个黄阶斗技——吸掌。 using System.Threading;namespace Framewo…

第一部分:HTML5

一&#xff1a;网页 1.1&#xff1a;什么是网页&#xff1f; 网站是指在因特网上根据一定的规则&#xff0c;使用HTML等制作的用于展示特定内容相关的网页集合 网页是网站中的一"页"&#xff0c;通常是HTML格式的文件&#xff0c;它要通过浏览器来阅读 网页是构成网…

透视俄乌网络战之四:西方科技巨头的力量

透视俄乌网络战之一&#xff1a;数据擦除软件 透视俄乌网络战之二&#xff1a;Conti勒索软件集团&#xff08;上&#xff09; 透视俄乌网络战之三&#xff1a;Conti勒索软件集团&#xff08;下&#xff09; 西方科技巨头的力量 1. Palantir2. SpaceX3. Maxar Technologies4. Cl…

送水订水小程序商城的作用是什么?

桶/瓶装水有很高的市场需求度&#xff0c;除了家庭外&#xff0c;部分办公场几乎每天都会订水且有一定的合作&#xff0c;由于没有空间限制&#xff0c;因此对桶装水商家来说&#xff0c;本地和外地客户都有较高的拓展度&#xff0c;而传统电话、微信私信订购宣传方式低效且不智…

10.5 串联型稳压电路(1)

稳压管稳压电路输出电流较小&#xff0c;输出电压不可调&#xff0c;不能满足很多场合下的应用。串联型稳压电路以稳压管稳压电路为基础&#xff0c;利用晶体管的电流放大作用&#xff0c;增大负载电流&#xff1b;在电路中引入深度电压负反馈使输出电压稳定&#xff1b;并且&a…

ElasticSearch - 分布式搜索引擎底层实现——倒排索引

目录 一、ElasticSearch 1.1、ElasticSearch 是什么&#xff1f; 1.2、ElasticStack 是什么? 1.3、正向索引和倒排索引 1.3.1、正向索引 1.3.2、倒排索引 a&#xff09;倒排索引的创建过程&#xff1a; b&#xff09;倒排索引的查询过程&#xff1a; c&#xff09;分…

三、初识FreeRTOS之FreeRTOS基础知识

从这节开始&#xff0c;我们正式学习FreeRTOS的一些基础知识&#xff0c;争取做到日更&#xff0c;或者隔日更。如果在学习的过程中哪里有理解错误&#xff0c;希望各位朋友批评指正。因为自己觉得图文并茂好像更容易理解一点&#xff0c;所以在博文中加了大量的图片&#xff0…

Tomcat部署、优化、以及操作练习

一.Tomcat的基本介绍 1.1.Tomcat是什么&#xff1f; Tomcat服务器是一个免费的开放源代码的Web应用服务器&#xff0c;属于轻量级应用服务器&#xff0c;在中小型系统和并发访问用户不是很多的场合下被普遍使用&#xff0c;是开发和调试JSP程序的首选。一般来说&#xff0c;T…

APM32F0XX/STM32F0XX内部参考电压VREFINT反算ADC引脚电压

首先打开极海APM32F030x4x6x8xC 用户手册找到VREFINT。 找到内部参考电压 VREFINT为ADC1_IN17通道 使用VREFINT必须使能VREFEN位 初始化ADC代码 void ADC_Init(void) {GPIO_Config_T gpioConfig;ADC_Config_T adcConfig;/* Enable GPIOA clock */RCM_Ena…

Redis学习笔记--002

Redis的JAVA客户端 文章目录 Redis的JAVA客户端一、Redis的Java客户端的种类二、Jedis2.1、使用步骤2.2、Jedis连接池 三、[SpringDataRedis](https://spring.io/projects/spring-data-redis)3.1、介绍3.2、RedisTemplate3.3、SpringDataRedis使用步骤3.4、SpringDataRedis的序…