Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 数组的隐式指针转换不';t似乎指向数组_C++_Arrays_Pointers_Operating System - Fatal编程技术网

C++ 数组的隐式指针转换不';t似乎指向数组

C++ 数组的隐式指针转换不';t似乎指向数组,c++,arrays,pointers,operating-system,C++,Arrays,Pointers,Operating System,我正在编写一个操作系统,作为其中的一部分,我需要告诉CPU内存中的段。基本思想是我用LGDT汇编调用加载GDT寄存器。它的参数是包含实际GDT的大小和位置的结构的内存地址。我的问题是,在globaldescriptorable.h的第75行,我设置了要传递给LGDT的结构中数组的地址,但是当我在结构给定的地址检查内存时,那里什么都没有 class GlobalDescriptorTable { private: GdtEntry _gdt[256]; size_t size;

我正在编写一个操作系统,作为其中的一部分,我需要告诉CPU内存中的段。基本思想是我用LGDT汇编调用加载GDT寄存器。它的参数是包含实际GDT的大小和位置的结构的内存地址。我的问题是,在globaldescriptorable.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);

任何帮助都将不胜感激。

LGDT指令需要线性地址,而不是段相对地址。这是一个不同于C++程序的地址。请参阅英特尔文档,了解更多的信息。

请用A或GDT查看您的问题,它表示分页应用,因此C++将给出正确的地址。它通过分页,但不通过段(CS,DS等)寄存器。C++环境是这样的。当我这样做时,我已经设置了分页,这就是设置片段的方法。我认为这不是问题所在。