内容发布更新时间 : 2025/1/26 6:00:43星期一 下面是文章的全部内容请认真阅读。
《ARM 与 Linux 些许问题》第三章:Linux 如何从用户
态进入内核态
本文基于 mstar801 平台 Linux2.6.35.11 内核。一、Linux 从用户态切换到 内核态的方法有哪些?
大体分为两种;主动式和被动式。
1.被动式:就是 Linux 在用户态(ARM 在用户模式)工作,没有主动发起请 求、而被动地进入内核态;包括硬件中断和程序异常。
2.主动式:就是 Linux 在用户态(ARM 在用户模式)工作,通过发起用户态 程序发起命令请求、ARM 响应进入特权模式进而 Linux 切入内核态;就是系统 调用。
二、分析上述两种切换的原理
1.被动式原理:当硬件中断过来时,通过硬件直接给 CPSR 置位、ARM 进 入 IRQ 模式、Linux 系统进入内核态;或者用户态代码出现异常、硬件也自动 完成上述工作。
2.主动式原理:即软中断,Linux 内核给用户空间开放了一个可以直接操作 硬件寄存器进而引发中断的机制系统调用。当用户态调用系统调用函数时,相 应的硬件被置位引发中断、导致 ARM 工作模式的切换(进入 IRQ 模式),进 而 Linux 进入内核态。 三、系统调用原理
例如,在用户空间 libc 库中有对系统调用 getuid()函数的定义和实现: #includeintgetuid(void){long__res;__asm__volatile(“SWI”)//x86 上是 int$0x80:” =a”(__res):”“(_NR_getuid);__syscall_return(int,__res);} kernel/arch/arm/include/asm/unistd.h
头文件
#define__NR_getuid(__NR_SYSCALL_BASE+24) Linux 用来实现系统调用
异常的实际指令是 SWI(x86 上 int $0x80),这一指令使用中断/异常向量号 128 将控制权移给内核。
SWI 指令其实会让 ARM 从用户模式进入管理模式,即 Linux 操作系统从 用户态进入内核态;此时,保存 CPSR 至 SPSR、保存 R15-PC 至 R14-LR,强 制 CPSR 致 ARM 进入管理模式、强制 R15-PC(程序计数器)从 0x0000 0008 处 取指令、即内核系统调用处理函数 vector_SWI()。见:《ARM 与 Linux 些许问 题》第一章:ARM 工作模式
tips:感谢大家的阅读,本文由我司收集整编。仅供参阅!