在操作系统里,有时候需要从保护模式转换为实模式来调用BIOS一些功能。因此在硬件抽象层里,就需要提供这样的函数支持,这个函数代码如下:
#001 BOOLEAN
#002 NTAPI
#003 HalpBiosDisplayReset(VOID)
#004 {
#005 ULONG Flags = 0;
#006
保存CPU所有状态寄存器,然后关闭中断。
#007 /* Disable interrupts */
#008 Ke386SaveFlags(Flags);
#009 _disable();
#010
映射内存到虚拟8086的实模式。
#011 /* Map memory available to the V8086 real-mode code */
#012 HalpMapRealModeMemory();
#013
切换到实模式的中断处理。
#014 /* Use special invalid opcode and GPF trap handlers */
#015 HalpSwitchToRealModeTrapHandlers();
#016
配置实模式的IOPM和TSS。
#017 /* Configure the IOPM and TSS */
#018 HalpSetupRealModeIoPermissionsAndTask();
#019
现在开始在实模式里调用BIOS的功能。
#020 /* Now jump to real mode */
#021 HalpBiosCall();
#022
恢复中断处理函数。
#023 /* Restore kernel trap handlers */
#024 HalpRestoreTrapHandlers();
#025
恢复TSS和IOPM。
#026 /* Restore TSS and IOPM */
#027 HalpRestoreIoPermissionsAndTask();
#028
恢复低端内存。
#029 /* Restore low memory mapping */
#030 HalpUnmapRealModeMemory();
#031
恢复保存的状态寄存器。
#032 /* Restore interrupts if they were previously enabled */
#033 Ke386RestoreFlags(Flags);
#034 return TRUE;
#035 }
上面函数是保存了现场状态后,就切换到虚拟8086实模式,这样才可以调用BIOS功能,这是由于在保护模式下不能运行BIOS的程序决定的。