�/p>
ARM
�/p>
Linux
些许问题》第三章ï¼?/p>
Linux
如何从用æˆ?/p>
态进入内核æ€?/p>
本文基于
mstar801
平台
Linux2.6.35.11
内核。一ã€?/p>
Linux
从用户态切换到
内核态的方法有哪些?
大体分为两种;主动式和被动式ã€?/p>
1.
被动式:就是
Linux
在用户æ€?/p>
(ARM
在用户模å¼?/p>
)
工作,没有主动发起请
求、而被动地进入内核态;包括硬件中断和程序异常ã€?/p>
2.
主动式:就是
Linux
在用户æ€?/p>
(ARM
在用户模å¼?/p>
)
工作,通过发起用户æ€?/p>
程序发起命令请求ã€?/p>
ARM
响应进入特权模式进è€?/p>
Linux
切入内核态;就是系统
调用ã€?/p>
二、分析上述两种切换的原理
1.
被动式原理:当硬件中断过来时,通过硬件直接ç»?/p>
CPSR
置位ã€?/p>
ARM
è¿?/p>
å…?/p>
IRQ
模式ã€?/p>
Linux
系统进入内核态;或者用户态代码出现异常、硬件也自动
完成上述工作ã€?/p>
2.
主动式原理:即软中断ï¼?/p>
Linux
内核给用户空间开放了一个可以直接操ä½?/p>
硬件寄存器进而引发中断的机制系统调用。当用户态调用系统调用函数时,相
应的硬件被置位引发中断、导è‡?/p>
ARM
工作模式的切换(进入
IRQ
模式),è¿?/p>
�/p>
Linux
进入内核态ã€?/p>
三、系统调用原ç�?/p>
例如,在用户空间
libc
库中有对系统调用
getuid()
函数的定义和实现ï¼?/p>
#includeintgetuid(void){long__res;__asm__volatile(“SWIâ€?//x86
上是
int$0x80:�/p>
=aâ€?__res):”â€?_NR_getuid);__syscall_return(int,__res);}
头文ä»?/p>
kernel/arch/arm/include/asm/unistd.h