admin管理员组

文章数量:1537032

ACPI Docking for Windows Operating Systems

  • ACPI介绍
  • 扩展单元(Expansion Units)
    • 标识ACPI命名空间中的扩展单元
    • 扩展单元的最低硬件要求
  • 直通设备和端口
    • 描述ACPI中的直通设备和端口
      • PCI Devices
      • USB Ports
      • COM Ports
      • IEEE 1394 Controller
      • LPT Port
  • 电气隔离和直通设备
      • Hot-Undocking Sequence for Windows 2000 and Windows XP
      • Hot-Undocking Sequence for Windows 98 and Windows Me
      • Adjusting an _EJ0 Method Based on the Operating System Version
  • 单个系统上的多个扩展单元
    • 支持不同的扩展单元
    • 支持堆叠扩展单元
  • 处理序列号
  • Physical Security
    • Physical Keylock
    • 软件控制锁定机制
    • 抑制Windows 98/Windows Me的安全删除消息
  • 在扩展坞使用PCI-to-PCI桥
  • Undocking
    • Warm Undocking
    • Surprise Undocking

本文描述了如何在运行Windows操作系统的计算机的BIOS中实现基于acpi的对接。 基于ACPI Docking for Windows Operating Systems一文2002年的译制版本,且适用对象为windows 2000 和 windows 98,版本太过古老,没有参考价值,本文只是作为一个翻译纪念。The current version of this paper is available on the web at http://www.microsoft/hwdev/tech/onnow/ACPIdock.asp

ACPI介绍

高级配置和电源接口(ACPI)规范是一个开放的行业规范,开发该规范是为了建立行业公共接口,支持对设备和整个系统进行健壮的操作系统(OS)导向的主板设备配置和电源管理。ACPI是操作系统导向的配置和电源管理(OSPM)中的关键元素。
ACPI将现有的电源管理BIOS代码集合、高级电源管理(APM)应用程序编程接口(api)、PNPBIOS api、多处理器规范(MPS)表等发展为定义良好的电源管理和配置接口规范。ACPI为从现有(遗留)硬件到ACPI硬件的有序过渡提供了手段,它允许ACPI和遗留机制同时存在于一台机器中,并在需要时使用。
此外,新的系统架构正在构建中,它延伸了当前即插即用界面的限制。ACPI发展现有的主板配置接口,以更健壮和潜在更有效的方式支持这些高级架构。
ACPI run-time components. ACPI既不是软件规范,也不是硬件规范。相反,ACPI是一个同时包含软件和硬件元素的接口规范。ACPI有三个运行时组件:

  1. ACPI系统描述表描述了到硬件的接口。一些描述限制了可以构建的内容,但大多数描述允许以任意方式构建硬件,并且可以描述使硬件运行所需的任意操作序列。包含定义块的ACPI表可以使用ACPI机器语言(AML),这是一种由OSPM解释的伪代码。
  2. ACPI寄存器代表硬件接口中受约束的部分。它们的位置由ACPI描述表描述。
  3. ACPI系统固件是指与ACPI规范兼容的部分固件。通常,这是引导机器并实现睡眠、唤醒和一些重启操作接口的代码。

Device Descriptions. 设备被描述在一个层次ACPI命名空间中,其中设备根据它们的总线拓扑被安排。因为这个名称空间来自BIOS,所以只有内置到机器中的设备(主板设备)或扩充口才能在名称空间中描述。此外,名称空间只列出具有某些未被行业标准规范控制的特性的设备。
例如,COM端口总是在命名空间中列出,因为没有其他机制来设置ISA COM端口的硬件资源。但是,完全兼容外设组件互连(PCI) 2.2的设备,例如焊接在主板上的网络适配器芯片,不需要在命名空间中列出,因为它的电源管理和即插即用功能完全可以由PCI总线控制。
Control methods. 控制方法定义了操作系统如何执行一个简单的硬件任务。例如,操作系统调用控制方法读取热区温度。控制方法是用AML编写的,并由兼容acpi的操作系统解释和执行。一个兼容ACPI的系统必须在ACPI表中提供最小的控制方法集。操作系统提供了一组定义良好的控制方法,ACPI表开发人员可以在他们的控制方法中引用。控制方法也用于系统范围的任务,如事件处理。
EVENT ACPI包括用于即插即用、热和电源管理事件的通用事件模型。事件模型由两个寄存器组成:一个事件状态寄存器和一个事件启用寄存器。

