2011-03-16 67 views
1

我正在C和程序集中開發一個簡單的小玩具操作系統作爲實驗,但我開始擔心自己對系統內存缺乏瞭解。簡單的玩具操作系統內存管理

我已經能夠編譯內核,在Bochs的運行(通過GRUB加載),並將它打印「你好,世界!」現在我試圖做一個簡單的內存管理器,以便我可以開始嘗試其他的東西。

我發現了一些資源上的內存管理,但他們真的沒有足夠的代碼熄滅的(在我的理解這個概念,但我是在爲實際知道如何實現它的虧損)。

我嘗試了一些或多或少複雜的策略,然後用一個荒謬簡單的策略(只是在內存中保留一個偏移量並將其增加分配對象的大小)解決,直到需要更改。沒有分割控制,保護或其他任何東西。

所以我想知道在哪裏可以找到更多的信息,當我需要一個更強大的經理。我還想了解更多關於分頁,分割和其他相關的事情。到目前爲止,我還沒有處理過分頁,但是我已經在操作系統開發網站中看到過這種情況,所以我猜測我遲早會面對它。

我也看到了有關某種形式的間接指針,其中應用程序認爲是由內存管理器重定向到它的真實位置的指針。對於我來說,這是相當方便的,但我相信,如果我想嘗試虛擬內存或碎片整理,這似乎很重要。

而且,我應該把我的記憶抵消?我不知道最好的地方是什麼,所以我隨機選擇了0x1000,我相信稍後當我覆蓋我的內核或其他東西時它會回來。

我也想知道我應該期待的性能代價,什麼內存管理結構的實際管理存儲一個合理的比例應該是(例如,用於分配和釋放一個大O值)。

當然,隨便回答這些問題的一個子集。任何反饋非常感謝!

回答

2

如果你不知道它已經,http://wiki.osdev.org/是一般一個很好的資源,並且對內存管理的多篇文章。如果你正在尋找一個特定的內存分配算法,我建議閱讀「夥伴系統」方法(http://en.wikipedia.org/wiki/Buddy_memory_allocation)。我想你可以在互聯網上找到一個示例實現。如果您可以在圖書館中找到副本,那麼也可能需要閱讀計算機編程藝術專用於內存管理的部分(第1卷,第2.5節)。

我不知道你應該把內存偏移量放在哪裏(說實話我從來沒有寫過一個內核),但有一件事發生在我身上,可能會發揮作用的是將一個靜態變量放在內核,並在該地址後開始分配。喜歡的東西:

(In the memory manager) 
extern char endOfKernel; 
... (also in the memory manager) 
myOffset = &endOfKernel; 
... (at the end of the file that gets placed last in the binary) 
char endOfKernel; 

我想這不用說,但是這取決於你如何認真獲取有關操作系統,你可能希望在操作系統設計的一些書,如果你在學校是它止跌參加操作系統課不會受到傷害。

+1

在內核是一個選項之後放置堆,但是您還需要確定您正在創建的內核是否將以真實或保護模式運行。如果您處於Real模式,則只能訪問1MB的內存,處於受保護狀態時您可以訪問完整的32位內存空間。 – linuxuser27 2011-03-17 00:33:28

+0

謝謝! osdev wiki實際上就是我開始的。而且看起來好友好。這聽起來像個好主意,但是你會知道如何將變量放在內核的末尾嗎?也許寫一個C文件,並修改我的鏈接文件,以確保該文件被放置在最後? – rovaughn 2011-03-17 00:34:10

+0

@ linuxuser27 - 我知道*關於真實和受保護的模式,但我沒有意識到會導致這種差異。這是內存限制,因爲實模式不會爲您做分頁嗎?有沒有一種方法可以告訴我,比如,你會碰巧知道GRUB是否加載到真實或保護模式中? – rovaughn 2011-03-17 00:36:52

1

如果您使用的是與LD GCC,您可以創建一個鏈接腳本是在.BSS部分(這會給你內核的內存佔用的完整大小)的端部限定的象徵。實際上,許多內核都將此值用作GRUB的AOUT_KLUDGE標頭的參數。

有關更多詳細信息,請參閱http://wiki.osdev.org/Bare_bones#linker.ld,請注意鏈接描述文件中ebss符號的聲明。