本文共 4385 字,大约阅读时间需要 14 分钟。
为了防止普通的应用程序修改或访问临界区的操作系统的数据,Windows使用两种访问模式:内核模式和用户模式。用户级别的应用程序代码运行在用户模式下,操作系统的代码运行在内核模式(比如系统服务和驱动)。内核模式下有权限访问所有内存和所有的CPU指令。内核模式比用户模式权限高的目的是保证系统的稳定性。
注意:X86和X64处理器定义了4个级别的代码执行权限(也叫做ring)。第0级(Ring 0)是内核模式,Ring 3是用户模式。Windows只用这两个级别的原因是有些硬件架构只实现了这两个级别的执行权限(比如Compaq Alpha和Sillion Graphics MIPS)。
虽然每个Windows进程都有自己的私有内存空间,但内核模式的系统代码和驱动代码共享一个单独的虚拟地址空间,虚拟内存中的每一页都标记了在什么访问模式下才可以读写。系统空间中的页只能被内核模式访问,用户模式访问用户模式的地址空间。只读内存页(比如存储静态数据的页)在任何模式下都不能写。另外,处理器支持非可执行内存区域保护,来防止在数据区域执行恶意或无意的代码。
32位Windows不提供内核模式下对私有可读写内存区域的保护,换句话说,一旦在内核模式下,操作系统代码和驱动代码可以完全访问系统的所有内存并绕过Windows安全机制来访问某些资源。因为大量Windows操作系统代码运行在内核模式,所以一定要万分注意不要违反系统安全去执行某行代码而引起系统不稳定。加载第三方驱动代码的时候也要格外小心,因为一旦进入内核模式,所有系统级的代码都可以访问。所以Windows引入了驱动签名机制,如果用户安装没签名的驱动时,系统会报警告。
在64位Windows上,内核模式的代码签名条款规定任何64位的驱动代码必须要用官方给的密钥来签名(KMCS),而且用户不能强制安装未签名的驱动代码,即使是管理员权限也不行。但是有一个例外,那就是在启动时按F8进入boot选项,可以禁止强制驱动签名,如果这样设置了的话,桌面的壁纸上就会有水印,而且数字版权管理(DRM)功能会被禁止。普通应用程序调用系统服务的时候可以从用户模式切换到内核模式,比如读文件的功能最终还是需要调用操作系统的Readfile()函数,这就会切换到内核模式。这种转换用一个特殊的CPU指令进入到内核模式去执行Ntoskrnl.exe或Win32k.sys中的函数。在返回到用户模式的线程之前,会回到用户模式。操作系统就是用这种方式来保护系统数据的。
注意:从用户模式切换到内核模式不会影响线程调度。
所以,用户线程的时间一部分花在用户模式下,一部分花在内核模式下是很常见的。事实上,因为大量的图形和系统代码运行在内核模式,图形计算集中的程序会更多地执行在内核模式,可以微软的画图板程序来测试在哪个模式下执行的多。而D2D技术则大量的运行在用户模式下,只会发送少量的原始表面数据给内核来减少在两个模式下的转换。
有一个叫做csrss.exe的进程是专门负责原始输入的,比如鼠标,键盘,如果晃动一下鼠标会影起内核模式下csrss进程的活动。
有一个叫做idle的进程有时会占100%的CPU,其实它是一个假的进程,当CPU空闲的时候执行。终端服务指的是Windows提供了在单个系统上与多个用户交互的功能。远程用户可以使用终端服务与机器建立一个会话(Session),登陆,并且在服务器上运行程序。服务器将图形界面传输给远程用户(还可以传声音和剪贴板),远程用户传输用户的输入给服务器。
第一个建立的会话会被认为是服务会话,或者叫做Session0,包括系统服务宿主进程。Session0是服务器本机的控制台,其他Session可以通过远程桌面连接(mstsc.exe)或快速用户切换来登陆。
Windows客户端版本允许一个远程用户连接,如果有人登陆,其他人就不能操作了,当有其他人再登陆的时候,当前用户又被锁住。 Windows带MediaCenter的版本允许4个扩展会话,Windows服务器支持同时连接两个远程用户。 所有的windows客户端版本都支持在本地通过快速用户切换功能建立多个会话(开始->切换用户),切换后会话仍然活动状态。对象类型包括:
Windows最初的设计目标是为了满足各种政府部门的规定和行业安全级别,比如CCITSE。
Windows的核安全功能包括:
Windows对于对象有三种形式的访问控制:
Windows与其他操作系统不同之外在于Windows上大多数字符串都是以16位宽的Unicode字符来处理的。Unicode是国际标准的字符集。
因为很多程序以8位ANSI字符集来处理,很多Windows函数支持两个入口,一个是Unicode版本(16位宽字符)的一个是ANSI版本(8位窄字符)的。如果你调用窄字符的版本,会有一点效率影响,因为系统在处理前会转换成Unicode,然后输出时再转换成ANSI。但是Windows不会在文件中将ANSI转换成Unicode。怎么存到文件中由程序自己控制。
不用考虑语言,因为所有版本的Windows包含同样的函数,而不是每一个国家的语言单独用一个版本。
内核调试的意思是查看内核数据结构,单步跟踪函数的执行情况。是研究Windows内核的重要方式。
srv*c:\symbols*http://msdl.microsoft.com/download/symbols
更多帮助在 http://msdn.microsoft.com/en-us/windows/hardware/gg462988.aspx
WindowsSDK里最新的调试工具,这些工具用在用户模式和内核模式。
注意:这上结调试工具经常更新,而且与Windows的版本相关,所以最好下载最新版本。调试工具可以附加一个用户模式的进程来查看或修改其内存。附加的时候有两个选项:
有两种工具用来调试内核:
转载地址:http://hllgb.baihongyu.com/