当事件发生时,核心逻辑在状态寄存器中设置一个位来指示事件。如果在使能寄存器中相应的位被设置,核心逻辑断言系统控制中断(SCI)向操作系统发出信号。当操作系统接收到这个中断时,它运行与事件状态寄存器中设置的任何位对应的控制方法。这些控制方法使用AML命令告诉操作系统发生了哪个事件。例如,当移动PC被对接时,核心逻辑设置状态位并向SCI发出信号。操作系统检查状态位,并运行该位的控制方法。该控制方法检查硬件并确定该事件是停靠事件。然后,它会向操作系统发出一个停靠事件已经发生的信号,并可以明确地告诉操作系统新设备将出现在设备层次结构中的何处。

ACPI事件要么是固定事件,要么是通用事件。当OSPM收到一个固定的事件时,它直接读取并处理自己注册的事件。当OSPM接收到通用事件(GPE)时,它要么将控制传递给acpi感知驱动程序,要么使用oem提供的控制方法来处理事件。一个OEM可以在每个GPE块的硬件中实现多达128个通用事件输入,每个都可以作为水平触发或边缘触发事件。如果它是在系统中定义的唯一块,它也可能实现一个单一的256引脚块。

OEM AML代码可以执行特定于OEM的功能,这些功能是针对特定平台可能生成的每个事件定制的,方法是执行与事件匹配的控制方法。对于GPE事件,OSPM将执行以下名称的控制方法:

\_GPE._TXX

XX为需要处理的事件的16进制值
T表示事件处理类型:’ E ‘表示边缘触发事件,’ L '表示水平触发事件
_LXX或_EXX控制方法确定发生了什么,并调用Notify函数告诉操作系统该做什么。Notify接受两个参数:受此事件影响的ACPI命名空间中的设备名称,以及通知操作系统采取哪个操作的通知代码。一些标准的事件通知是:
0 -枚举这个总线
1 -检查设备(具体设备被添加或删除)
2 -设备正在唤醒
3 -请求弹出
Dock事件通知包括:
0 -连接Dock
1或3 -弹出Dock

扩展单元(Expansion Units)

本文使用术语“扩展单元”来指代外接站、端口复制器和类似的设备,如硬件片(通常向便携式计算机添加一或两个功能的单元,如存储和电池)。ACPI对接以相同的方式对待所有这些设备。

标识ACPI命名空间中的扩展单元

如果一个设备实现了_DCK方法,ACPI规范将它描述为具有Dock站功能的设备。系统制造商可能为几种不同类型的扩展单元(包括端口复制器和片)实现_DCK方法,因为_DCK方法会导致Windows开始菜单显示一个弹出PC命令。_DCK方法还支持扩展单元的特定配置文件设置,如视频分辨率。

正如ACPI规范的作者最初设想的那样,网络控制器和pci - pci桥等设备在ACPI名称空间中得到了扩展,以包括隔离(_DCK)、识别(_UID)和排除(_EJx)所需的支持代码。不幸的是,这种设计不允许扩展单元被操作系统“标记”。Windows 98、Windows Me和Windows 2000操作系统总是在消息和对话框中将_DCK设备标识为通用的“对接站”,而不是使用_DCK设备的名称。这样用户就不会收到对操作系统准确但对用户毫无意义的消息,例如“现在可以安全地将您的笔记本电脑从‘Intel 82380PB PCI到PCI Dock桥’断开”。

然而,由于几个原因,系统制造商可能希望定制显示给用户的扩展单元的名称。例如:

  • 如果移动PC可以被附加到一片和一个完整的扩展坞(Docking Station)在同一时间,显示的信息在一个成功的把电脑请求(“现在安全的分离你的移动电脑扩展坞”)是模糊的,因为两个单位被称为“扩展坞”消息。
  • 端口复制器在默认情况下也被标记为“Docking Station”。一个系统制造商可能更喜欢保留“Docking Station”的名称,为其产品线中的高端扩展单元。

Windows XP仅为完全用于控制扩展单元的命名空间对象提供了标记_DCK设备的支持。BIOS通过使用一个带有PNP0C15的设备作为_CID和一个制造商定义的ID作为扩展单元的_HID来指示这一点。
下面的示例显示了来自ACPI BIOS的包含PCI-to-PCI桥的dock的ACPI源语言(ASL)代码。在本例中,_HID为
OEM1234。

