首页 理论教育 操作系统实现:实模式服务调用案例

操作系统实现:实模式服务调用案例

时间:2023-10-21 理论教育 版权反馈
【摘要】:在正式介绍保护模式切换回实模式的实现之前,先举例说明如何在保护模式下调用实模式的功能。我们把从8KB开始到640KB结束的内存空间,作为保护模式和实模式的数据交换空间,即共享内存。EAX寄存器存放了一个功能号,这个功能号告诉实模式代码完成什么样的具体功能。毕竟所有的实模式BIOS调用都是通过一个统一的入口完成的。实模式BIOS调用执行完后重新返回保护模式。这时候EAX寄存器存放了执行结果是否成功的标志。

操作系统实现:实模式服务调用案例

在正式介绍保护模式切换回实模式的实现之前,先举例说明如何在保护模式下调用实模式的功能。下面的代码用于实现硬盘扇区的读取功能,这个函数把待读取硬盘号(0表示第一个硬盘、1表示第二个硬盘)、起始扇区、扇区个数等作为输入参数。成功读取之后,扇区数据被复制到pBuffer缓冲区中。代码如下:

这个函数大部分是使用内嵌汇编语言实现的。首先保存几个通用寄存器,然后把待读取硬盘号、起始扇区、扇区数量等参数,存放到几个通用寄存器中,以传递给实模式代码。接下来使用CALL指令,调用物理内存6KB处的代码。这里的代码即是从保护模式切换到实模式,并通过BIOS调用读取硬盘扇区的实现代码。BIOS调用成功完成之后,会把读取的扇区放到预定义的BIOS_HD_BUFFER位置。这个宏定义为8KB,即物理内存8KB处。回忆一下操作系统的初始化过程,最初8KB处加载的是miniker.bin模块。但是一旦切换到保护模式,这个模块的代码被搬到1MB开始处,因此8KB开始处的内存就空闲了。我们把从8KB开始到640KB结束的内存空间,作为保护模式和实模式的数据交换空间,即共享内存。

EAX寄存器存放了一个功能号,这个功能号告诉实模式代码完成什么样的具体功能。毕竟所有的实模式BIOS调用都是通过一个统一的入口完成的。实模式BIOS调用执行完后重新返回保护模式。这时候EAX寄存器存放了执行结果是否成功的标志。

根据EAX寄存器的值,决定下一步的动作。在上述函数中,如果EAX寄存器的值为0,说明执行失败,于是跳转到__BIOS_FAILED标号处,函数失败返回。否则跳转到__BIOS_SUCCESS标号处继续执行。接下来的代码,即把磁盘扇区的内容,由共享内存(物理内存8KB处)复制到pBuffer缓冲区,然后返回。(www.xing528.com)

其他调用BIOS功能的函数也是按照这个思路实现的,不同的是EAX存放的功能号和函数参数不同。

知晓了保护模式下调用实模式的功能方法之后,让我们详细解释如何从保护模式切换到实模式。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