ARM有7个基本的工作模式
用户模式(USR):用户模式是用户程序的工作模式,它运行在操作系统的用户态,它没有权限去操作其它硬件资源,只能执行处理自己的数据,也不能切换到其它模式下,要想访问硬件资源或切换到其它模式只能通过软中断或产生异常。
系统模式(SYS):系统模式是特权模式,不受用户模式的限制。用户模式和系统模式共用一套寄存器,操作系统在该模式下可以方便的访问用户模式的寄存器,而且操作系统的一些特权任务可以使用这个模式访问一些受控的资源。
说明:用户模式与系统模式两者使用相同的寄存器,都没有SPSR(Saved Program Statement Register,已保存程序状态寄存器),但系统模式比用户模式有更高的权限,可以访问所有系统资源
快中断模式(FIQ):支持高速数据传输及通道处理,FIQ异常响应时进入此模式。快速中断模式是相对一般中断模式而言的,它是用来处理对时间要求比较紧急的中断请求,主要用于高速数据传输及通道处理中。
中断模式(IRQ):用于通用中断处理,IRQ异常响应时进入此模式,一般中断模式也叫普通中断模式,用于处理一般的中断请求,通常在硬件产生中断信号之后自动进入该模式,该模式为特权模式,可以自由访问系统硬件资源。
管理模式(SVC):操作系统保护模式,系统复位和软件中断响应时进入此模式(由系统调用执行软中断SWI命令触发)。管理模式是CPU上电后默认模式,因此在该模式下主要用来做系统的初始化,软中断处理也在该模式下。当用户模式下的用户程序请求使用硬件资源时,通过软件中断进入该模式。系统复位或开机、软中断时进入到SVC模式下。
中止模式(ABT):用于支持虚拟内存和/或存储器保护,在ARM7TDMI没有大用处。中止模式用于支持虚拟内存或存储器保护,当用户程序访问非法地址,没有权限读取的内存地址时,会进入该模式,linux下编程时经常出现的segment fault通常都是在该模式下抛出返回的。
未定义模式(UND):未定义模式用于支持硬件协处理器的软件仿真,CPU在指令的译码阶段不能识别该指令操作时,会进入未定义模式。
工作模式的理解
不同模式拥有不同权限
不同模式执行不同代码
不同模式完成不同的功能
当前操作系统正在执行用户程序,那么当前CPU工作在用户模式,这时网卡上有数据到达,产生中断信号,CPU自动切换到一般中断模式下处理网卡数据(普通应用程序没有权限直接访问硬件),处理完网卡数据,返回到用户模式下继续执行用户程序。
特权模式
除用户模式外,其它模式均为特权模式(Privileged Modes)。ARM 内部寄存器 和一些 片内外设 在硬件设计上只允许(或者可选为只允许)特权模式下访问。此外,特权模式可以自由的切换处理器模式,而用户模式不能直接切换到别的模式。
异常模式
特权模式中除系统(system)模式之外的其他5种模式又统称为异常模式。它们除了可以通过在特权下的程序切换进入外,也可以由特定的异常进入。比如硬件产生中断信号进入中断异常模式,读取没有权限数据进入中止异常模式,执行未定义指令时进入未定义指令中止异常模式。其中管理模式也称为超级用户模式,是为操作系统提供软中断的特有模式,正是由于有了软中断,用户程序才可以通过系统调用切换到管理模式
异常级别
ARM64处理器异常定义:4个异常级别
- ARM64处理器有4个异常级别:0·3。异常级别越高,权限越高。
- 通常ARM64处理器在异常级另刂0执行进程,在异常级1执行内核。ARM64处理器的异常级另刂0就是我们月井的用户模式,异常级别1就是我们所讲的内核模式。
- 虚拟机是目前流行的虚拟化技术,在计算机上创建一个虚拟机,在虚拟机里面运行一个操作系统,运行虚拟机的操作系统称为宿主操作系统(host(S),虚拟机里面的操作系统称为客户操作系统(guest(S)。常用的开源虚拟机管理软件是QEMIJ,QEMU支持基于内核的虚拟机(KVM,Kernel-basedvirtualMachine)。KVM的主要特点是直接在处理器上执行客户操作系统,所以虚拟机的执行速度很快。KVM是内核的一个模块,把内核变成虚拟机监控程序。
宿主操作系统中的进程在异常级别0运行,内核在异常级别1运行KVM模块可以穿越异常级别1和2;客户操作系统中的进程在异常级别0运行,内核在异常级别1运行。在宿主操作系统的异常级别1和客户操作系统异常级别1之间切换时,需要KVM陷入异常级别2。
为了提高切换速度,ARM64架构引入虚拟化宿主扩展,在异常级另刂2执行宿主操作系统的内核,从QEMU切换到客户操作系统的时候,KVM不再需要从异常级别1切换到异常级别2。
ARM64架构安全扩展定义两种安全状态:正常世界和安全世界。这两个世界只能通过异常级别3的安全监控器切换。
异常分类
在ARM64体系结构中,异分为同步异常和异步异常
- 异步异常:不是由正在执行的指令生成的,和正在执行的指令没有关系。
- 同步异常:试图执行指令时生成的异常,或者作为指令的执行结果生成的异常。
同步异常
- 系统调用:异常级别0使用svc指令陷入异常级别1,异常级别1使用hvc指令陷入异常级别2,异常级别2使用smc指令陷入异常级别3。
- 数据中上:访问数据时的页错误异常,虚拟地址没有映射到物理地址,或者没有写权限。
- 指令中止:取指令时的页错误异常,虚拟地址没有映射到物理地址,或者没有执行权限。
- 栈指针或指令地址没有对齐、没有定义的指令、调度异常。
异步异常
- 中断(IRQ,normalpriorityinerrupt),即普通优先级的中断;
- 快速中断(FIQ,fast interrupt),即高优先级的中断;
- 系统错误(SE,Systemerror),是由硬件误触发的异常,比如最常见把脏数据从缓存行写回内存时触发异步的数据中止异常。