Max*_*Max 13 protected mode interrupt bios
对.今天我花了三个多小时试图理解为什么你不能在保护模式下调用bios ISR.我得到的一旦你设置和IDT它不一定是在通常的地址为IVT加段没有固定的大小在保护模式等.但我仍然不明白为什么不能你jsut创建一个4GB段,将您的IDT段映射到BIOS IVT,将所有内容设置为0,然后调用它们.不应该那样吗?
大多数文章要么说:"记住你不能在保护模式下使用BIOS中断!" 没有探索主题或极具描述性和引用陷阱,例外,图片重新制作,缺乏权利和段记录的问题作为其背后的原因.
如果有人能够提出一个更人性化的解释,那将是非常有帮助的...我不怀疑文章所说的内容,我只是想明白为什么会这么"痛苦"!
提前致谢!
我认为最大的问题是假设处理器处于实模式时编写了BIOS例程.如果从不受支持的上下文中调用它们,则无法确定BIOS例程是否按预期运行.它们可能会自行失败,或者它们可能会破坏处理器状态并使您退出保护模式.
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'`
Run Code Online (Sandbox Code Playgroud)
将字母'ok'放在文本模式屏幕的左上角以实模式,但要在16位或32位保护模式下工作,偏移0xB800的全局描述符表条目必须有一个基数地址0x000B8000.
但如果您对仅在16位保护模式下运行感到满意,那么更常见的代码是:`
mov ax, 0B800h
mov es, ax
mov dword ptr es:0, 0076b076fh`
Run Code Online (Sandbox Code Playgroud)
也应该工作.