Example 1.  An ACPI Namespace Object Dedicated to Controlling an Expansion Unit
Device(_SB)
    // Replicator device, replace *OEM1234 
    // with a vendor specific ID
    Device(DOCK)
        _HID    *OEM1234
        _CID    *PNP0C15
        _DCK    {...}
        _STA    {...}
        _EJ0    {...}
        _EJ3    {...}
        _EJ4    {...}
    Device(PCI0)
        ...
        Device(P2PB)
            // 
            // PCI to PCI bridge, d = Device, f = function
            // EJD associates this device with the 
            // docking station.
            _ADR    0xddddffff
            _EJD    \_SB.DOCK

当找到与_HID标识符匹配的已签名供应商提供的INF时,操作系统将在关于扩展单元的任何消息中显示该INF中指定的描述。还可以使用供应商提供的INF向dock添加特性,如本文后面的“物理安全”中描述的keylock支持。
如果没有找到与_HID方法中指定的标识符匹配的供应商提供的INF, Windows 2000和Windows XP将使用系统提供的标识*PNP0C15作为扩展坞的INF。
注意: Windows 98和Windows Me都不提供 *PNP0C15 ID的默认INF条目。如果这些操作系统上没有供应商提供的INF,那么dock中的设备可能无法启动。
下面的INF示例以斜体显示特定于设备的字符串。制造商将替换特定于扩展单元的字符串。

Example 2.  A Sample INF Showing Device-Specific Strings
[Version]
Signature="$WINDOWS NT$"
Class=System
ClassGuid={4D36E97D-E325-11CE-BFC1-08002BE10318}
Provider=%OEMName%
DriverVer=01/15/2001,1.0.0.0

[ControlFlags]
ExcludeFromSelect=*

[Manufacturer]
%OEMName%=OemSection

[OemSection]
%DockModel.DeviceDesc% = DockModelSection, *OEM1234

[DockModelSection]

[DockModelSection.NT]

[DockModelSection.NT.Services]
AddService = , 0x00000002   ; null service install

[Strings]
OEMName=OEM company name
DockModel.DeviceDesc=Dock Model Description for user

扩展单元的最低硬件要求

用_DCK方法描述的扩展单元必须支持以下特性:
存在通知。BIOS必须能够确定扩展单元是物理上连接还是分离。具体来说,BIOS必须能够做以下事情:

  • 当扩展单元连接时,呼叫Notify(,0)
  • 当级联单元分离时,呼叫Notify(,1)
  • 如果扩展单元在机器休眠时被分离,可以通过_STA方法提供正确的状态信息

电气隔离。Windows 2000和Windows XP只需要PCI和IDE直通设备和端口的电气隔离。Windows 98和Windows Me要求对所有直通设备和端口进行电气隔离。有关更多信息,请参阅本文后面的“直通设备和端口”。
序列号。硬件的Windows徽标程序要求所有坞站上都有唯一的序列号。只要不可能有另一个相同的停靠站提供相同的编号,序列号可以以任意数量的方式提供。序列号的常见来源包括来自网络适配器的MAC地址、来自IEEE 1394控制器的EUI64标识符以及在工厂中燃烧的eprom。
端口复制器和片不需要提供唯一的序列号。但是,如果replicator或slice有_DCK方法,那么这些设备的BIOS必须提供一个假的序列号。有关信息,请参阅本文后面的“处理序列号”。

直通设备和端口

描述ACPI中的直通设备和端口

大多数直通设备和端口需要BIOS实现一个_EJD方法,该方法将设备与ACPI名称空间中的dock相关联,如本节所述。PS/2端口和视频端口例外:

  • ps / 2端口。PS/2端口的BIOS中不需要做任何事情。所有PS/2端口设备都可以安全地移除,操作系统会在任何dock或undock事件中自动重新扫描PS/2端口。
  • 视频端口。VGA端口不需要在ACPI命名空间中描述。显示特定的设置,如伽马调整和刷新率是绑定到即插即用ID返回的现代显示器。如果在对接或脱离对接操作期间或任何其他时间出现或消失监视器,操作系统将自动切换到正确的设置。
    ACPI规范中描述_ADR方法的部分记录了适用于特定总线(PCI、USB等)上的设备的值。有关更多信息,请参见http://www.microsoft/hwdev/tech/onnow/HotSwap.asp上的“在ACPI中实现热插拔设备支持”。

PCI Devices

当扩展单元分离时消失的PCI设备必须在ACPI命名空间中描述,除非它的父设备已经与扩展单元相关联。如果不这样做,可能会导致在分离扩展单元时系统挂起。

Example 3.  A PCI to PCI docking bridge
Device(P2PB)             // PCI to PCI bridge
    _ADR    0xddddffff   // Device dddd, function ffff
    _EJD    \_SB.DOCK    // Expansion unit in namespace

