Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.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 成功分配指针后,无法将值分配给结构指针_C_Pointers_Struct_Osdev - Fatal编程技术网

C 成功分配指针后,无法将值分配给结构指针

C 成功分配指针后,无法将值分配给结构指针,c,pointers,struct,osdev,C,Pointers,Struct,Osdev,我正在编写一个早期内核堆,以便在最终堆运行之前管理一些内存分配。当我将一个地址(其他任何东西都不使用)分配给我的结构指针时,当我尝试将值分配给结构成员时,问题就出现了 在回答之前,请记住我没有任何类型的C库可以使用。通过远程调试完成了QEMU和gdb的调试 //The struct typedef struct mem_block{ mblock_t *prev; boolean used; size_t size; mblock_t *next; } mbloc

我正在编写一个早期内核堆,以便在最终堆运行之前管理一些内存分配。当我将一个地址(其他任何东西都不使用)分配给我的结构指针时,当我尝试将值分配给结构成员时,问题就出现了

在回答之前,请记住我没有任何类型的C库可以使用。通过远程调试完成了QEMU和gdb的调试

//The struct
typedef struct mem_block{
    mblock_t *prev;
    boolean used;
    size_t size;
    mblock_t *next;
} mblock_t;

//The file-local pointer(before its init)
mblock_t *eheap=NULL;


//Function that assigns the values
mblock_t *init_early_heap(address_t start, size_t size){
    if(eheap==NULL){
        if(size < sizeof(mblock_t)){
            PANIC("Available memory below EHEAP requirement");
        }
        eheap = (mblock_t*)HEAP_START_ADDRESS;
        eheap->prev = NULL;
        eheap->next = NULL;
        eheap->size = (size_t)(size - sizeof(mblock_t));
        eheap->used = false;
        print("\nCreated Early Heap at ");
        print_hex_long(eheap);
        print("\nSize in bytes: ");
        print(itos(eheap->size));NL;
    }
    return eheap;
}
//结构
类型定义结构内存块{
mblock_t*prev;
使用布尔值;
大小;
mblock_t*下一步;
}mblock_t;
//文件本地指针(在其init之前)
mblock_t*eheap=NULL;
//分配值的函数
mblock_t*init_early_堆(地址\u t开始,大小\u t大小){
if(eheap==NULL){
if(尺寸<尺寸(mblock__t)){
死机(“低于EHEAP要求的可用内存”);
}
eheap=(mblock\u t*)堆开始地址;
eheap->prev=NULL;
eheap->next=NULL;
eheap->size=(size_t)(size-sizeof(mblock_t));
eheap->used=false;
打印(“\n在早期创建的堆”);
打印十六进制长(eheap);
打印(“\n以字节为单位:”);
打印(itos(eheap->大小));NL;
}
返回eheap;
}

函数返回后,我得到一个指针,指向地址0xC0000000和未触及的成员,如eheap->size为0(函数中的size参数不是0)。

发现问题:无法读取QEMU中的整个地址空间(A20开),使用较低的地址可以正常工作。
上面的C代码是正确的,现在问题仍然存在于QEMU/GRUB中。

您可以共享self-contain程序来演示这个问题吗?没有程序,这几乎是裸机代码(10多个文件没有标题,仅用于此功能)。你能说得更具体些吗?谢谢。你的C看起来不错。它打印正确吗?如果是这样,问题不在于你认为它在哪里。顺便说一下,您可以使用C11指定的初始化器对“代码> *EHEAP进行单独的分配。您是否考虑将您的项目放在GITHUB上,这样我就可以查看它了?我的回购没有足够的组织(现在是坏主意)。对于@james-k-lowden,打印工作正常,问题的整个跟踪都已调试。如果您使用GRUB/Multiboot或QEMU的
-kernel
选项,则A20处于启用状态,因此整个4GiB地址空间可用(可用空间的大小是另一回事)。代码中可能有其他错误。您是否正在使用分页?我似乎记得,在QEMU中,PCI内存地址从物理地址0xc0000000开始。A20处于启用状态,因为我使用grub作为引导加载程序。此时未使用分页。在实现分页之前,我希望有一个功能堆。如果你清理过你的项目并将其添加到github(如果你不清理它,我不会做出判断),我可能会注意到这个问题。虽然没有看到所有的代码/构建过程,这只是一个猜测游戏,但我怀疑这个问题是微不足道的。我能够编译并将您的内核构建到文件ZBU_cmake.bin中。当我在QEMU中运行它时,它确实会运行。我想知道我如何知道你所描述的问题是否存在(我需要知道它是如何失败的,以及你预期会发生什么)。屏幕上显示的最后一件事是
以0x0012f5f8创建早期堆
字节大小-1112716
,然后在下一行单独显示字母
v
。我应该告诉您,如果使用多重引导,您不需要自己启用A20。Multiboot保证作为规范的一部分启用A20。