正在加载图片...
为了能在对称多处理器(SMP)平台上安全运行,任何操作系统都必须解决这样一个问题 即,怎样保证正在某个处理器上运行的代码,不会同时访问和修改运行在另一个处理器上 的代码正在访问和修改的数据。例如,正在一个处理器上处理设备中断的最低层驱动程序 的ISR排斥其他对临界的、驱动程序定义的数据(或设备寄存器)的访问,以防它的设备 同时在另一个处理器上中断 此外,在单一处理器的机器中被序列化的驱动程序I/0操作在SMP机器中能被同时执行。 这就是说,当一个处理输入I/0操作的驱动程序例程在一个处理器上被执行的时候,另 个与设备通讯的例程能同时在另一个处理器上被执行。不论是运行在单处理器机器上,还 是SP机器上,都要求包括wDM驱动程序在内的所有内核模式驱动程序能同步访问系统定 义的数据或系统提供给驱动程序例程共享的资源,并且在任何时候要同步对物理设备的访 问 MT内核组件输出了一个机制,被称为自旋锁( spin lock),对称多处理器平台中一个或 多个正在运行的例程同时访问时,它被用来保护共享数据(或设备寄存器)。内核对自旋 锁的应用使用了两个策略: 在任何时刻,一个且仅一个例程能拥有一个特定的自旋锁:仅仅自旋锁的拥有者才能 访问它所保护的数据。另一个例程必须取得自旋锁后,才能访问相同的数据,并且 除非自旋锁的当前拥有者主动释放了它,否则其他任何例程都不能得到它。 象硬件和软件中断向量一样,内核为系统中的每一个自旋锁制定一个相关的IRL值。 内核模式例程只有运行在自旋锁指定的IRL上时,才能到特定的自旋锁。 这些策略用来保护某个驱动程序例程被更高优先级的驱动程序例程所抢占,前者通常是在 较低的IRL上运行,但是现在却拥有某个自旋锁,后者则希望获取同样的自旋锁,这通常 会造成死锁。 分配给某个自旋锁的IRL通常是能获得这个自旋锁的最高层IRQL例程的IRQL。一个最低 层驱动程序的ISR频繁地与驱动程序的DPC例程共享一个状态区,后者靠调用驱动程序提 供的临界区例程来访问共享区域。在这个例子中,保护共享区域的自旋锁拥有与 DIRQL相 同的IRL,设备中断通常发生在DIRL。当临界区例程拥有自旋锁并且在 DIRQL上访问共 享区域,ISR不能在单处理器机器中运行,这是因为设备中断被屏蔽,正如前面提到的那 样。在一个对程多处理器机器中,当临界区例程拥有自旋锁并且在 DIRQL访问共享数据 时,ISR还不能获得自旋锁以保护共享数据。 通过等待内核的调度者对象之一,一组内核模式线程能同步访问共享数据或资源。这些调 度对象有:事件、互斥体、信号量、定时器、或另一个线程。然而,大多数驱动程序不创 建它们自己的线程,因为当它们避免线程环境交换的同时,获得了更好的性能。对时间要 求比较苛刻的内核模式支持例程和驱动程序无论何时运行在 IRQL DISPATCH LEVEL或 DIRQL,都必须使用内核的自旋锁,从而来同步对共享数据和资源的访问。 想要得到更详细的信息,可以参看第16章“使用自旋锁和管理硬件优先级”,第3章“内 核调度对象” 1.3.5基于对象 Windows nt/ Windows2000是基于对象的系统。在执行体中,各种各样的组件定义一个或 多个对象类型。每个组件输出仅内核模式具有的支持例程,当这些例程被调用时,它们操 纵它的对象类型的实例。没有组件被允许直接访问另一个组件的对象类型的任何实例。每 个组件要想使用其他的组件对象,必须调用输出的支持例程。9 为了能在对称多处理器(SMP)平台上安全运行,任何操作系统都必须解决这样一个问题: 即,怎样保证正在某个处理器上运行的代码,不会同时访问和修改运行在另一个处理器上 的代码正在访问和修改的数据。例如,正在一个处理器上处理设备中断的最低层驱动程序 的 ISR 排斥其他对临界的、驱动程序定义的数据(或设备寄存器)的访问,以防它的设备 同时在另一个处理器上中断。 此外,在单一处理器的机器中被序列化的驱动程序 I/O 操作在 SMP 机器中能被同时执行。 这就是说,当一个处理输入 I/O 操作的驱动程序例程在一个处理器上被执行的时候,另一 个与设备通讯的例程能同时在另一个处理器上被执行。不论是运行在单处理器机器上,还 是 SMP 机器上,都要求包括 WDM 驱动程序在内的所有内核模式驱动程序能同步访问系统定 义的数据或系统提供给驱动程序例程共享的资源,并且在任何时候要同步对物理设备的访 问。 NT 内核组件输出了一个机制,被称为自旋锁(spin lock),对称多处理器平台中一个或 多个正在运行的例程同时访问时,它被用来保护共享数据(或设备寄存器)。内核对自旋 锁的应用使用了两个策略: ▪ 在任何时刻,一个且仅一个例程能拥有一个特定的自旋锁;仅仅自旋锁的拥有者才能 访问它所保护的数据。另一个例程必须取得自旋锁后,才能访问相同的数据,并且, 除非自旋锁的当前拥有者主动释放了它,否则其他任何例程都不能得到它。 ▪ 象硬件和软件中断向量一样,内核为系统中的每一个自旋锁制定一个相关的 IRQL 值。 内核模式例程只有运行在自旋锁指定的 IRQL 上时,才能到特定的自旋锁。 这些策略用来保护某个驱动程序例程被更高优先级的驱动程序例程所抢占,前者通常是在 较低的 IRQL 上运行,但是现在却拥有某个自旋锁,后者则希望获取同样的自旋锁,这通常 会造成死锁。 分配给某个自旋锁的 IRQL 通常是能获得这个自旋锁的最高层 IRQL 例程的 IRQL。一个最低 层驱动程序的 ISR 频繁地与驱动程序的 DPC 例程共享一个状态区,后者靠调用驱动程序提 供的临界区例程来访问共享区域。在这个例子中,保护共享区域的自旋锁拥有与 DIRQL 相 同的 IRQL,设备中断通常发生在 DIRQL。当临界区例程拥有自旋锁并且在 DIRQL 上访问共 享区域,ISR 不能在单处理器机器中运行,这是因为设备中断被屏蔽,正如前面提到的那 样。在一个对程多处理器机器中,当临界区例程拥有自旋锁并且在 DIRQL 访问共享数据 时,ISR 还不能获得自旋锁以保护共享数据。 通过等待内核的调度者对象之一,一组内核模式线程能同步访问共享数据或资源。这些调 度对象有:事件、互斥体、信号量、定时器、或另一个线程。然而,大多数驱动程序不创 建它们自己的线程,因为当它们避免线程环境交换的同时,获得了更好的性能。对时间要 求比较苛刻的内核模式支持例程和驱动程序无论何时运行在 IRQL DISPATCH_LEVEL 或 DIRQL,都必须使用内核的自旋锁,从而来同步对共享数据和资源的访问。 想要得到更详细的信息,可以参看第 16 章“使用自旋锁和管理硬件优先级”,第 3 章“内 核调度对象”。 1.3.5 基于对象 Windows NT/Windows 2000 是基于对象的系统。在执行体中,各种各样的组件定义一个或 多个对象类型。每个组件输出仅内核模式具有的支持例程,当这些例程被调用时,它们操 纵它的对象类型的实例。没有组件被允许直接访问另一个组件的对象类型的任何实例。每 个组件要想使用其他的组件对象,必须调用输出的支持例程
<<向上翻页向下翻页>>
©2008-现在 cucdc.com 高等教育资讯网 版权所有