原创

reactos操作系统实现(25)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://mysoft.blog.csdn.net/article/details/3859202

 在操作系统里,有时候需要从保护模式转换为实模式来调用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 

 

配置实模式的IOPMTSS

#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     

 

恢复TSSIOPM

#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的程序决定的。

 

展开阅读全文

没有更多推荐了,返回首页