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