USB Ports

通过移动PC连接到扩展单元的USB接口必须在ACPI命名空间中描述。如果不这样做,当用户解绑定到USB端口的硬盘驱动器时,可能会导致数据损坏。当应用程序或操作系统无法将缓存的更改刷新到卷时,就会发生损坏。

Example 4.  USB port 1 Passed Through a Mobile PC to a Port Replicator
Device(USBC)             // PCI USB controller
    _ADR    0xddddffff   // Device dddd, function ffff

    Device(RHUB)         // USB root hub
        _ADR    0        // Root hub is always 0
        Device(USBA)   
            _ADR    1          // Port 1 on USB controller
            _EJD    \_SB.REPL  // Expansion unit in namespace

下面的示例展示了带有集成集线器的移动PC如何通过集线器将USB端口2传递到扩展坞。

Example 5.  USB Port 2 Passed Through an Integrated Hub to a Docking Station
Device(USBC)             // PCI USB controller
    _ADR    0xddddffff   // Device dddd, function ffff

    Device(RHUB)         // USB root hub
        _ADR    0        //  (Root hub is always 0)

        Device(IHUB)   
            _ADR    1    // Internal hub on USB ctrl port 1
            _RMV    { return 0; } // Let OS know hub is internal

            Device(UPST) // Hub port #2
                _ADR    2
                _EJD    \_SB.DOCK

COM Ports

通过移动PC连接到扩展单元的COM端口必须在ACPI命名空间中描述。如果一个可枚举的串行设备(如旧的数码相机)通过COM端口连接到扩展单元,那么当扩展单元被分离时,如果不能这样做,可能会导致意外移除警告。

在ASL中描述COM端口后面的设备是不可能的,因此BIOS必须将COM端口本身与ACPI命名空间中的扩展单元相关联。弹出操作时,操作系统关闭COM端口及其背后的设备。弹出操作完成后,BIOS会提示COM口存在,操作系统会重新启动COM口。

Example 6.  A Mobile PC with a Pass-Through Serial Port
Device(ISA0)             // PCI to ISA bridge
    _ADR    0xddddffff   // Device dddd, function ffff

    Device(COM1)         // Com port 1
        _HID    *PNP0501
        _STA    {...}
        _EJD    \_SB.DOCK
        ...

IEEE 1394 Controller

ACPI规范目前没有定义描述IEEE 1394控制器后的设备或端口的机制。当ieee1394端口通过移动PC连接到扩展单元时,ieee1394控制器必须与ACPI命名空间中的扩展单元相关联。如果ieee1394存储单元被连接到扩展单元,那么失败肯定会导致数据损坏。

在命名空间中描述ieee1394控制器意味着每个ieee1394设备(即使是内部设备)都必须在断开对接操作期间关闭。如果系统使用内部的IEEE 1394硬盘驱动器来安装操作系统,那么移动PC就不能通过IEEE 1394端口到达对接站,因为引导驱动器永远不能被关闭。

描述ieee1394控制器后的设备或端口需要对ACPI 2.0规范进行修订。操作系统支持将包括在未来的操作系统发布后,这样的修订被批准。

Example 7.  A Mobile PC with a Pass-Through IEEE 1394 Port
Device(1394)             // 1394 controller
    _ADR    0xddddffff   // Device dddd, function ffff
    _EJD    \_SB.RPLR    // Port replicator

LPT Port

通过移动PC连接到扩展单元的LPT端口必须在ACPI命名空间中描述。如果存储设备(如ZIP驱动器)连接到扩展单元,那么当用户解离扩展单元时,如果不这样做,可能会导致数据损坏。
与COM端口一样,在ASL中无法描述LPT端口后面的设备,因此BIOS必须将LPT端口本身与对接站关联起来。

如果打印机连接到并行端口,Windows 2000有时会阻止分离操作。这个问题在Windows XP中被修复了,所以BIOS应该显式测试Windows 2000和“禁用”那个版本的Windows的_EJD。有关检测操作系统版本的信息,请参阅本文末尾的参考资料列表。
如果_EJD指向一个不存在的节点,Windows 2000将用一个糟糕的BIOS错误对系统进行bug检查,因此ASL代码应该像下面的示例中所示的那样编写。

