为什么我不能从保护模式调用BIOS中断?

时间:2011-04-26 18:46:38

标签: protected mode bios interrupt

右。今天我花了三个多小时试图理解为什么你不能在保护模式下调用bios ISR。我得到的一旦你设置和IDT它不一定是在通常的地址为IVT加段没有固定的大小在保护模式等。但我仍然不明白为什么不能你jsut创建一个4GB段,将您的IDT段映射到BIOS IVT,将所有内容设置为0,然后调用它们。不应该那样吗?

大多数文章都说:“记住你不能在保护模式下使用BIOS中断!”没有探索主题或极具描述性和引用陷阱,例外,图片重新制作,缺乏权利和段记录的问题作为其背后的原因。

如果有人能够提出一个更人性化的解释,那将是非常有帮助的...我不怀疑文章所说的内容,我只是想明白为什么会出现这种'痛苦'!

提前致谢!

3 个答案:

答案 0 :(得分:9)

我认为最大的问题是假设处理器处于实模式时编写了BIOS例程。如果从不受支持的上下文中调用它们,则无法确定BIOS例程是否按预期运行。它们可能会自行失败,或者它们可能会破坏处理器状态并使您退出保护模式。

答案 1 :(得分:6)

Max,如果操作系统以16位保护模式运行,您可以创建在环0中运行的设备驱动程序,该驱动程序调用更简单的BIOS ISR。但在32位模式下,第一个16位或32位地址偏移或立即值将被错误地解释,并且指令流将不同步。在实际或16位保护模式下,立即数和偏移值默认为16位长,在32位保护模式下为32位长,在64位(长)模式下,它们为32位或64位长。因此,只有表示为字节的偏移量(< 128,如果我没记错的话)和字节立即值可以在ISR中使用。

此外,任何段寄存器加载(除零之外)在实模式下的行为与在任何受保护模式下的行为不同。同样,真实模式代码和受保护模式代码可以一起工作,以便编写有效的代码,但这并不容易。

例如,`

  mov ah, 0B8h  
  mov al, 000h  
  mov es, ax  
  mov byte ptr es:0, 'o'  
  mov byte ptr es:2, 'k'`

将字母'ok'放在文本模式屏幕的左上角以实模式,但要在16位或32位保护模式下工作,偏移0xB800处的全局描述符表条目必须基地址为0x000B8000。

但如果您对仅在16位保护模式下运行感到满意,那么更常见的代码是:

  mov ax, 0B800h   
  mov es, ax  
  mov dword ptr es:0, 0076b076fh`  

应该也可以。

答案 2 :(得分:3)

我回到旧的东西,所以这可能稍微偏离,但“受保护”模式的主要目的之一是将敏感/安全代码与应用程序代码隔离。最初的规格有4级环0到环3.实际上我只见过操作系统的0环和应用的环3。允许应用程序修改或调用中断可能会为它们提供操作系统的后门。因此,此类操作仅适用于在环0中运行的代码 - 即操作系统。让代码在ring 0中运行的唯一方法是创建一个驱动程序。 Windows基本上会将驱动程序加载到它自己的私有内核内存中(尽管在Windows Vista / 7中已经/正在更改)在环0中运行。