2015-12-08 29 views
-3

在创建物理内存分配器来编写内核时,我试图创建一个数组struct page_frame,其中阵列的每个成员都代表给定的物理4KB内存块。在物理内存中动态创建数组

Physical to Virtual Mapping and Area for new Array

目前内核加载到物理存储器地址从到0x000000000physfree

剩余块从physfreephysEnd是空闲块。我想physfree之后创建我struct page_frame阵列和保持阵列中存储器的每个块中的元件从0physEnd

索引的数量此数组中因而应该physEnd/4096。问题是,physEnd直到运行时才知道,所以我不知道如何动态分配这样的数组。目前,以下内容不会填充struct page_frame的数组,因为只有第一个元素memBlocks[1]显示为正确的struct page_frame,其他元素不会正确初始化。

struct page_frame* memBlocks; 
memBlocks = (struct page_frame*)kernbase + physfree; 

int count = 0; 
for(char* i = (char*) 0; i < (char*) ALIGNUP(physEnd)-PAGESIZE; i+=PAGESIZE) 
{ 
    //The new page frame to be placed in array 
    struct page_frame insert; 
    insert.used = 1; 
    memBlocks[count] = insert; 
    count++; 
} 

如何在我的内核顶部的地址上动态创建这样一个数组,以便我可以跟踪我的空闲物理块?我试图利用指向memBlocks结构的指针,并将其设置为kernbase + physfree(因为虚拟内存当前已启用)后的地址。然后我想要数组中的每个元素只占用sizeof(struct page_frame)。我是否正确访问memBlocks的元素,方法是将它们编入索引memBlocks[i]?还是有更好的方法来创建这样一个数组?

+0

不知道为什么,这个问题正在向下投了反对票。如果有一个地方可以改进,并且您投票了,请发表评论。 – sreisman

+0

在您的代码示例中,实际上_not没有按照需要工作?请更清楚地说明预期结果和目前结果。还请添加'memBlocks'声明。 –

回答

1

请记住,在C中,struct frame的数组非常类似于指向struct frame的指针。至少如果你理解C的指针运算,简单的事情就是简单地使用一个指向'数组'开始的指针。

鉴于struct frame *memBlocks您可以访问第i个块作为memBlocks + i

+0

您也可以将其作为memBlocks [i]进行访问。 – stark

+0

谢谢,这是我一直在试图做到这一点,但是在创建了所有结构并逐步完成调试器之后,它们都没有实际初始化。我不确定它们是否被编译器优化,或者如果问题出在我的代码上。 – sreisman