从用户态到内核态的切换
理解用户态和内核态
- 如上图所示, Linux操作系统的体系架构分为用户态和内核态, 内核从本质上来看也是一种软件资源, 用来控制计算机的硬件资源, 并为上层的应用程序提供运行环境,.
- 用户态即是上层应用程序的活动空间, 应用程序的执行必须依靠于内核提供的资源, 包括CPU, 存储器, I/O资源, 为了让上层应用访问到这些资源, 内核必须为上层应用提供访问的接口: 系统调用
- 系统调用是操作系统的最小功能单位, 这些系统调用根据不同的场景进行扩展和裁剪, 可以将系统调用看做一个汉字的’笔画’, 而一个"汉字"则可以看作是一个上层应用. 要实现一个完整的汉字(一个上层应用), 就需要很多的系统调用(笔画)
- 为什么要有用户态和内核态?
- 由于需要限制不同的程序之间的访问能力, 防止获取别的程序的内存数据或者获取外围设备的数据, CPU划分出两个权限等级----用户态和内核态
用户态和内核态的切换
系统调用
- 所有的应用程序都是运行在用户态的, 但是有时候程序确实需要做一些内核态的事情, 例如从硬盘读取数据, 从键盘获取输入等, 唯一可以做这些的事情就是操作系统, 所以程序就需要先请求以操作系统的名义来执行---------这时就有这样一个机制: 用户态程序切换到内核态, 但是不能控制在内核态中执行指令------这就是系统调用(CPU中的实现称为陷阱指令).工作流程如下:
- 用户态程序将一些数据值放在寄存器中, 或者使用参数创建一个堆栈, 以此表明需要操作系统提供服务
- 用户态程序执行
陷阱指令
- CPU切换到