21(43)---windows internal 第6版 mark david alex

每个windows进程都有自己私有的内存空间,但是内核模式代码和设备驱动程序共享同一虚拟地址空间。虚拟内存中的每个页面都有对应的标志,来表明处理器必须在哪个模式下访问(读/写)。系统空间的页面只能由内核模式访问,用户地址空间的页面可以被用户空间访问。只读页面(如静态数据页面)在任何模式下都是不可写的。此外,在支持不可执行内存保护的处理器上,windows将包含数据的页面标志为不可执行的,从而阻止数据段被有意无意的当做代码来执行。
 
32位windows对内核模式下运行的组件所发起的读写请求不提供任何保护。也就是说,一旦进入内核模式,操作系统和驱动程序代码拥有对系统地址空间的全部权限并且可以绕过windows的安全措施来访问对象。由于大部分操作系统代码运行在内核模式中,这些组件必须认真设计和测试,以便不违反系统安全规则或者导致系统不稳定。
由于没有保护,加载第三方驱动的时候必须特别小心。代码一旦处于内核模式,就能访问操作系统的全部数据。这个缺点也是windows引入驱动签名机制的原因之一,如果用户安装未签名的驱动,系统会给予警告或者阻止驱动的安装。(第二部分第八章有驱动签名的更多信息)。另外,驱动验证器可以帮助驱动开发者来找到安全或者可靠性方面的bug(缓冲区溢出,内存泄露等)。第二部分第10章有详细介绍。
在64位系统上,内核模式代码签名(Kernel Mode Code Signing (KMCS))机制保证任何64位驱动必须讲过签名。用户不能强制安装未经签名的驱动,即便是管理员也不行。启动时通过F8选择“禁用强制驱动签名”可以禁用这个限制。这会导致桌面有个水印并且数字版权管理(digital rights management (DRM))的某些特性被禁用。
第二章将会看到,当调用系统服务时,用户应用程序从用户态切换到内核态。例如,ReadFile最终需要调用内部windows例程来真正读取文件。由于需要访问系统内部数据结构,这个例程必须处于内核模式。用户模式到内核模式的转换时通过特定的处理器指令完成的。该指令会导致处理器进入内核模式并且进入系统服务分发代码来调用ntoskrnl.exe或者win32k.sys的对应函数。在返回控制权给用户线程之前,处理器切换回用户模式。通过这种方式,操作系统可以保护自身不被被用户代码修改。
用户模式和内核模式之间的互相切换并不影响线程调度。模式切换并不是上下文转换。第三章有更详细的信息。
正常情况下,一个用户线程会花费一部分时间在用户态,一部分时间在内核态。事实上,由于大部分绘图和窗口代码运行在内核模式下,图形密集的应用程序会在内核模式花费更多的时间。通过运行图形程序比如说画图,来观察用户模式和内核模式的计数器,可以很容易验证这一点。更先进的程序可以使用direct2d和组合等较新的技术,它们会在用户态计算大量数据,只发送原生表面数据到内核,降低了两种模式之间频繁切换所需的时间。
实验 内核模式  用户模式
可以利用性能监视器来查看系统在内核模式和用户模式花费的时间。
 
终端服务和多会话
终端服务是指在一个系统上允许多个可交互的用户会话的能力。利用终端服务,远程用户可以在另外一台机器上建立会话,登录并且运行程序。服务器会把界面传给客户端(还有其他可配置的资源如声音和剪贴板),客户端把用户输入传给服务端。(和Xwindow系统类似,windows允许在服务器系统上运行单独的程序)。
 
系统中的第一个会话是服务会话,也称为0会话,包含系统服务宿主进程(第4章有详细描述)。物理控制台的第一个登陆会话是session1,更多的会话可以通过mstcs.exe或者快速用户切换(稍后介绍)来创建。
windows客户端版本只允许一个远程用户连接,如果有远程用户登录,工作站会被锁定(也就是说,系统只能被远程使用或者本地使用,而不能以两种方式同时使用)。windows版本包含windows媒体中心允许一个交互会话和4个媒体中心扩展会话。
windows服务器支持两个并发远程连接,这是为了方便远程管理,可能某些管理工具要求登录到被管理的机器中方可使用。通过合适的授权并且配置为终端服务器,windows可以支持更多的远程连接。
 
所有的windows客户端版本支持本地创建多个会话,这一特性被称为快速用户切换。当用户选择断开会话而不是注销时,当前会话继续保持活跃,系统回到登录屏幕。如果新用户登录,则新会话被创建。
对于想知道是否运行在终端服务会话的程序来说,可以参考SDK中的Remote Desktop Services系列API。
第二章简单描述了如何创建会话,并且通过一些实验显示如何查看会话。第三章的对象管理器,描述系统对象命名空间如何基于每个会话来创建实例 以及 如何查看正在运行的对象有多少实例。第二部分第10章讲述内存管理器如何建立和管理会话范围的数据。
对象和句柄
在windows操作系统中,对象是值静态定义的对象类型的单个运行实例。对象类型包括系统定义的数据类型,操作类型实例的函数以及一组对象属性。编写windows程序时,会经常碰到进程,线程,文件和事件对象等等。这些对象基于windows创建和管理的更底层对象来进行工作。进程是进程对象类型的实例,文件是文件对象类型的实例。
对象属性,是指部分定义了对象状态的一组数据。如,进程对象有以下属性:进程id,基础调度优先权,令牌指针。对象方法,用于操作对象,可以读取或者改变对象属性。例如,进程的打开方法接收进程id作为参数,返回进程对象的指针。
注意:使用内核对象管理器API来创建对象时,有一个参数名为ObjectAttributes,这个参数不能和本章中的术语“对象属性”相混淆。
对象和普通数据结构的最根本差别在于对象的内部数据是透明的。你必须调用对象服务来访问数据,而不能直接访问对象的数据。这样可以把使用对象的代码和底层实现细节分开,以方便改变对象的实现细节。
通过对象管理器这一内核组件的帮助,对象提供了一个方便的途径来完成以下任务:
提供人工可识别的名字
跨进程共享资源和数据
防止未授权访问
引用跟踪,当对象不再被使用时,会自动销毁
并非系统的所有数据结构都是对象。只有需要共享,保护,命名和对用户态可见的数据结构才被放到对象中。只被单个组件用来实现内部函数的数据结构并不是对象。对象和句柄在第三章有详述。
安全
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值