概念
简单来说就是CPU的工作状态;具体来说它是对资源和指令使用权限的描述。
比如HALT:停止CPU的工作;IN/OUT:执行I/O操作等特权指令,只有CPU工作在权限很高的态下才能使用这些指令。
态的分类
用户态:仅能访问部分资源,其他资源受限。一般通过用户程序访问资源
内核态:能够访问所有资源和执行所有指令(与用户态的最大差别)。存在于管理程序或OS内核中
管态:介于内核态与用户态之间
详细说一下内核态与用户态吧
用户态与内核态之间的转换
1.内核态转换到用户态
- 一般是执行中断返回:IRET
2.用户态转换到内核态
- 用户请求OS提供服务
- 发生中断
- 用户进程产生错误(内部中断)
- 用户态企图执行特权指令
硬件和OS对CPU的观察
- 硬件按 “态” 来区分CPU的状态
- OS按 “进程” 来区分CPU的状态
以一个简单的C程序举例:
#include<stdio.h>
#include<string.h>
int sum(int a,int b){
return a+b;
}
int main(){
int x;
x=sum(1,2);//这里调用sum函数,仍然在用户态
printf("%d\n",x);//系统调用引发中断,用户态切换到内核态
x=strlen("hello");//内核态转换到用户态
printf("%d\n",x);//用户态再次通过系统调用转换到内核态
return 0;
}
系统调用
是内核提供给用户的接口,使用户可以对内核操作。但需要进入内核态,才能调用。系统调用使用户进程进入内核的接口层,它本身并非内核函数,但它是由内核函数实现的,进入系统内核后,不同的系统调用会找到各自对应的内核函数。
强调一下:这里 printf() 是调用 write() 系统调用函数向标准输出设备写。通过一步步查看 printf() 的定义,会发现最后找到了write(), 而在C中并没有write()的具体代码实现。具体系统调用过程可参阅:https://blog.youkuaiyun.com/edonlii/article/details/20135059
strlen() 是c标准库的函数,无需系统调用。