用户进程陷入内核
我们的手机,电脑上都装有各色各样的应用程序,我们生活中经常把它们叫做软件。其实我们手机上的Andorid、IOS;电脑上的Linux、Windows等操作系统也是软件。在CPU看来,它并不知道执行的程序是操作系统还是一般应用程序。
学过C win32编程的都知道,我们在编写程序时,很多时候要使用到操作系统提供的API函数,这个函数就是系统调用函数,属于操作系统内核提供的函数。应用程序加上操作系统提供的功能才是完整的程序。
那编译器为啥知道系统调用接口呢?其实我们下载编译器时,会选择相应的系统版本,这里编译器就已经跟对应的操作系统绑定了起来,都是经过设计的。
我们来看看Windows中提供了哪些系统级别的动态链接库(dll)。在电脑C盘的以下两个路径:C:\Windows\SysWOW64、C:\Windows\System32我们可以发现windows系统已经提供好的系统dll,其中也可以找到我们调试程序时经常会出现的kernel32.dll等。我们使用到的系统调用函数大多数都由这些系统dll提供。
用户态与内核态是相对于CPU来讲的,指的是CPU运行在用户态(特权3级)还是内核态(特权0级)。所谓保护模式下的保护就体现在特权级上。
操作系统位于最内环的0级特权,直接控制硬件,掌控各种核心数据。系统级别的程序位于1级特权和2级特权,运行在这两层的一般为虚拟机,驱动程序等系统服务。然后就是我们经常使用到的各种应用程序啦,它们的级别最低,没什么权力,就处于3级特权,要完成什么需求时,有时就要求助操作系统,给它们权力去做这件事。就好比你一个公司职员,想开老总的跑车去完成某件事,当然得老总同意你才能开嘛。我们的应用程序在这里把它当作这个小职员,你要成功运行你的代码,就要调用操作系统(这里就是公司老总)提供的系统函数(这里就是老总的车)。所以呢,系统调用函数是不属于这个应用程序的,你敢说老总的跑车是你这个小职员的吗?
所以系统调用与库函数的区别如下:
1、库函数是语言或应用程序的一部分,而系统调用是内核提供给应用程序的接口,属于系统的一部分。
2、库函数在用户地址空间执行,系统调用是在内核地址空间执行,库函数运行时间属于用户时间,系统调用属于系统时间,库函数开销较小,系统调用开销较大
3、库函数是有缓冲的,系统调用是无缓冲的
4、系统调用依赖于平台,库函数并不依赖。
所以呢,什么是用户进程陷入内核呢?
用户进程在执行时,为了访问系统资源时(包括硬件中断或内核数据结构),它需要进行系统调用。当前的进程被暂时终止执行,其进程上下文也会被内核中断程序保存起来。然后开始执行一段需要的内核代码。这样CPU便进入了内核态,这就是陷入内核。