我正在編寫一個小型業餘操作系統作爲學習體驗。它針對32位x86架構。如何在啓動時在特定地址放置陣列
我處於需要創建初始page_directory的位置,以便啓用分頁。此時分頁(因此VM)未啓用。
我有一個功能,保留4kb未使用的內存並返回此內存塊的起始地址。
我想創建一個數組,page_dir
(由1024個int組成),位於上述函數返回的內存位置。
我明白基本指針(我認爲),但我無法弄清楚如何做到這一點。
如何在運行時返回的物理地址定義數組page_table
?
我正在編寫一個小型業餘操作系統作爲學習體驗。它針對32位x86架構。如何在啓動時在特定地址放置陣列
我處於需要創建初始page_directory的位置,以便啓用分頁。此時分頁(因此VM)未啓用。
我有一個功能,保留4kb未使用的內存並返回此內存塊的起始地址。
我想創建一個數組,page_dir
(由1024個int組成),位於上述函數返回的內存位置。
我明白基本指針(我認爲),但我無法弄清楚如何做到這一點。
如何在運行時返回的物理地址定義數組page_table
?
如果我很好理解你想把一個函數返回的地址作爲一個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();
一般情況下,你不能爲一個實際的物理地址做到這一點,但您可以使用mmap
在指定虛擬地址獲得指向內存的指針。映射諸如設備特定存儲器的物理地址通常在使用特定於操作系統的API的設備驅動程序中完成。
編輯:隨着您提供的額外信息,這不是一般案件! 爲了有一個指向前的尋呼甚至還成立了,我想你可以使用這個物理地址:要使用
p = (void*)0x00010000;
或者任何實際的物理地址。
即使沒有設置分頁,您可能已經處於分段保護模式,所以它真的取決於您的DS
分段如何設置。
我建議你研究實際操作系統的引導程序,或者只是在你所指的模式下執行的引導程序。
他正在寫一個業餘愛好操作系統,他正在建立自己的頁面目錄,這段代碼實際上是在內核中(環0)。不知道他有多長時間,如果他的內核符合POSIX標準,那麼討論'mmap'是否非常有用呢? –
@MichaelPetch:我更新了我的答案。 – chqrlie
啊,我也沒有看過問題編輯歷史,所以看起來事情從他的第一個版本改變了。 –
我。其實我正在寫一個業餘愛好OS(作爲一種學習體驗)。我正嘗試在特定地址創建page_directory。 – ErwinM
@Mat我添加了詳細信息。 – ErwinM
@Mat好的,這是有道理的。有沒有一種方法可以輕鬆地引用該空間中的第二個整數? – ErwinM