2015-12-08 31 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