Example 8.  A Mobile PC with a Pass-Through LPT Port
Device(ISA0)             // PCI to ISA bridge
    _ADR    0xddddffff   // Device dddd, function ffff

    Device(LPT1)         // LPT port 1
        _HID    *PNP0401
        _STA    {...}
        Method(_EJD)
        {
            Store (\_OS,local0)
// SCMP (string compare function), implementation
// dependent. Takes two inputs and returns 0 if 
// true, one or ones if false            
            Store (SCMP(local0,"Microsoft Windows NT"),local1)

            If (local1)
            {
                 // Windows 9x, ME, or other.
                 return \_SB.DOCK
            } 

            // It is Windows 2000 or better. Check _OSI
            // against Windows 2001 in case _OSI support
            // was added to Windows 2000 in a service pack.
         If (CondRefOf(_OSI,Local0)) 
         {
             if (\_OSI("Windows 2001"))
             {
                 // Windows XP or better.
                    return \_SB.DOCK
             }
            }

            // Win2K - Point to never present device.
            return “\_SB.PCI0.ISA0.DMMY”
        }
  
    Device(DMMY)         // Dummy device for Win2K printer _EJD
        _HID    *PNP0C02
        _STA    0

电气隔离和直通设备

ACPI规范的1.0版本假定所有热移动扩展单元在移动PC和任何设备之间提供完全的电气隔离。对于Windows 2000/Windows XP和Windows 98/Windows Me, BIOS应该为需要它的总线(PCI和IDE)在_DCK方法中执行完全的电气隔离。

非电气隔离的直通设备由Windows 98/Windows Me和Windows 2000/Windows XP不同处理:

  • Windows 98/Windows Me不支持没有电气隔离的直通设备,因此当非隔离直通设备在这些操作系统上分离时,没有办法防止“意外移除”通知或存储移除通知。为了防止这些信息的出现,完全的电气隔离是必要的。
  • Windows 2000/Windows XP do支持热移除直通设备,不电气隔离。但是,适当的支持需要系统制造商为Windows 2000/Windows XP挂起_EJ0方法,而不是为Windows 98/Windows Me挂起_EJ0方法,因为两个操作系统之间的热分离顺序不同。在Windows 98/Windows Me上挂起_EJ0方法将导致操作系统在用户物理分离移动PC后显示“safe to detach”消息。

介绍Windows 2000/ XP操作系统和Windows 98/Windows Me操作系统热hot-undocking 顺序的区别,以及根据操作系统版本调整“_EJ0”方法的指导。

Hot-Undocking Sequence for Windows 2000 and Windows XP

Windows 2000/Windows XP的Hot-Undocking顺序如下:

  1. 操作系统卸载扩展单元设备的驱动程序。
  2. 操作系统调用_DCK(0)方法。
  3. 操作系统向用户显示安全删除通知:
    “Windows已经完成了与系统的对接。如果你需要从对接站移除系统,请现在就移除。”
  4. 操作系统开始异步执行_EJ0方法。
    BIOS挂起_EJ0方法,直到用户将移动PC与扩展单元分离。
  5. BIOS完成_EJ0方法。

操作系统将重新启动在解锁操作期间未消失的任何设备。
Windows 2000和Windows XP在_DCK方法完成后显示安全删除通知消息,因为_DCK方法应该在需要它的总线上电隔离所有通入设备(如PCI或IDE)。

BIOS挂起_EJ0方法,直到分离扩展单元之后,以防止操作系统过早地重新启动通过直通端口仍然可见的任何设备。用户可能会请求弹出操作,然后忘记分离笔记本。如果扩展区有一个物理联锁,如果30秒后没有用户活动发生,BIOS可以选择性地“重新对接”移动PC。

这个解决方案有两个缺点,BIOS作者应该注意:

  • Windows 2000/Windows XP在运行_EJ0之前会显示安全删除对话框,所以在物理锁定的系统上,解锁尝试不会失败。
  • Windows 98和Windows Me的热脱扣序列不支持不带电气隔离的直通设备,因此_EJ0方法必须在Windows 98/Windows Me和Windows 2000/Windows XP中不同地运行,在本节后面将介绍。

Hot-Undocking Sequence for Windows 98 and Windows Me

Windows 98和Windows Me使用以下热undock顺序:

  1. 操作系统卸载扩展单元设备的驱动程序。
  2. 操作系统调用_DCK(0)方法。
  3. 操作系统调用_EJ0方法并等待它完成。
  4. 操作系统向用户显示安全删除通知:
    Windows命令电脑断开连接。如果您需要手动弹出系统,请现在就这样做。”
  5. 操作系统将重新启动在解锁操作期间未消失的任何设备。

如果BIOS挂起_EJ0方法,直到dock从Windows 98/Windows Me上的扩展单元分离,用户将不会被告知它是安全的,直到扩展单元已经物理上分离,使通知消息毫无意义。

