网摘1:
内核空间与用户空间
做驱动算来快6年了,今天突然看到一个问题:你自己是怎么样理解内核空间和用户空间的?乍一看到这问题,说实话,自己头脑有点空白的感觉。
很奇怪的感觉,因为在我脑海里潜意识我对这个问题应该还是很清楚的,内核驱动,用户程序,系统调用什么的,信手拈来,就是画模块图都是一上来就画一条粗横线,上面是user space,下面是kernel space。但是自己仔细一想想,却发现自己真还说不清楚什么是内核空间和用户空间,自己其实只知道系统有内核空间和系统空间的概念。赶紧google了一下,把我的理解记录如下:
首先,这个概念的由来,我认为跟CPU的发展有很大关系,在目前CPU的保护模式下,系统需要对其赖以运行的资料进行保护,为了保证操作系统内核资料,我们把内存空间进行划分,一部分为操作系统内核运行的空间,另一部分是应用程序运行的空间,所谓空间就是内存的地址。因此内核空间和用户空间的概念就出现了。在386以前的CPU实模式下,操作系统内核与用户程序的内存空间是不做区分的,也就不存在内核空间和用户空间的说法了。
其次,CPU的保护模式的一个重大特点,也就是硬件直接支持的内存访问模式,虚拟地址空间到物理地址空间的映射。这种工作模式与内核空间用户空间在技术上的相辅相成,也是促成内存空间划分的原因。 内核空间,顾名思义就是内核的运行空间,用户空间也就是用户程序的运行空间,操作系统为了保护自己不被普通程序的破坏,对内核空间进行了一些定义,比如访问权限,换入换出,优先级等等。也就是说内核空间只允许内核访问,用户程序如果要访问内核空间就需要经过内核的审核。内核空间的页表是常驻内存的,不会虚拟内存管理模块换出到磁盘上。内核空间的程序一旦出错,系统会立即死机——系统拒绝继续运行。而用户程序则没有这么多些特权。
再次,内核空间和用户空间都是指虚拟空间,也就是虚拟地址。目前32位系统总共有4G的虚拟地址空间,在Linux系统中,4G虚拟地址空间的最高1G地址被分配给内核使用,是为内核空间,且为内核独享,而低地址的3G空间为用户程序所共享,也就是每个用户程序都有3G的虚拟地址空间。Windows的地址空间怎么分配的,我还不知道呢,惭愧!
很奇怪的感觉,因为在我脑海里潜意识我对这个问题应该还是很清楚的,内核驱动,用户程序,系统调用什么的,信手拈来,就是画模块图都是一上来就画一条粗横线,上面是user space,下面是kernel space。但是自己仔细一想想,却发现自己真还说不清楚什么是内核空间和用户空间,自己其实只知道系统有内核空间和系统空间的概念。赶紧google了一下,把我的理解记录如下:
首先,这个概念的由来,我认为跟CPU的发展有很大关系,在目前CPU的保护模式下,系统需要对其赖以运行的资料进行保护,为了保证操作系统内核资料,我们把内存空间进行划分,一部分为操作系统内核运行的空间,另一部分是应用程序运行的空间,所谓空间就是内存的地址。因此内核空间和用户空间的概念就出现了。在386以前的CPU实模式下,操作系统内核与用户程序的内存空间是不做区分的,也就不存在内核空间和用户空间的说法了。
其次,CPU的保护模式的一个重大特点,也就是硬件直接支持的内存访问模式,虚拟地址空间到物理地址空间的映射。这种工作模式与内核空间用户空间在技术上的相辅相成,也是促成内存空间划分的原因。 内核空间,顾名思义就是内核的运行空间,用户空间也就是用户程序的运行空间,操作系统为了保护自己不被普通程序的破坏,对内核空间进行了一些定义,比如访问权限,换入换出,优先级等等。也就是说内核空间只允许内核访问,用户程序如果要访问内核空间就需要经过内核的审核。内核空间的页表是常驻内存的,不会虚拟内存管理模块换出到磁盘上。内核空间的程序一旦出错,系统会立即死机——系统拒绝继续运行。而用户程序则没有这么多些特权。
再次,内核空间和用户空间都是指虚拟空间,也就是虚拟地址。目前32位系统总共有4G的虚拟地址空间,在Linux系统中,4G虚拟地址空间的最高1G地址被分配给内核使用,是为内核空间,且为内核独享,而低地址的3G空间为用户程序所共享,也就是每个用户程序都有3G的虚拟地址空间。Windows的地址空间怎么分配的,我还不知道呢,惭愧!
网摘2:
内核空间和用户空间
Linux简化了分段机制,使得虚拟地址与线性地址总是一致,因此,Linux的虚拟地址空间也为0~ 4G。Linux内核将这4G字节的空间分为两部分。将最高的1G字节(从虚拟地址0xC0000000到0xFFFFFFFF),供内核使用,称为“内核空间”。而将较低的3G字节(从虚拟地址0x00000000到0xBFFFFFFF),供各个进程使用,称为“用户空间)。因为每个进程可以通过系统调用进入内核,因此,Linux内核由系统内的所有进程共享。于是,从具体进程的角度来看,每个进程可以拥有4G字节的虚拟空间。 内核态和用户态 当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态)。此时处理器处于特权级最高的(0级)内核代码中执行。当进程处于内核态时,执行的内核代码会使用当前进程的内核栈。每个进程都有自己的内核栈。当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。即此时处理器在特权级最低的(3级)用户代码中运行。当正在执行用户程序而突然被中断程序中断时,此时用户程序也可以象征性地称为处于进程的内核态。因为中断处理程序将使用当前进程的内核栈。这与处于内核态的进程的状态有些类似。 进程上下文和中断上下文 处理器总处于以下状态中的一种: 1、内核态,运行于进程上下文,内核代表进程运行于内核空间; 2、内核态,运行于中断上下文,内核代表硬件运行于内核空间; 3、用户态,运行于用户空间。 用户空间的应用程序,通过系统调用,进入内核空间。这个时候用户空间的进程要传递很多变量、参数的值给内核,内核态运行的时候也要保存用户进程的一些寄存器值、变量等。所谓的“进程上下文”,可以看作是用户进程传递给内核的这些参数以及内核要保存的那一整套的变量和寄存器值和当时的环境等。 硬件通过触发信号,导致内核调用中断处理程序,进入内核空间。这个过程中,硬件的一些变量和参数也要传递给内核,内核通过这些参数进行中断处理。所谓的“中断上下文”,其实也可以看作就是硬件传递过来的这些参数和内核需要保存的一些其他环境(主要是当前被打断执行的进程环境)。 |