http://blog.csdn.net/yming0221/article/details/6314220
内核态与用户态
intelx86 架构的CPU分Ring0-Ring3三种级别的运行模式,Ring0级别最高,Ring3最低。
-
针对不同的级别,有很多的限制,比如说传统的in,out 指令,就是端口的输入输出指令,在Ring0级下是可以用的,但在Ring3级下就不能用,你用就产生陷井,告诉你出错了,当然限制还有很多了,不只是这一点。
-
操作系统下是利用这个特点,当操作系统自己的代码运行时,CPU 就切成Ring0级,当用户的程序运行是就只让它在Ring3级运行,这样如果用户的程序想做什么破坏系统的事情的话,也没办法做到。
-
当然,低级别的程序是没法把自己升到高级别的,也就是说用户程序运行在 Ring3级,他想把自己变成Ring0级自己是做不到的,除非是操作系统帮忙。
例如:版主 可以删除你的贴子,你却不能删除 版主 的贴子 ,当然你也没法让自己变成 版主 ,除非 版主 把你升为 版主(或是系统有 bug ).....
-
利用这个特性,操作系统就可以控制所有的程序的运行,确保系统的安全了.平时把操作系统运行时的级别就叫内核态(因为是操作系统内核运行时的状态),而且普通用户程序运行时的那个级别叫用户态。
-
当操作系统刚引导时,CPU 处于实模式,这时就相当于是Ring0级,于是操作系统就自动得到最高权限,然后切到保护模式时就是Ring0级,这时操作系统就占了先机,成为了最高级别的运行者,由于你的程序都是由操作系统来加载的,所以当它把你加载上来后,就把你的运行状态设为Ring3级,即最低级,然后才让你运行,所以没办法,你只能在最低级运行了,因为没办法把自己从低级上升到高级。
例如:这个论坛是由 版主 创立的,当时创立时就他一个用户,所以它就自然取得了最高权限了,即 版主 运行在 Ring0 级(内核态),然后他再让我们注册自己的账号,但是设置的权限是普通用户,所以我们一注册就只能是普通用户,即我们只能运行在 Ring3 级(用户级),我们没有更多的权限,所以我们只能任由 版主 "蹂躏" 了,看你不爽就删除你的贴子,踢你下线,加你进黑名单,永久封你的IP之类的,你除了发发牢骚之外也是无可奈何了, 这就是操作系统在 内核 态可以管理用户程序,杀死用户程序的原因了。
Linux环境下的内核态与用户态
-
Linux进程的4GB地址空间,3G-4G部分大家是共享的,是内核态的地址空间,这里存放在整个内核的代码和所有的内核模块,以及内核所维护的数据。
-
用户运行一个程序,该程序所创建的进程开始是运行在用户态的,如果要执行文件操作,网络数据发送等操作,必须通过write,send等系统调用,这些系统调用会调用内核中的代码来完成操作,这时,必须切换到Ring0,然后进入3GB-4GB中的内核地址空间去执行这些代码完成操作,完成后,切换回Ring3,回到用户态。
-
至于说保护模式,是说通过内存页表操作等机制,保证进程间的地址空间不会互相冲突,一个进程的操作不会修改另一个进程的地址空间中的数据。