Adjusting an _EJ0 Method Based on the Operating System Version

用于Windows 2000/ XP和Windows 98/Windows Me的BIOS应根据操作系统调整_EJ0方法的行为,示例如下:

Example 9.  Adjusting an _EJ0 Method Based on the Operating System Version
Method(_EJ0)
{
    //
    // Set lights or other indicators
    //
    Store (_OS, local0)

    // SCMP (string compare function), implementation
    // dependent. Takes two inputs and returns 0 if 
    // true, one or ones if false            
    if (Not(SCMP(local0, "Microsoft Windows NT")))
    {
        //
        // Windows 2000, Windows XP, or later version. 
        // Wait for physical detach of expansion unit.
        // 
    }
}

单个系统上的多个扩展单元

支持不同的扩展单元

直通设备为暴露多个扩展单元的BIOS带来了特殊的困难。考虑ACPI名称空间中的以下三个对象:

Example 10a.  Full Docking Station
Device(FDCK)
    _HID    *OEM1234
    _CID    *PNP0C15
    _DCK    {...}
    _STA    {...}
    _UID    {...}
    _EJ0    {...}
Example 10b.  Mini-Dock
Device(MDCK)
    _HID    *OEM1235
    _CID    *PNP0C15
    _DCK    {...}
    _STA    {...}
    _UID    {...}
    _EJ0    {...}
Example 10c.  COM Port 1
Device(COM1)
    _HID    *PNP0C15
    _EJD    \_SB.GDCK

在上面的例子中,完整的dock和迷你dock都通过COM端口。然而,ACPI规范只允许_EJD指向一个名称空间对象。此外,没有已定义的机制来告诉OS重新计算_EJD方法。Windows 98和Windows Me将在COM端口启动时读取该值。Windows 2000和Windows XP都在表加载过程中读取_EJD一次,并且再也不会评估它。因此,BIOS必须将两个坞站的代码分解为一个全局坞。

支持堆叠扩展单元

一些移动pc可以同时支持多个扩展单元。一个常见的例子是将移动PC连接到一个片上,这个片又连接到一个完整的对接站(都使用_DCK方法)。下面的示例显示了支持这种场景的适当的ASL。

Example 12.  ASL for Stacked Expansion Units
Device(_SB)

    Device(SLCE)
        //
        // Slice 
        //
        _HID    *OEM1234
        _CID    *PNP0C15
        _DCK    {...}
        _STA    {...}
        _UID    {...}
        _EJ0    {...}

        Device(DOCK)
            //
            // Full dock that attaches only to
            // slice
            //
            _HID    *OEM1235
            _CID    *PNP0C15
            _DCK    {...}
            _STA    {...}
            _UID    {...}
            _EJ0    {...}

如果DOCK对象没有放在SLCE对象下,那么Windows 2000和Windows XP将创建一个无关的硬件配置文件。之所以会出现这种情况,是因为在引导过程中,操作系统可能会在SLCE之前找到DOCK。由此产生的四个概要文件将是undock、SLCE、SLCE+DOCK和DOCK。

如果在有多个扩展单元的系统中调用“开始”菜单上的“弹出PC”选项,Windows 2000和Windows XP将始终选择命名空间中最深的设备。目前还没有办法指定不同的行为。
注意堆叠的扩展单元需要额外的PNPBIOS序列号代码。有关更多信息,请参见本文后面的“处理序列号”。

处理序列号

所有启用acpi的Windows版本都在引导的实时模式加载程序阶段检索PNPBIOS停靠序列号。这允许操作系统选择正确的硬件配置文件并使用其设置引导,而不必首先加载HAL和ACPI驱动程序。因此,Windows操作系统必须能够将PNPBIOS序列号与一个或多个坞站返回的ACPI序列号关联起来。匹配这两个数字的算法取决于操作系统。
Windows 98 / Windows Me。这些版本的Windows忽略由_UID方法指定的序列号,而执行_BDN方法。_BDN方法必须返回与PNPBIOS返回的序列号完全匹配的整数。如果连接了两个扩展单元,BIOS必须确保PNPBIOS编号唯一地表示这两个单元的组合。而且,每个_BDN必须返回这个数字。
Windows 2000 / XP。这些版本的Windows忽略了_BDN方法,只依赖于_UID方法。_UID方法可以返回任何字符串,只要这些字符属于ASCII集0x21(" ! “)到0x7F (” DEL “),除了0x2C(”, ")。与Windows 98和Windows Me一样,PNPBIOS返回的序列号必须是这两个单元的唯一组合。在_UID方法中返回的字符串不需要相同,应该是不同的字符串。
片/端口复制器Slice/Port Replicator。虽然切片或端口复制器都不需要有唯一的序列号,但是如果切片或复制器有_DCK方法,BIOS仍然必须向OS显示序列号的外观。例如,考虑一台移动PC,它可以单独连接到复制器、切片、基座或复制器和基座的组合上。这种移动PC的BIOS可能计算serial number,如下表所示。
Table 1. PNPBIOS Serial Number Calculated by _BDN Method for Windows 98/Windows Me

