本文根据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()函数的界说和完成:
- #include
- intgetuid(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作业形式