reactos操作系统实现(10)

前端之家收集整理的这篇文章主要介绍了reactos操作系统实现(10)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
看到下面的语句,你能看得懂吗?

/* Load the GDT and IDT */ @H_301_7@

Ke386SetGlobalDescriptorTable(*(PKDESCRIPTOR)&KiGdtDescriptor.Limit); @H_301_7@

如果没有去看INTEL的文档,是看不懂的。因为它是跟INTELcpu架构密切相关的。现在就去解一下什么叫做全局描述符。先来看看下图的结构: @H_301_7@


@H_301_7@

@H_301_7@

上面红色的框内就是GDTR了,它的描述可以从INTEL的文档看到,如下: @H_301_7@

2.4.1 Global Descriptor Table Register (GDTR) @H_301_7@

The GDTR register holds the base address (32 bits in protected mode; 64 bits in IA-32e mode) and the 16-bit table limit for the GDT. The base address specifies the linear address of byte 0 of the GDT; the table limit specifies the number of bytes in the table. @H_301_7@

The LGDT and SGDT instructions load and store the GDTR register,respectively. On power up or reset of the processor,the base address is set to the default value of 0 and the limit is set to 0FFFFH. A new base address must be loaded into the GDTR as part of the processor initialization process for protected-mode operation. @H_301_7@

See also: Section 3.5.1 ,“Segment Descriptor Tables.” @H_301_7@

@H_301_7@

从这段话里,可以知道GDTRIA-32里是48位的寄存器,用来保存全局描述符所在的位置,并且使用LGDTSGDT指令来操作它。用C语言的结构来表达它,就是这样: @H_301_7@

#001 typedef struct _DESCRIPTOR @H_301_7@

#002 { @H_301_7@

#003 USHORT Pad; @H_301_7@

#004 USHORT Limit; @H_301_7@

#005 ULONG Base; @H_301_7@

#006 } KDESCRIPTOR,*PKDESCRIPTOR; @H_301_7@

Pad16位补齐字节,用来让这个结构从8个字节边界开始声明变量。 @H_301_7@

Limit16位的全局描述符长度。 @H_301_7@

Base32位的全局描述符的开始地址,也就是全局描述符所在的线性地址。 @H_301_7@

@H_301_7@

从上面那句语句里可以看到,是获取KiGdtDescriptor.Limit的开始地址,也就是说获取全局描述符的地址,并保存到GDTR寄存器里。如下图所示: @H_301_7@


@H_301_7@

通过上面的函数,就可以设置引导的全局描述符到寄存器GDTR里,这样就初始化了全局描述符。@H_301_7@ 原文链接:https://www.f2er.com/react/308539.html

猜你在找的React相关文章