CaseValue Returned by _BDN Method
Nothing attached to mobile PCFail PNPBIOS serial number request
Replicator presentReturn 1
Slice alone presentReturn 2
Slice and dock presentReturn 2 + Serial number

Table 2. PNPBIOS Serial Number Calculated by ACPI _UID Method for Windows 2000/Windows XP

CaseValue Returned by _UID Method
Nothing attached to mobile PCN/A
Replicator presentReplicator _UID returns 1
Slice alone presentSlice _UID returns 2
Slice and dock presentSlice _UID returns 2
Dock _UID returnsSerial number

Physical Security

物理安全指的是防止移动PC从坞站被移走的能力。扩展单元可以用物理键锁或软件控制的锁定机构进行固定。如果扩展单元被物理锁定,BIOS通过软件解除该单元的尝试将会失败,如果可能的话,会抑制可能使用户困惑的安全删除消息。

Physical Keylock

如果移动PC在物理上被锁定在对接站中,BIOS设计人员可能希望BIOS在解除移动PC的任何尝试中失败,因为安全移除对话框可能会诱使用户对其硬件施加过度的力量。由于本文前面描述的原因,停靠设备上_EJ0失败对Windows 2000和Windows XP没有影响。

为了提供合适的用户界面,制造商可能会提供一个对坞站加载的驱动程序。这样的驾驶员将运行一种方法来确定空间站是否被锁定,如果是,则无法完成脱离操作。有关为Windows操作系统编写驱动程序的信息,请参阅Windows DDK。本文最后列出了DDK的可用性。

软件控制锁定机制

如果对接站有一个不可战胜的锁定机制(即,一个用户无法用物理力量克服的锁定机制),那么移动PC可以通过操作系统软件进行保护。在机器处于关闭状态时,这样一个系统上的BIOS应该忽略任何解除移动PC的请求,如果注册了物理解除移动PC的请求,BIOS应该唤醒机器。

默认情况下,Windows 2000和Windows XP允许任何用户通过开始菜单弹出移动PC。“控制面板”的本地安全策略编辑器“用户权限/从连接站移除电脑”选项可用于限制哪些用户可以弹出移动电脑。
Windows 2000不会阻止任何从物理弹出按钮启动的卸载尝试。想要限制此选项的制造商必须编写一个服务或应用程序来注册硬件配置文件更改,并否决由不合格用户发起的任何更改。有关注册硬件相关通知的信息,请参阅Microsoft Platform SDK,它可以通过Microsoft MSDN Professional订阅获得。

Windows XP提供了一个内置选项来限制从物理弹出按钮初始化的解锁尝试。控制面板中的本地安全策略编辑器“安全选项/允许在不必登录的情况下解除停靠”选项将阻止从物理弹出按钮发起的解除停靠尝试,除非当前登录到控制台的用户具有“从对接站移除计算机”特权。

抑制Windows 98/Windows Me的安全删除消息

出于可用性考虑,锁定系统上的BIOS在尝试解绑定物理上锁定的移动PC时应该会失败,因为安全删除消息可能会误导用户尝试强制解绑定移动PC,这可能会损坏硬件。
BIOS不可能使_LCK和_DCK方法失败,也不可能检索设备的当前锁定状态。对于Windows 98/Windows Me, BIOS可以通过在热脱扣操作期间_EJ0方法失败来抑制物理锁定的移动PC的安全移除消息。

这种技术不适用于Windows 2000/Windows XP,因为这些操作系统在运行_EJ0之前会显示安全删除消息,所以即使BIOS失败_EJ0也会出现该消息。
有关实现在不同操作系统上以不同方式工作的_EJ0方法的信息,请参阅本文前面的“基于操作系统版本调整_EJ0方法”。

在扩展坞使用PCI-to-PCI桥

