内核空间与用户空间

    做驱动算来快6年了,今天突然看到一个问题:你自己是怎么样理解内核空间和用户空间的?乍一看到这问题,说实话,自己头脑有点空白的感觉。
很奇怪的感觉,因为在我脑海里潜意识我对这个问题应该还是很清楚的,内核驱动,用户程序,系统调用什么的,信手拈来,就是画模块图都是一上来就画一条粗横线,上面是user space,下面是kernel space。但是自己仔细一想想,却发现自己真还说不清楚什么是内核空间和用户空间,自己其实只知道系统有内核空间和系统空间的概念。赶紧google了一下,把我的理解记录如下:
    首先,这个概念的由来,我认为跟CPU的发展有很大关系,在目前CPU的保护模式下,系统需要对其赖以运行的资料进行保护,为了保证操作系统内核资料,我们把内存空间进行划分,一部分为操作系统内核运行的空间,另一部分是应用程序运行的空间,所谓空间就是内存的地址。因此内核空间和用户空间的概念就出现了。在386以前的CPU实模式下,操作系统内核与用户程序的内存空间是不做区分的,也就不存在内核空间和用户空间的说法了。
    其次,CPU的保护模式的一个重大特点,也就是硬件直接支持的内存访问模式,虚拟地址空间到物理地址空间的映射。这种工作模式与内核空间用户空间在技术上的相辅相成,也是促成内存空间划分的原因。 内核空间,顾名思义就是内核的运行空间,用户空间也就是用户程序的运行空间,操作系统为了保护自己不被普通程序的破坏,对内核空间进行了一些定义,比如访问权限,换入换出,优先级等等。也就是说内核空间只允许内核访问,用户程序如果要访问内核空间就需要经过内核的审核。内核空间的页表是常驻内存的,不会虚拟内存管理模块换出到磁盘上。内核空间的程序一旦出错,系统会立即死机——系统拒绝继续运行。而用户程序则没有这么多些特权。
    再次,内核空间和用户空间都是指虚拟空间,也就是虚拟地址。目前32位系统总共有4G的虚拟地址空间,在Linux系统中,4G虚拟地址空间的最高1G地址被分配给内核使用,是为内核空间,且为内核独享,而低地址的3G空间为用户程序所共享,也就是每个用户程序都有3G的虚拟地址空间。Windows的地址空间怎么分配的,我还不知道呢,惭愧!

posted on 2009-09-03 14:50  abei's blog  阅读(6172)  评论(0编辑  收藏  举报

导航