windows怎么实现内核态和用户态

如题所述

为使用户进程无法访问甚至修改关键的操作系统数据,windows使用了两种处理器访问模式:用户态和内核态。用户应用代码运行在用户态,而系统代码(如系统服务和设备驱动)运行在内核态。内核态指处理器中授权访问所有系统内存并使用所有CPU指令的执行状态。通过为操作系统软件定义比用户应用更高的特权,处理器的这种机制使操作系统设计者能够保证行为无法捉摸的用户应用程序不会破坏系统的稳定性。

虽然每个windows进程都有自己的私有地址空间,内核态的操作系统代码和设备驱动代码共享同一个虚拟地址空间。每个虚拟内存页都设定了读写该页所需要的处理器执行状态。操作系统空间中的页只有在内核态时才能访问,所有用户地址空间的页都可以从用户态访问。只读页(通常存放的静态数据)不管处理器处于什么态都无法更改。另外,在支持不执行内存保护的处理器上,windows将包含数据的页标记为不可执行,从而阻止无意触发的对数据页的代码执行。

32位windows对在内核态运行的组件使用私有的系统内存不提供任何保护,也就是说一旦处于内核态,操作系统和设备驱动代码对系统内存有完全的访问权限,并且能够绕过window安全机制访问对象。因为windows操作系统代码运行在内核态,所以运行在内核态的组件需要精心设计并仔细测试以保证它们不会破坏系统安全从而引起系统不稳定。

缺少保护意味着在加载第三方驱动时需要十分小心,因为内核态的软件对所有操作系统数据有完全的访问权限。windows的这一脆弱性也是其驱动签名机制产生的重要原因,这一机制在系统添加未授权的驱动程序的时候会向用户发出警告。同样,一项称为驱动验证器(Driver
Verifier)的技术能够帮助驱动程序编写者查找bug(比如缓冲区溢出或者内存泄漏),以免引起安全或可靠性问题。

另外,64位windows中,内核模式代码标记策略(KMCS)规定64位设备驱动必须使用从某一权威代码认证机构获取加密的key对驱动加以签名。不像32位版本的windows,用户不能公然强制安装一个未授权的驱动,既使是管理员用户(除非在启动时按F8并选择高级启动选项关闭强制驱动签名)

用户应用作出系统调用时会从用户态进入内核态。比如windows的ReadFile函数最终需要调用处理文件读取的内核例程。这个例程由于访问了内核系统数据结构必须运行的内核态下。从用户态到内核态的转换由一条特殊的将处理器转换到内核态的处理器指令完成。操作系统捕获这条指令,意识到有对系统服务的请求,验证传递给系统函数的参数,然后执行内核函数。在将控制权交给用户线程之前处理器返回用户态。通过这种方式,系统保护自身数据以免被用户进程读取甚至修改。

因此,用户线程部分时间在用户态,部分时间在内核态。实际上,由于图形和窗口系统代码也运行在内核态,图形密集型的应用在内核的时间会多于其在用户态运行的时间。可使用性能工具监测图形密集型应用的内核态和用户态时间比例来测试。

可以使用windows自带的性能监测器观察系统在不同运行状态下时间的比例。

步骤如下:

1 打开工具

2 点击工具栏的 “+”

3 选择处理器性能对象后,点击%
Privileged Time计数器,然后按ctrl, 点 % User Time计数器

4 点击 add
,然后点击close

5 不断在移动鼠标,发现与上面分析一样,%
Privileged Time迅速上升
温馨提示:答案为网友推荐,仅供参考