关于PCI桥的问题在一个单独的论文中被详细地覆盖,“在Windows 2000和Windows XP上的PCI-to-PCI桥和CardBus控制器,”在这个文档的结尾列出。本节总结了对接特别关注的两个领域。
正译码与减法译码。 PCI-to-PCI桥可以配置为正译码或减法译码。
由于对内存分配的限制,减法解码对整个系统有很大的缺点。然而,如果一个坞站没有PCI插槽但是确实有PC卡插槽,桥应该为减法解码配置。这确保了需要遗留地址的少数PCMCIA卡能够工作。
如果对接站有PCI插槽,它应该被配置为正解码。这最大限度地提高了PCI插槽中的设备的性能,并允许对桥接器后面的设备进行点对点DMA,当桥接器被配置为减法解码时,这是不可能的。

在Dock中的桥vs在移动PC中的桥。pci - pci对接桥应该始终可见,或者仅基于_DCK方法可见。这是由制造商决定是否安装桥在坞站或在移动PC。
桥总是在移动PC中存在的一个优点是,它允许BIOS用一个大的资源窗口预配置桥。默认情况下,Windows 2000和Windows XP将配置新检测到的网桥,只有4K的I/O空间,这有时会由于硬件资源不足而阻止网桥后面的设备启动。

Undocking

本节提供了支持热脱舱(warm undocking)和意外脱舱(surprise undocking)的指导原则。

Warm Undocking

“热脱坞”指的是同时脱坞并让机器进入睡眠状态的能力。ACPI规范通过在_DCK对象的名称空间中存在_EJ1-_EJ4方法来识别热分离支持。Windows可以支持具有热脱坞和热脱坞功能的对接站。
Windows 2000和Windows XP请根据以下算法选择合适的_EJx方法:

  1. Windows首先尝试热弹出(S0)。
    如果BIOS没有提供_EJ0方法,或者移动PC的总电池电量低于热脱坞阈值,这个状态是不允许的。
  2. 如果热弹出是不可能的,Windows下一步尝试解挂起进入睡眠状态(S1 - S3,按照这个顺序)。
    如果BIOS不提供任何_EJ1 - _EJ3方法,或者电池总可用电量低于休眠undock阈值,这些状态是不允许的。
  3. 如果无法解除到休眠状态,那么如果BIOS通过_EJ4方法支持,Windows将尝试解除到休眠状态(S4)。
    Windows 2000和Windows XP可以支持同一ACPI对象上的_EJx方法的任何组合(例如,_EJ0、_EJ3和_EJ4)。
    解绑定功率阈值的默认值是:
  • 热脱坞阈值:电池剩余电量最小10%
  • 休眠解锁阈值:电池剩余电量最小为0%

Windows使用的最小睡眠阈值为0%,因为许多系统都有隐藏的能量储备,可以在S3中长时间支持机器。制造商可以通过创建以下二进制值键来更改整个系统的功率阈值:
HKLM\CurrentControlSet\Control\Session Manager\Power\UndockPowerPolicy

The binary data contains the following 16-byte structure:

typedef struct _UNDOCK_POWER_RESTRICTIONS {

    ULONG Version; 			  //    1 (Version 1.0)
    ULONG Size;                       // 0x10 (16 bytes)
    ULONG HotUndockMinimumCapacity;   // In percent
    ULONG SleepUndockMinimumCapacity; // In percent

} UNDOCK_POWER_RESTRICTIONS, *PUNDOCK_POWER_RESTRICTIONS

如果将机器设置为休眠率低于15%,休眠率低于5%,则会提供_EJ0方法、_EJ1 - 3方法和_EJ4方法。二进制注册表值包含以下16个字节:

[ 01 00 00 00 10 00 00 00 15 00 00 00 05 00 00 00 ]

Surprise Undocking

“意外解锁”指的是在系统处于休眠状态时,将移动电脑从对接站中移除的行为。令人惊讶的是,Windows 2000或Windows XP不支持分离。只要可能,制造商应该设计一种系统,在机器处于睡眠状态时,如果按下弹出按钮,就能唤醒操作系统。
出于以下原因,不支持意外undock。

  1. Windows驱动程序模型目前没有一种机制,使设备“安全删除”,除了关闭设备。
  2. 在休眠之前关闭所有可移动的硬件可以增加几秒钟的暂停和恢复时间。
  3. 关闭所有可移动硬件可以防止dock中的设备唤醒系统。
  4. 一些设备在使用时可能不会关闭,这将阻止挂起。一个常见的例子是带有打开文件的硬盘驱动器、CD驱动器或软盘驱动器。

本文标签: 操作系统ACPIWindows