2016-01-03 38 views
-1

我正在編寫一個小型業餘操作系統作爲學習體驗。它針對32位x86架構。如何在啓動時在特定地址放置陣列

我處於需要創建初始page_directory的位置,以便啓用分頁。此時分頁(因此VM)未啓用。

我有一個功能,保留4kb未使用的內存並返回此內存塊的起始地址。

我想創建一個數組,page_dir(由1024個int組成),位於上述函數返回的內存位置。

我明白基本指針(我認爲),但我無法弄清楚如何做到這一點。

如何在運行時返回的物理地址定義數組page_table

+0

我。其實我正在寫一個業餘愛好OS(作爲一種學習體驗)。我正嘗試在特定地址創建page_directory。 – ErwinM

+0

@Mat我添加了詳細信息。 – ErwinM

+0

@Mat好的,這是有道理的。有沒有一種方法可以輕鬆地引用該空間中的第二個整數? – ErwinM

回答

2

如果我很好理解你想把一個函數返回的地址作爲一個int數組的基地址。
如果上述假設是正確的,則可以使用2種方法,一種強制轉換或一箇中間變量。
使用投:

void *pd = GetPhysicalAddress(); 
... 
for (i=0; i<1024; i++) 
    ((int *)pd)[i] = SomeValue(); //cast for each access 

或者:

int *pd = (int *)GetPhysicalAddress(); //Cast only on assignement 
... 
for (i=0; i<1024; i++) 
    pd[i] = SomeValue(); 
0

一般情況下,你不能爲一個實際的物理地址做到這一點,但您可以使用mmap在指定虛擬地址獲得指向內存的指針。映射諸如設備特定存儲器的物理地址通常在使用特定於操作系統的API的設備驅動程序中完成。

編輯:隨着您提供的額外信息,這不是一般案件! 爲了有一個指向前的尋呼甚至還成立了,我想你可以使用這個物理地址:要使用

p = (void*)0x00010000; 

或者任何實際的物理地址。

即使沒有設置分頁,您可能已經處於分段保護模式,所以它真的取決於您的DS分段如何設置。

我建議你研究實際操作系統的引導程序,或者只是在你所指的模式下執行的引導程序。

+0

他正在寫一個業餘愛好操作系統,他正在建立自己的頁面目錄,這段代碼實際上是在內核中(環0)。不知道他有多長時間,如果他的內核符合POSIX標準,那麼討論'mmap'是否非常有用呢? –

+1

@MichaelPetch:我更新了我的答案。 – chqrlie

+0

啊,我也沒有看過問題編輯歷史,所以看起來事情從他的第一個版本改變了。 –

相關問題