我正在编写一个操作系统,作为一部分,我需要告诉CPU有关内存中的段。基本思想是我用LGDT组装调用加载GDT寄存器。该参数是包含实际GDT的大小和位置的结构的内存地址。我遇到的问题是在GlobalDescriptorTable.h的第75行,我将结构中的数组地址设置为传递给LGDT但是当我在结构给出的地址处检查内存时,那里什么也没有。
class GlobalDescriptorTable {
private:
GdtEntry _gdt[256];
size_t size;
GdtDescriptor gdtd;
public:
GlobalDescriptorTable( ) ;
GdtEntry encodeGlobalDescriptorTableEntry(uint32_t limit,
uint32_t baseAddress, Access access, Flags flags);
void load( ) {
//get size, -1 because Int-hell hates you
size_t sizeOfGdt = (3 * sizeof(GdtEntry)) - 1;
//get the info to tell cpu about the GDT
gdtd.size = (uint16_t)sizeOfGdt;
gdtd.location = _gdt;
asm ("LGDT %[gdtd]" : : [gdtd] "m" (gdtd));
}
};
作为测试分配:
uint64_t temp = 0xF00FB00BEE00F0AA;
_gdt[0] = *((GdtEntry*) &temp);
任何帮助将不胜感激
答案 0 :(得分:0)
LGDT
指令需要线性地址,而不是段相对地址。这是一个与您在C ++程序中获得的地址不同的地址。有关详细信息,请参阅有关此说明的英特尔文档。