有什么方法可以在 UEFI 中模拟 I/O 设备吗?
Is there any way of emulating an I/O device in UEFI?
有什么方法可以在 OS 后面的 UEFI 运行时驱动程序 运行 中模拟 I/O 设备(例如超级 IO 控制器)?
您将需要创建一个 SMM 驱动程序来捕获特定的 I/O 范围,生成 SMI,这会将这些访问路由到您的驱动程序。写入捕获 I/O 范围的值可以由您的驱动程序从 CPU 保存状态区域检索,并由您的模拟设备的状态机进行相应处理。 OS 从捕获的 I/O 范围读取的值将由您的驱动程序通过替换 CPU 保存状态中的 EAX 寄存器的保存状态来返回,其中值在 x86 上返回系统。
传统 BIOSes 广泛使用此技术来模拟 8042 键盘控制器并支持 BIOS 级别的 USB HID 设备(又名传统 USB)。请注意,SMM 仅在 x86 系统上可用并且非常依赖于平台,即您的驱动程序可能在一个平台上工作,但不能在另一个平台上工作。在现代 UEFI 实现中有一个很好的 SMM 抽象级别,这有助于 SMM 代码的可扩展性,但是 I/O 捕获功能因不同的芯片组而异。基于 SMM 的仿真功能在 AMD Geode 处理器中发挥到了极致,我们在其中仿真了大多数 PC 外围设备,不仅是 SuperIO,而且一直到音频和视频控制器。
有什么方法可以在 OS 后面的 UEFI 运行时驱动程序 运行 中模拟 I/O 设备(例如超级 IO 控制器)?
您将需要创建一个 SMM 驱动程序来捕获特定的 I/O 范围,生成 SMI,这会将这些访问路由到您的驱动程序。写入捕获 I/O 范围的值可以由您的驱动程序从 CPU 保存状态区域检索,并由您的模拟设备的状态机进行相应处理。 OS 从捕获的 I/O 范围读取的值将由您的驱动程序通过替换 CPU 保存状态中的 EAX 寄存器的保存状态来返回,其中值在 x86 上返回系统。
传统 BIOSes 广泛使用此技术来模拟 8042 键盘控制器并支持 BIOS 级别的 USB HID 设备(又名传统 USB)。请注意,SMM 仅在 x86 系统上可用并且非常依赖于平台,即您的驱动程序可能在一个平台上工作,但不能在另一个平台上工作。在现代 UEFI 实现中有一个很好的 SMM 抽象级别,这有助于 SMM 代码的可扩展性,但是 I/O 捕获功能因不同的芯片组而异。基于 SMM 的仿真功能在 AMD Geode 处理器中发挥到了极致,我们在其中仿真了大多数 PC 外围设备,不仅是 SuperIO,而且一直到音频和视频控制器。