当前位置:C++技术网 > 资讯 > Windows核心编程入门:8 用户空间(用户态)和系统空间(内核态)的深刻理解

Windows核心编程入门:8 用户空间(用户态)和系统空间(内核态)的深刻理解

更新时间:2016-06-25 22:07:19浏览次数:1+次

    学习了到前些时间,我才真正把这四个概念弄清楚了。那感觉好的自不必说。我想,一定有很多和我一样的人,所以,就写出本文分享给大家。
    用户空间就是用户进程所在的内存区域,相对的,系统空间就是操作系统占据的内存区域。用户进程和系统进程的所有数据都在内存中。
    是谁来划分内存空间的呢?在电脑开机之前,内存就是一块原始的物理内存。什么也没有。开机加电,系统启动后,就对物理内存进行了划分。当然,这是系统的规定,物理内存条上并没有划分好的地址和空间范围。这些划分都是操作系统在逻辑上的划分。不同版本的操作系统划分的结果都是不一样的。
    为什么要划分用户空间和系统空间呢?当然是有必要的。操作系统的数据都是存放于系统空间的,用户进程的数据是存放于用户空间的。这是第一点,不同的身份,数据放置的位置必然不一样,否则大混战就会导致系统的数据和用户的数据混在一起,系统就不能很好的运行了。分开来存放,就让系统的数据和用户的数据互不干扰,保证系统的稳定性。分开UC南方,管理上很方便,而更重要的是,将用户的数据和系统的数据隔离开,就可以对两部分的数据的访问进行控制。这样就可以确保用户程序不能随便操作系统的数据,这样防止用户程序误操作或者是恶意破坏系统。
    分开存放后,划分了两个空间,操作系统就可以对不同的内存地址区段进行管理,用户空间,用户程序可以自由访问,而系统空间则不能直接访问的。系统空间则是系统才能访问。用户空间的程序要访问系统空间,则要调用系统提供的接口才行。系统程序的地位是最高的,因此,系统既可以访问系统空间,也可以随时访问用户空间。系统要调度用户空间的进程,要管理用户空间,当然是需要随时都可以访问用户空间的。系统在这里是老大,系统当然有最高的权限。用户空间的进程必须要服从系统的规则。
    那么什么是内核态和用户态呢?所谓的内核态和用户态,不是进程的状态,这个是用来限定CPU的。不管是用户程序还是系统程序,都是由CPU来执行的。只不过,在执行用户程序时,系统就给此时的CPU指定了用户态,表明CPU此时正在执行用户程序。在执行用户程序,那么此时CPU拥有的访问内存的权限就是用户进程相应的权限。此时,CPU是不能直接访问系统空间的内存的。而系统空间就是前面说的系统启动时划分好的。仅仅划分好是不够的,必须要CPU支持才行,必须能够支持用户态和内核态才行。如果CPU不支持这种状态的区别,那就无法限定运行用户程序的CPU不能访问系统空间。不过现代的CPU都是支持的。CPU的支持,就让权限的管理得到保证。这也是为什么要划分空间的原因。如果不划分好用户空间和系统空间,那么对CPU的限定就不好描述,而有了划分后,执行用户进程的CPU不运行直接访问系统空间这一段内存。但是,执行系统程序的CPU,是可以随时访问用户空间的。执行系统程序的CPU的状态就是内核态了。
    很显然,空间的划分和CPU的运行状态的限定,就很好的对系统进行了保护。这也是空间划分和运行状态的规定的意义所在了。而我们编写的程序,都是运行在用户态的,只有系统本身的程序,才是内核态的。我们要操作内核的对象,就必须借助系统提供的接口了。
    最后补充一点,用户和系统隔离了,很好的保护了系统。然而,各个用户进程之间,也会产生相互破坏。因此系统为每一个进程都提供了一个虚拟的地址空间,这样就将用户进程之间进行了隔离,从而保证了用户进程之间相互不被破坏。既然隔离了,那么也就需要提供进程间的通信机制。
    具体的进程通信等技术,就要你查看其它资料了哦。