一、ARM处理器的七种工作模式
七种工作模式可以分为:一个用户模式与六个特权模式。其中,六个特权模式又可以分为五个异常模式与一个系统模式。
各模式的切换,可以是程序员通过代码主动切换(通过些CPSR寄存器);也可以
1.1 用户模式(User Mode,USR)
用户模式是ARM架构中的一种非特权模式,主要用于运行普通用户程序。用户模式限制了对系统资源的访问,通过系统调用(SWI) 请求操作系统执行特权操作。这种模式的限制可以防止用户程序对系统造成破坏,提高系统的安全性和稳定性。用户模式是多任务操作系统中运行用户任务的主要模式。
1.1.1 用户模式的特点
1.非特权模式
- 用户模式是非特权模式,不能直接访问硬件寄存器、内存映射区域或其他受保护的系统资源。
2.运行用户程序
- 用户模式主要用于运行普通用户程序,这些程序通常由应用程序开发者编写,用于完成特定的任务。
- 用户程序在用户模式下运行时,不能直接访问系统资源,但可以通过系统调用(SWI)请求操作系统内核执行特权操作。
3.系统调用(SWI)
- 用户程序可以通过执行系统调用(SWI)指令请求操作系统内核特权操作。
- 当执行SWI指令时,处理器会切换到管理模式(Supervisor Mode,SVC),操作系统内核会处理系统调用请求,并在完成后返回用户模式。
// 管理模式下的系统调用处理函数
void SVC_Handler(void)
{
// 执行特权模式下的代码
// 例如,修改系统状态,访问硬件寄存器等
}
4.异常处理
- 用户模式下的程序如果触发异常(如数据访问错误、非法指令等),处理器会切换到相应的异常处理模式(如中止模式ABT 或未定义模式UND)。
1.1.2 用户模式的使用场景
1.普通用户程序
- 大多数用户编写的程序都在用户模式下运行,这些程序可以访问普通内存区域,但不能直接访问硬件寄存器或其他受保护的系统资源。
2.多任务操作系统
- 在多任务操作系统中,用户模式用于运行用户任务,每个人物都在用户模式下运行,通过系统调用请求操作系统内核执行特权操作。
1.2 系统模式(System Mode,SYS)
系统模式(System Mode,SYS)是ARM架构中的一种特权模式,主要用于运行操作系统的内核任务。系统模式具有完全的访问权限,可以访问和操作所有系统资源。这种模式的设计使得操作系统内核能够在特权模式下执行,同时允许在某些情况下切换到其他模式。系统模式的灵活性使其在操作系统内核中非常有用,特别是在任务切换和系统调用处理等场景中。
使用和用户模式相同寄存器集的特权模式。
1.2.1 系统模式的特点
1.特权模式
系统模式是特权模式,具有完全的访问权限,可以访问和操作所有系统资源。
这种模式下的代码可以执行任何操作,包括修改系统状态,访问硬件寄存器等。
2.用于操作系统内核
- 系统模式通常用于操作系统的内核代码,这些代码需要完全访问权限来管理硬件资源和执行系统级操作。
例如,任务调度、中断管理、内存管理等操作通常在系统模式下执行。
3.自由切换模式
- 系统模式是唯一一个可以自由切换到其他模式的模式。这意味着在系统模式下,可以通过修改程序状态寄存器(CPSR)或切换堆栈指针(SPSR)来切换到其他模式。
这种灵活性使得系统模式在操作系统内核中非常有用,因为它允许内核在需要时切换到其他模式来处理特定的任务。
4.堆栈指针
- 在系统模式下,使用主堆栈指针(MSP)。这与线程模式(Thread Mode)和处理模式(Handler Mode)类似,但系统模式提供了更多的灵活性。
1.2.2 系统模式的使用场景
1.操作系统内核
- 系统模式主要用于允许操作系统的那个代码,这些代码需要完全访问权限来管理硬件资源和执行系统级操作。
例如,任务调度、中断管理、内存管理等操作通常在系统模式下执行。
2.任务切换
- 在任务切换过程中,操作系统内核通常在系统模式下执行上下文切换操作。
例如,保存当前任务的上下文信息,恢复下一个任务的上下文信息。
3.系统调用处理
- 当用户程序通过系统调用(SWI)请求操作系统内核执行特权操作时,处理器会切换到管理模式。在某些情况下,操作系统内核可能会在系统模式下处理这些请求。
1.3 中断模式(IRQ Mode)
中断模式(IRQ Mode)是ARM架构中的一种特权模式,专门用于处理普通中断请求。中断模式具有完全的访问权限,可以访问和操作所有系统资源。当接收到中断请求时,处理器会自动切换到中断模式,执行中断服务函数(ISR),处理完成后返回到被中断的模式。中断模式的自动切换和优先级管理机制使得系统能够即使响应中断请求,确保系统的实时性和响应能力。
1.3.1 中断模式的特点
1.特权模式
中断模式是特权模式,具有完全的访问权限,可以访问和操作所有系统资源。
这种模式下的代码可以执行任何操作,包括修改系统状态,访问硬件寄存器等。
2.自动切换
当接收到中断请求时,处理器会自动切换到中断模式,并执行相应的中断服务函数(ISR)。
中断处理完成后,处理器会自动返回到被中断的模式。
3.中断优先级
中断模式用于处理普通中断请求,这些中断的优先级通常低于快速中断(FIQ)。
处理中断时,可以被更高优先级的中断(如FIQ)打断。
4.堆栈指针
- 在中断模式下,使用主堆栈指针(MSP)。这与管理模式和系统模式类似,但中断模式专门用于处理中断请求。
1.3.2 中断模式的使用场景
1.中断处理
中断模式主要用于处理普通中断请求,如定时器中断、外部中断等。
中断服务函数(ISR)通常在中断模式下执行,完成中断处理函数后返回到被中断的模式。
2.系统响应
- 中断模式允许系统及时响应中断请求,确保系统的实时性和响应能力。
例如,处理定时器中断以实现任务调度,处理外部中断以响应外部事件。
1.4 快速中断模式(FIQ Mode)
快速中断模式(FIQ Mode)是ARM架构中的一种特权模式,专门用于处理高优先级的快速中断请求。FIQ模式具有完全的访问权限,可以访问和操作所有系统资源。当接收到FIQ中断请求时,处理器会自动切换到FIQ模式,执行中断服务例程(ISR),处理完成后返回到被中断的模式。FIQ模式的高优先级和独立堆栈指针设计使得系统能够快速响应高优先级的中断请求,确保系统的实时性和响应能力。
1.4.1 快速中断模式的特点
1.特权模式
快速中断模式是特权模式,具有完全的访问权限,可以访问和操作所有系统资源。
这种模式下的代码可以执行任何操作,包括修改系统状态,访问硬件寄存器等。
2.高优先级
FIQ模式用于处理高优先级的中断请求,优先级高于普通中断(IRQ)。
当FIQ中断发生时,即使当前正在处理IRQ中断,处理器也会暂停当前的IRQ处理,切换到FIQ模式处理FIQ中断。
3.自动切换
当接收到FIQ中断请求时,处理器会自动切换到FIQ模式,并执行相应的中断服务函数(ISR)。
FIQ处理完成后,处理器会自动返回到被中断的模式。
4.独立堆栈指针
FIQ模式使用独立的堆栈指针(SP_fiq),这使得FIQ模式下的中断处理可以快速进行,而不会影响其他模式的堆栈。
这种设计减少了上下文切换的开销,提高了中断处理的效率。
5.快速响应
- FIQ模式的设计目标是快速响应高优先级的中断请求,通常用于处理需要快速响应的任务,如高速数据传输或实时信号处理。
1.4.2 快速中断模式的使用场景
1.高速数据传输
FIQ模式常用于处理高速数据传输,如DMA(直接内存访问)操作或高速串行通信。
这些任务需要快速响应和处理,以确保数据的实时性和完整性。
2.实时信号处理
FIQ模式也用于处理实时信号处理任务,如音频或视频信号的实时处理。
这些任务需要快速响应和处理,以确保信号的实时性和准确性。
3.高优先级中断处理
- FIQ模式用于处理高优先级的中断请求,确保系统能够及时响应重要的事件。
例如,处理硬件故障或紧急事件的中断请求。
// 初始化FIQ中断
void vInitFIQInterrupt(void)
{
// 配置FIQ中断源
// 例如,配置FIQ中断源
// 使能FIQ中断
// 例如,使能FIQ中断
}
1.5 管理模式(Supervisor Mode,SVC)
管理模式(Supervisor Mode,SVC)是ARM架构中的一种特权模式,主要用于运行操作系统的内核代码和处理系统调用请求。管理模式具有完全的访问权限,可以访问和操作所有系统资源。当用户程序执行系统调用(SWI)指令时,处理器会切换到管理模式,操作系统内核会处理这些请求。管理模式的特权操作和系统调用处理机制使得操作系统能够高效地管理硬件资源和执行系统级操作,确保系统的安全性和稳定性。
引导操作系统内核。
1.5.1 管理模式的特点
1.特权模式
管理模式是特权模式,具有完全的访问权限,可以访问和操作所有系统资源。
这种模式下的代码可以执行任何操作,包括修改系统状态、访问硬件寄存器等。
2.系统调用处理
管理模式通常用于处理用户程序的系统调用请求。当用户程序执行系统调用(SWI)指令时,处理器会切换到管理模式,操作系统内核会处理这些请求。
系统调用是用户程序请求操作系统内核执行特权操作的机制,例如文件操作、进程控制、通信等。
3.异常处理
管理模式也用于处理某些类型的异常,如复位(Reset)和未定义指令(Undefined Instruction)异常。
当系统复位或用户程序执行未定义指令时,处理器会切换到管理模式,执行相应的异常处理程序。
4.堆栈指针
- 在管理模式下,使用主堆栈指针(MSP)。这与中断模式(IRQ)类似,但管理模式专门用于处理系统调用和异常。
1.5.2 管理模式的使用场景
1.操作系统内核
- 管理模式主要用于运行操作系统的内核代码和处理系统调用请求,这些代码需要完全访问权限来管理硬件资源和执行系统级操作。
例如,任务调度、中断管理、内存管理等操作通常在管理模式下执行。
2.系统调用处理
- 当用户程序通过系统调用(SWI)请求操作系统内核执行特权操作时,处理器会切换到管理模式,操作系统内核会处理这些请求。
例如,用户程序请求文件操作、进程控制、通信等特权操作。
3.异常处理
管理模式用于处理某些类型的异常,如复位(Reset)和未定义指令(Undefined Instruction)异常。
当系统复位时,处理器会切换到管理模式,执行相应的异常处理程序。
// 管理模式下的系统调用处理函数
void SVC_Handler(void)
{
// 执行特权模式下的代码
// 例如,处理系统调用请求
// 假设系统调用号存储在R0寄存器中
switch (SVC_Number)
{
case SVC_READ:
// 处理文件读取操作
break;
case SVC_WRITE:
// 处理文件写入操作
break;
// 其他系统调用处理
default:
// 未知系统调用
break;
}
// 返回用户模式
__asm volatile (
"msr cpsr, #0x10\n" // 切换到用户模式
);
}
1.6 中止模式(Abort Mode,ABT)
中止模式(Abort Mode,ABT)是ARM架构中的一种特权模式,专门用于处理数据访问错误和预取中止异常。中止模式具有完全的访问权限,可以访问和操作所有系统资源。当发生数据访问错误或预取中止异常时,处理器会自动切换到中止模式,执行相应的异常处理程序。中止模式的自动切换和错误处理机制使得系统能够及时响应和处理错误情况,确保系统的稳定性和安全性。
1.6.1 中止模式的特点
1.特权模式
中止模式是特权模式,具有完全的访问权限,可以访问和操作所有系统资源。
这种模式下的代码可以执行任何操作,包括修改系统状态、访问硬件寄存器等。
2.自动切换
当发生数据访问错误或预取中止异常时,处理器会自动切换到中止模式,并执行相应的异常处理程序。
处理完成后,处理器会返回到被中断的模式。
3.数据访问错误:数据访问错误通常发生在以下情况
访问非法内存地址(如未映射的内存区域)。
访问权限不足(如用户模式下访问受保护的内存区域)。
硬件故障(如内存损坏)。
4.预取中止异常:预取中止异常通常发生在以下情况
预取的指令地址非法(如未映射的指令地址)。
预取的指令权限不足(如用户模式下预取受保护的指令)。
硬件故障(如指令缓存损坏)。
5.堆栈指针
- 在中止模式下,使用主堆栈指针(MSP)。这与管理模式(SVC)和中断模式(IRQ)类似,但中止模式专门用于处理数据访问错误和预取中止异常。
1.6.2 中止模式的使用场景
1.数据访问错误处理
- 当用户程序或内核代码尝试访问非法内存地址时,处理器会切换到中止模式,执行数据访问错误处理程序。
例如,访问未映射的内存区域或访问权限不足的内存区域。
2.预取中止异常处理
- 当用户程序或内核代码尝试预取非法指令地址时,处理器会切换到中止模式,执行预取中止异常处理程序。
例如,预取未映射的指令地址或预取权限不足的指令。
3.硬件故障处理
- 当硬件检测到内存或指令缓存故障时,处理器会切换到中止模式,执行硬件故障处理程序。
例如,内存损坏或指令缓存损坏。
1.7 未定义模式(Undefined Mode,UND)
未定义模式(Undefined Mode,UND)是ARM架构中的一种特权模式,专门用于处理未定义指令异常。未定义模式具有完全的访问权限,可以访问和操作所有系统资源。当处理器执行非法指令或特权指令时,会自动切换到未定义模式,执行相应的异常处理程序。未定义模式的自动切换和错误处理机制使得系统能够及时响应和处理非法指令,确保系统的稳定性和安全性。
1.7.1 未定义模式的特点
1.特权模式
未定义模式是特权模式,具有完全的访问权限,可以访问和操作所有系统资源。
这种模式下的代码可以执行任何操作,包括修改系统状态、访问硬件寄存器等。
2.自动切换
当处理器执行一条无法识别或非法的指令时,会自动切换到未定义模式,并执行相应的异常处理程序。
处理完成后,处理器会返回到被中断的模式。
3.未定义指令异常:未定义指令异常通常发生在以下情况
执行非法指令(如未定义的指令编码)。
执行特权指令(如用户模式下执行特权指令)。
执行未对齐的指令(如指令地址未对齐)。
4.堆栈指针
- 在未定义模式下,使用主堆栈指针(MSP)。这与管理模式(SVC)、中断模式(IRQ)和中止模式(ABT)类似,但未定义模式专门用于处理未定义指令异常。
1.7.2 未定义模式的使用场景
1.非法指令处理
- 当用户程序或内核代码执行非法指令时,处理器会切换到未定义模式,执行未定义指令处理程序。
例如,执行未定义的指令编码或特权指令。
2.特权指令处理
- 当用户程序尝试执行特权指令时,处理器会切换到未定义模式,执行特权指令处理程序。
例如,用户模式下尝试执行特权指令。
3.未对齐指令处理
- 当处理器执行未对齐的指令时,处理器会切换到未定义模式,执行未对齐指令处理程序。
例如,指令地址未对齐。
二、各模式对比
模式名称 | 特点 | 用途 |
---|---|---|
用户模式(USR) | 非特权模式,限制访问系统资源,通过系统调用请求特权操作 | 运行普通用户程序,执行普通任务,确保系统安全性和稳定性 |
管理模式(SVC) | 特权模式,可以访问所有系统资源,用于操作系统内核和系统调用处理 | 操作系统内核,处理系统调用请求,管理任务调度和资源分配 |
中断模式(IRQ) | 特权模式,用于处理普通中断请求,可以访问所有系统资源 | 处理普通中断请求,如定时器中断、外部中断等 |
快速中断模式(FIQ) | 特权模式,用于处理快速中断请求,可以访问所有系统资源,优先级高于IRQ | 处理快速中断请求,如高速数据传输或实时信号处理 |
中止模式(ABT) | 特权模式,用于处理数据访问错误或预取中止异常,可以访问所有系统资源 | 处理数据访问错误或预取中止异常,如内存访问错误等 |
未定义模式(UND) | 特权模式,用于处理未定义指令异常,可以访问所有系统资源 | 处理未定义指令异常,如非法指令等 |
系统模式(SYS) | 特权模式,可以访问所有系统资源,用于运行操作系统任务 | 运行操作系统任务,如任务调度、资源管理等,可以自由切换到其他模式 |
三、为什么设计这些模式?
CPU是硬件,OS(操作系统)是软件,软件的设计要依赖硬件的特性,硬件的设计要考虑软件需要,便于实现软件特性。
不管是软件还是硬件,最终都要为产品负责任。
操作系统有安全级别要求,因此CPU设计多种模式是为了方便操作系统的多种角色安全等级需要。
这些模式对裸机实验没有意义,但是对操作系统有意义。