2016-08-01 68 views

回答

2

LDT是可选的。 IDT是实模式IVT的保护模式等同物并且用于相同的目的。它描述了进入ISR和异常处理程序的入口点。您需要一个IDT才能够处理硬件和软件中断和异常。如果你的生活没有这些,你不需要建立一个IDT。

切换到保护模式需要的不仅仅是设置GDT和执行LGDT。您需要将CR0位0更改为1,执行跳转,并使用指向相应GDT条目的选择器加载段寄存器(最好全部用于避免在各种上下文切换期间未初始化段寄存器的问题)。

实模式代码通常无法在保护模式下运行(虚拟8086(子)模式除外),因为段寄存器中的实模式值无法在保护模式下工作,并且因为段:偏移地址在保护模式下被翻译成不同的物理地址(在GDT和页面翻译上阅读)。 IOW中,将段寄存器中的值加1不再具有将16加到生成的物理地址的效果。此外,你不能有一个同时可读,可写和可执行的段。

理论上,您可以通过选择器N选择基地址为N * 16的64KB段的描述符来设置GDT和/或LDT描述符。在实践中,这是一个混乱。然而,Borland在他们的Borland Pascal 7中实现了这个方案,所以你可以用类似于你为真实模式编写保护模式的方式编写保护模式程序。

+0

请您详细说明该段:保护模式下的偏移转换吗? –

+3

@PantherCoder强制性阅读:英特尔®64和IA-32架构软件开发人员手册, 3“系统编程指南”,第2 - 5章及其附件。 –

+0

是的,他们通常会使用16位保护模式的处理器。某些较早的操作系统和环境会导致内存访问错误,故障处理程序会生成一组描述符条目以允许指令正确完成,然后在导致故障的指令处重新启动。通常你会发现使用LOADALL指令直接加载隐藏的描述符条目。当然,这有很多陷阱 - 如果你希望操作系统和程序同时运行,它们的一些描述符可能会重叠,这很难让操作系统和保护模式程序一起运行。 –

相关问题