我正在嘗試編寫自己的操作系統,並且已經到了必須考慮內存管理和分頁的地步。這已經顯示出比我預期的更具挑戰性。 :-D在我嘗試另一個失敗的實現之前,我希望對這個主題有所瞭解。我對內存管理和分頁的想法是否正確?
據我瞭解,爲了正確地實現分頁在C 32位x86系統,我應該:
創建一個內存管理器我...
找出高部分內存通過使用鏈接描述文件中定義的「結束」標籤開始。我應該得到一個內存中的地址。這個地址之前的所有內容都是內核所需的內存,所有內容都是空閒空間。
使用這個數字創造,我可以使用與內存地址的工作指針變量。在內存地址指針指向我將定義一個雙向鏈表。該列表將包含可用於指向系統內存中每個「頁面」的數字(表示內存地址和每4K的偏移量),以及告知系統該頁面是分配還是空閒的內容。
當我想讓內存管理器分配一個頁面時,我需要一個遍歷列表的函數,直到它找到一個空閒的4K頁面,將其標記爲已分配,並返回可用作該頁面的內存地址。
釋放頁面我有一個函數接受一個代表頁面內存地址的數字,然後我遍歷該列表,直到找到具有該數字的元素,並將其標記爲空閒。
要設置頁面,然後我要創建一個頁面目錄(第一頁?),以及含有1024頁1024個表。然後我把頁目錄的地址放在Cr3寄存器中,然後在Cr0寄存器中改變一下。在這一點上,我還需要通過頁面目錄分配和釋放頁面的新功能。
我的想法是否正確?如果不是,我不明白的是什麼?我需要做些什麼來防止系統嘗試訪問不存在的內存?
我很想回答這個問題,但我不是。但是,如果您可以設法創建一個更小,更精確的問題,這可能對其他人有幫助。就目前來看,這個問題的範圍似乎相當大。 – 2014-09-29 13:13:53
@Magnus Hoff:這是一個廣泛的問題,但我正在詢問整個過程。我已經閱讀了關於這個主題的所有內容,並且在我嘗試應用這個理論之前,需要確保我理解了這個概念。 – 2014-09-29 16:05:51
在嘗試另一個失敗的實現之前,我建議你從幾個現有的開源操作系統中收集和研究虛擬內存管理器的源代碼。我的意思是找到並理解至少3個工作示例 – xmojmr 2014-09-29 18:10:40