理解用户态、内核态及系统调用
为了保护系统安全,
操作系统会将内存划分为:系统空间(又叫内核空间)和用户空间,系统空间用于运行OS内核等系统程序,用户空间用于运行用户程序,用户空间进程无法直接访问内核空间,即环境隔离开了。
内核态和用户态:
- 当CPU运行用户空间进程时就处于用户态
- 当CPU运行内核空间进程时就处于内核态
CPU指令划分了特权指令和非特权指令,用户态只能执行非特权指令,内核态可以执行所有指令,保证了用户程序无法“为所欲为” ,从而保护了系统安全。
用户态无法执行特权指令,但有时候用户程序又需要执行特权操作(有需求),因此就有了系统调用。系统调用是OS内核暴露给上层用户程序调用的API,从而使用户程序能够执行特权操作、访问特殊资源。
当用户空间进程进行系统调用时,就会发生上下文切换,CPU切换至内核态,执行内核程序,内核执行完后又会切换回用户态,继续执行用户程序。
详细描述:CPU运行用户空间进程时,当执行了系统调用,就会进行上下文切换,转而运行内核空间进程,所以CPU就从用户态进入了内核态。
其实系统调用可以类比远程服务调用,假设有A B两个服务,服务A只能执行普通的操作(比如,只能查询数据),服务B可以执行特权操作(比如,修改数据),当A服务想修改数据的时候就只能调用服务B来修改数据,这个过程就可以理解成系统调用(相当于用户程序调用系统服务(即操作系统))。
总结,
- 为了保护系统安全,所以有内核空间和用户空间及内核态和用户态之分,内核态权限高,用户态权限低。
- 用户空间进程想执行特权操作,只能通过系统调用实现。
- 用户进程/线程执行系统调用,会发生上下文切换,CPU转而执行内核进程/线程,即CPU进入内核态。
- 封装和暴露API,OS内核封装了如何操作硬件资源等底层操作,并向外暴露了API供外界调用,既保证了系统安全,又实现了高内聚。