前面写了很多的文章来说明了这个问题,并且在文章中均举了一些例子,如果为了解决具体问题,那么那些就已经足够了,但是如果想实现一个操作系统,这些就远远不够了。
硬件是软件的底层,这是一个前提,硬件是舞台,软件都是舞者,操作系统是应用程序的底层,操作系统是舞台,应用程序是舞者,并且,硬件是操作的系统的舞台,这里操作系统成了舞者,这就是计算机的层次(对于有操作系统的计算机而言,不包括裸机)。在操作系统理论中,往往将进程的地址空间分为内核空间和用户空间,这样的话就实现了操作系统最起码的安全性。但是存在一个疑问,内核空间的保护不是cpu硬件提供的吗?比如Intel的x86处理器的特权环的概念,怎么会是OS的概念呢?注意,cpu只是提供了一个机制而已,比如特权环的机制使得内核地址空间的保护变得更加容易和可靠,就像Intel的x86处理器那样,你完全可以不用那一套,自己实现一套内核和用户分离的机制,正如很多虚拟机所做的那样。
一般情况下在linux中,3G是个分界线,在windows中,2G是个分界线,当然可以改,操作系统的作者完全可以只给内核1k空间或者别的。操作系统提出了内核和用户分离的策略,然后利用处理器来实现,仍以Intel处理器为例,利用它的分段和分页机制来实现就可以了,很简单,就是一个层次问题,正如前文所述,你也可以不用这些机制实现,而自己用纯软件的方式实现或者对于不需要安全控制的系统干脆不实现。
理解了以上以后就比较好理解内核空间和用户空间的互访问问题了,首先要注意的是,它们的地位是不平等的,如果用户空间访问内核空间,那么必须从那几道所谓的门通过然后才会得到访问权,比如系统调用,对于cpu硬件实现的空间分离,那么硬件会自然而然的阻止用户直接访问内核,对于纯软件实现的空间分离,那么必须阻止用户直接访问内核,这是必须需要实现的;但是反过来,内核空间访问用户空间的情况就不是那么自然了,都知道内核拥有最高特权级,cpu硬件就是通过给与内核最高特权级不公平的对待用户空间的,这么说来,内 核可以随意访问用户空间,事实上真的是这样,前面所谓的阻止就是硬件或者软件在探知用户访问内核的时候会由于权限不够而触发一个异常(中断,陷阱),对于硬件比较简单,cpu内部实现了这样的机制,而对于软件实现的空间分离就很麻烦了,这个不谈,总之一定有办法。但是内核访问用户空间就不会触发异常或者陷阱,因为硬件给了内核以最高权限,内核在做事的时候没有必要通知别人,直接做就是了,因此硬件是不会阻止内核访问任何地方的,可是事实上这样会引起不必要的麻烦和混乱,因为用户空间是进程间分离的,也就是说每个进程都 有一个独立的用户空间,并且进程具有很大的不确定性,比如哪个刚开始,哪个结束了,哪个异常了,那么试问内核访问用户空间是访问的谁的哪个进程的用户空间,如此一来,要想不出错的访问用户空间,内核就必须时刻跟踪所有的用户进程的运行情况,这会给内核带来很大的负担,反之内核空间就没有那么多事,就是一个管理者,就管理那么几件确定的事情,像什么内存啦,进程啦等等,因此内核空间没有必要做进程分离,只要一个就可以了,于是像linux这样的系统就做了一个约定,不允许没有用户空间上下文的内核线程访问用户空间,这样的 话,只有软件和程序员才能阻止内核访问用户空间,这个访问权限在硬件和操作系统本身那里是全权开放的,权力掌握在编写内核线程的程序员手中。
不允许内核访问用户空间使内核免去了很多的负担,使内核设计更加简化,使内核空间和用户空间变得更加隔离从而使二者的地位平等了一点点。注意这里并不是说就不允许内核访问用户空间,硬件都不吱声,操作系统乱做啥限制啊,其实内核访问用户空间有一个前提,这个前提纯粹是操作系统约定的,不同的操作系统可能不同,在linux上,该前提就是访问用户空间前必须得到该用户空间上下文,也就是说内核必须知道访问的是哪个进程的用户空间,虽然内核可以带着最高指示做任何事情,但是也不能胡作非为,做事之前必须明白自己做的事是什么,这个约定对于我们人也很适用,权力机关是不能胡作非为的,但是...
本文转自 dog250 51CTO博客,原文链接:http://blog.51cto.com/dog250/1274300