后面几篇文章开始整理多路复用相关的知识,特别是epoll相关的原理介绍。本篇文章是第1篇文章,也是后续知识的基础,笔者觉得只有真正弄清楚了内核态和用户态,才能更好的理解后续的知识。
一、内核态与用户态的介绍
Linux进程的4GB空间,3G-4G部分大家是共享的,是内核态的地址空间,这里存放在整个内核代码和所有的内核模块,以及内核所维护的数据。Linux操作系统的体系架构分为用户态和内核态(或者用户空间和内核)。
1.内核:从本质上看是一种软件——控制计算机的硬件资源,并提供上层应用程序运行的环境。
2.用户态:即上层应用程序的活动空间,应用程序的执行必须依托于内核提供的资源,
包括CPU资源、存储资源、I/O资源等。
备注:为了使上层应用能够访问到这些资源,内核必须为上层应用提供访问的接口:即系统调用。
系统调用:是操作系统的最小功能单位,我们可以把系统调用看成是一种不能再化简的操作(类似于原子操作,但是不同概念),用户态的应用程序可以通过三种方式来访问内核态的资源:
1)系统调用
2)库函数
3)Shell脚本
例子:用户运行一程序,该程序所创建的进程开始是运行在用户态的,执行文件操作,网络数据发送等操作步骤如下:
1.系统调用进入内核态:通过write,send等系统调用,进行调用内核中的代码来完成操作进入内核态。
2.内核态执行操作:进入3GB-4GB中的内核地址空间去执行这些代码完成操作。
3.切回用户态:内核态执行完之后,切换用户态。
备注:这样操作的好处在于用户态的程序就不能随意操作1内核地址空间,具有一定的安全保护作用。
二、操作系统区分内核和用户态的原因
1. 设计用户态和内核态,并且用户态成运行程序需要调用内核态的原因?
因为操作系统的资源是有限的,如果访问资源的操作过多,必然会消耗过多的资源,而且如果不对这些操作加以区分,很可能造成资源访问的冲突。所以,为了减少有限资源的访问和使用冲突,Unix/Linux的设计哲学之一就是:对不同的操作赋予不同的执行等级,就是所谓特权的概念。
2.内核态和用户态有什么不同?
内核态与用户态是操作系统的两种运行级别,跟intel cpu没有必然联系,intel cpu提供Ring0-Ring3三种级别运行模式,Ring0级别最高,Ring3级别最低。Linux使用了Ring3级别运行用户态。
1.Ring0作为内核态,没有使用Ring1和Ring2。
2.Ring3不能访问Ring0的地址空间,包括代码和数量。
Linux进程的4GB空间,3G-4G部分大家是共享的,是内核态的地址空间,这里存放在整个内核代码和所有的内核模块,以及内核所维护的数据。
三、内核态与用户态的交互
运行于用户态的进程可以执行的操作和访问的资源都会受到极大的限制,而运行在内核态的进程则可以执行任何操作并且在资源的使用上没有限制,下面是用户态转换成内核态的几种方式:
1. 系统调用:这是用户进程主动要求切换到内核态的一种方式,用户进程通过系统调用申请操作系统提供的服务程序完成工作。而系统调用的机制其核心还是使用了操作系统为用户特别开放的一个中断来实现
2.异常:当CPU在执行运行在用户态的程序时,发现了某些事件不可知的异常,这是会触发由当前运行进程切换到处理此异常的内核相关程序中,也就到了内核态
3. 外围设备的中断:当外围设备完成用户请求的操作之后,会向CPU发出相应的中断信号,这时CPU会暂停执行下一条将要执行的指令转而去执行中断信号的处理程序,如果先执行的指令是用户态下的程序,那么这个转换的过程自然也就发生了有用户态到内核态的切换
很多程序开始时运行于用户态,但在执行的过程中,一些操作需要在内核权限下才能执行,这就涉及到一个从用户态切换到内核态的过程。比如C函数库中的内存分配函数malloc(),它具体是使用sbrk()系统调用来分配内存,当malloc调用sbrk()的时候就涉及一次从用户态到内核态的切换,类似的函数还有printf(),调用的是wirte()系统调用来输出字符串,等等。
具体的切换步骤:
1. 从当前进程的描述符中提取其内核栈的ss0及esp0信息。
2. 使用ss0和esp0指向的内核栈将当前进程的cs,eip,eflags,ss,esp信息保存起来,
这个过程也完成了由用户栈找到内核栈的切换过程,同时保存了被暂停执行的程序的下一条指令。
3. 将先前由中断向量检索得到的中断处理程序的cs,eip信息装入相应的寄存器,
开始执行中断处理程序,这时就转到了内核态的程序执行了。
参考资料:
https://cloud.tencent.com/developer/article/1025476
https://zhuanlan.zhihu.com/p/63179839
https://blog.csdn.net/Monster7559/article/details/85877447