当前位置: 代码迷 >> 汇编语言 >> 怎么在windows环境下调用bios中的代码(或程序)
  详细解决方案

怎么在windows环境下调用bios中的代码(或程序)

热度:373   发布时间:2016-05-02 04:52:20.0
如何在windows环境下调用bios中的代码(或程序)?
这个问题困扰了我很久。早先的dos系统工作在实模式下,所有对地址的操作都是确确实实的对相应物理内存地址的操作。如:jmp 0010:7c00,确实是跳转到7d00这个物理地址上了。并且dos下bios代码的地址同物理内存地址一起参与编址。因此假如bios rom被编址为ffff:0000 - ffff:ffff(只是假如),那么调用bios rom中的代码就可以call ffff:0100这样去调用(假如这个ffff:0100存储了低级格式化程序)。或者使用Bios中断也可以调用bios rom中的代码。而windows下使用了虚拟地址,物理地址对应用程序是不可见的。应用程序被安装在一个4GB的框架中。实际的物理内存由操作系统管理(即物理地址到虚拟地址的映射)。那么该如何在windows下访问bios rom中的代码?
系统自带了一个debug命令行工具,使用这个工具居然就可以访问bios中的代码。。。。注意,我的系统是纯32的xp系统(win7下也可以)。它是怎么做到的?具体工作原理是什么?windows下bios代码是不是也被 映射到了某个区域?如果是,是神马时候映射到物理内存的?是加电时?还是什么时候?这个问题的背后是windows系统内存管理这样一个大机制。有时候越想越头晕。。。!!求大神解答!在这里小弟先谢谢了! 

------解决方案--------------------
当时IBM认为我们的内存不可能超过1MB 所以把所有的硬件的映射地址都固定了
所以现在1MB一下的内存还是DOS时代的那个样子

至于为什么windows还能调用BIOS的中断只是兼容而已,利用了CPU的虚拟8086模式就可以了,但是有些中断还是不能使用的,例如INT13(硬盘中断)
------解决方案--------------------
注意,我的系统是纯32的xp系统(win7下也可以)。它是怎么做到的?具体工作原理是什么?windows下bios代码是不是也被 映射到了某个区域?如果是,是神马时候映射到物理内存的?是加电时?还是什么时候?这个问题的背后是windows系统内存管理这样一个大机制。有时候越想越头晕。。。

1、32位保护模式下,启动了一个 V86模式,然后,利用虚拟内存管理模块,将 0xf0000 这个物理内存映射到你V86模式对应的这个地址。
2、C0000-FFFFF这段代码,CPU加电后一直存在,由芯片组控制映射的。ICH8\ICH9这些手册中有说明。
3、你就把C0000-FFFFF看成一个物理内存,操作系统当然有权利访问任何物理内存,也提供了函数MmMapIOxx..
  相关解决方案