7 休眠(Hibernation)
“休眠”(Hibernation)、“待机”(Standby)和“睡眠”(Sleep)是计算机省电状态的常见名称。进入休眠时,计算机将 RAM 的内容保存到硬盘中,并有效地断电。当被命令再次上电时,它会快速恢复到与进入休眠时相同的状态。
对于基于 FPGA 的外设,休眠需要格外小心,因为设备驱动程序不知道 FPGA 将要经历什么,特别是它是否会保持供 电。
因此,在计算机进入睡眠状态之前,XillyUSB 设备(即通过 USB 线缆连接的 Xillybus IP 核)会被有效地断开连接,就像被 物理拔掉一样。如果计算机再次醒来时该设备存在,它会被视为刚刚连接到计算机。因此,如果应用程序能容忍这种行为,休眠是可以接受 的。请注意,如果主机上连接了多个 XillyUSB 设备,唤醒后其文件名中的索引可能会发生变化。
本节其余部分讨论基于 PCIe 的 Xillybus。
如果设备由外部电源供电,则在计算机其余部分关机时它将保持通电状态。但尚不清楚 PCIe 总线本身是否会保持供电,或 者是否会在某个阶段复位。
如果它从计算机电源获取电力,则很可能断电。在这种情况下,当电源恢复时,FPGA 可能会从闪存重新加载其比特流 (bitstream),并继续作为总线上的 PCIe 卡,或者如果它依赖于手动加载比特流,则可能完全从总线上消失。
请注意,如果 PCIe 接口在计算机关机时突然消失,Windows 可能无法从休眠中唤醒。因此,如果 FPGA 依赖于计算机的电 源,它绝对应该在通电时自动重新加载比特流。
Xillybus 设备驱动程序通过以下方式应对这种不确定性:当操作系统通知驱动程序计算机即将调用休眠时,它表现得好像驱动程序即将被 完全卸载一样:它会在所有待处理的 I/O 请求上生成错误,强制所有打开的文件立即关闭,释放所有资源,移除设备文件,并让 FPGA 中的 Xillybus IP 核进入静默状态。
当计算机从休眠中恢复时,驱动程序会像启动时一样进行初始化。
尽管此过程经过验证可靠,但仍有两个潜在问题:
-
驱动程序可能无法为其缓冲区分配足够的 RAM,特别是当总缓冲区大小超过几兆字节时。在物理映射中,大块的连续内存更 易于在计算机启动时加载驱动程序时分配,而不是在计算机运行一段时间后。操作系统在休眠后保留其内存映射,因此内存碎片化依然存 在。因此,在休眠前释放的连续物理内存块,在系统唤醒期间再次加载驱动程序时可能不再连续。
-
即使应准备好处理任何 I/O 函数调用产生的错误,但由休眠引起的意外错误可能暴露出罕见的隐藏缺陷。
总体结论是,处理休眠的最佳方式是在连接了基于 FPGA 的 PCIe 外设的计算机上避免休眠。这可以通过设置计算机的省电 属性轻松实现,特别是关闭操作系统可能认为空闲时自动休眠的功能。这还可以防止计算机在无人值守的重要任务进行中时因缺乏人为交互 而进入睡眠状态。
