linux内核空间与用户空间
内核空间和用户空间是操作系统理论的基础之一,即内核功能模块运行在内核空间,而应用程序运行在用户空间。现代的CPU都具有不同的操作模式,代表不同的级别,不同的级别具有不同的功能,在较低的级别上将严禁个别操作。Linux系统设计时借助了这些硬件特点,使用了两个级别,最高级别和最低级别,内核运行在最高级别(内核态),这个级别可以进行所有操作,而应用程序运行在较低级别(用户态),在这个级别,处理器控制着对硬件的直接访问以及对显存的非授权访问。内核态和用户态有自己的显存映射,即自己的地址空间。
正是有了不同运行状态的界定,才有了上下文的概念。用户空间的应用程序,假如想要恳求系统服务,例如操作一个化学设备,或则映射一段设备空间的地址到用户空间,就必须通过系统调用来(操作系统提供给用户空间的插口函数)实现。如右图所示:
通过系统调用,用户空间的应用程序都会步入内核空间,由内核代表该进程运行于内核空间,这就涉及到上下文的切换,用户空间和内核空间具有不同的地址映射,通用或专用的寄存器组linux系统镜像下载,而用户空间的进程要传递好多变量、参数给内核,内核也要保存用户进程的一些寄存器、变量等,以便系统调用结束后回到用户空间继续执行,所谓的进程上下文,就是一个进程在执行的时侯,CPU的所有寄存器中的值、进程的状态以及堆栈中的内容,当内核须要切换到另一个进程时,它须要保存当前进程的所有状态,即保存当前进程的进程上下文,便于再度执行该进程时,才能恢复切换时的状态,继续执行。
同理,硬件通过触发讯号,造成内核调用中断处理程序,步入内核空间。这个过程中linux内核空间访问用户空间,硬件的一些变量和参数也要传递给内核,内核通过那些参数进行中断处理,中断上下文就可以理解为硬件传递过来的那些参数和内核须要保存的一些环境,主要是被中断的进程的环境。
Linux内核工作在进程上下文或则中断上下文。提供系统调用服务的内核代码代表发起系统调用的应用程序运行在进程上下文;另一方面,中断处理程序,异步运行在中断上下文。中断上下文和特定进程无关。
运行在进程上下文的内核代码是可以被占领的(Linux2.6支持占领)。并且一个中断上下文,一般还会一直占有CPU(其实中断可以嵌套,但我们通常不这样做),不可以被打断。正由于这般,运行在中断上下文的代码就要受一些限制,不能做下边的事情:
1、睡眠或则舍弃CPU。
这样做的后果是灾难性的,由于内核在步入中断之前会关掉进程调度,一旦睡眠或则舍弃CPU,这时内核难以调度别的进程来执行,系统还会挂掉
2、尝试获得讯号量
假如获得不到讯号量,代码才会睡眠linux内核空间访问用户空间linux培训班,会形成和前面相同的情况
3、执行历时的任务
中断处理应当尽可能快,由于内核要响应大量服务和恳求,中断上下文占用CPU时间太长会严重影响系统功能。
4、访问用户空间的虚拟地址
由于中断上下文是和特定进程无关的,它是内核代表硬件运行在内核空间,所以在终端上下文难以访问用户空间的虚拟地址
文章评论