在它的生命周期中,进程在用户模式和内核模式下执行。用户模式是正常模式,其中进程的访问权限有限。而内核模式是特权模式,其中进程可以不受限制地访问系统资源,如硬件、内存等。进程可以访问 I/O 硬件寄存器对其进行编程,可以在内核模式下执行操作系统内核代码和访问内核数据。与进程管理、IO 硬件管理和内存管理相关的任何事情都需要进程在内核模式下执行。
知道内核模式下的进程有权访问任何设备和内存很重要,同时内核模式下的任何崩溃都会导致整个系统崩溃。但是用户模式下的任何崩溃只会导致错误的进程停止。
内核提供了系统调用接口( SCI ),它是内核的入口点。系统调用是进程从用户模式进入内核模式的唯一途径。下图详细解释了用户模式到内核模式的转换。
进入内核模式,一个应用进程。
- 调用Glibc库函数。
- Glibc 库知道为不同架构调用系统调用的正确方法。它根据体系结构的应用程序二进制接口 (ABI) 设置传递参数以准备系统调用条目。
- 现在 Glibc 调用 SWI 指令(ARM 的软件中断指令),它通过更新 CPSR 寄存器的模式位使处理器进入超级模式并跳转到向量地址 0x08。
- 到目前为止,流程执行处于用户模式。 SWI 指令执行后,允许进程执行内核代码。内存管理单元 (MMU) 现在将允许内核虚拟内存访问和执行,用于此进程。
- 从向量地址0x08 开始,进程执行加载并跳转到软件中断处理程序,即 ARM 的vector_swi() 。
- 在vector_swi() 中,从 SWI 指令中提取系统调用号 ( SCNO ) 并执行跳转到使用SCNO作为系统调用表sys_call_table索引的系统调用函数。
- 系统调用执行后,在返回路径中,用户空间寄存器在用户模式开始执行之前被恢复。
为了支持内核模式和用户模式,处理器必须有不同特权模式的硬件支持。例如 ARM 处理器支持七种不同的模式。
Processor Mode | CPSR Mode bits | Remark |
---|---|---|
User | 10000 | No privilege or user mode |
FIQ | 10001 | Fast Interrupt mode |
IRQ | 10010 | Interrupt mode |
Supervisor | 10011 | Kernel mode |
Abort | 10111 | Mode for memory violation handling |
Undefined | 11011 | Undefined instruction handling mode |
System | 11111 | Same as Supervisor mode but with re-entrancy |
结论 :
对于任何系统,特权模式和非特权模式对于访问保护都很重要。处理器必须具有用户/内核模式的硬件支持。系统调用接口 (SCI) 是从用户空间到内核空间的唯一途径。内核空间切换是通过软件中断来实现的,它改变处理器模式,将CPU执行跳转到中断处理程序,执行相应的系统调用例程。