最近看了一些inter32cpu的記憶體管理機制,做個總結,但是我畢竟是新手,對很多東西也是一知半解,希望大家指教。
1.物理記憶體的管理,這不考慮mmu的記憶體管理機制,純粹的對物理記憶體的管理,在電腦剛啟動時候的實模式就應該是對實際物理記憶體的操作了。
2.虛擬記憶體的管理,inter32cpu實現了乙個分頁的虛擬記憶體管理機制。
ia32cpu記憶體管理機制主要就是:分段和分頁。平時程式裡說的**段,資料段不完全等於這個段。分頁機制可以實現按需記憶體分配,虛擬位址等功能。對於分段和分頁相結合的模式,非常靈活,最簡單的情況下,採用平展段模式,禁止分頁(通過cro暫存器的乙個位元位來實現)。要是複雜起來,採用不同段管理不同程序的不同資料,採
用分頁機制實現按需分配,虛擬記憶體等。。。
下面這張圖顯示了ia32整個記憶體管理機制
這裡又來了邏輯位址,線性位址,實體地址等一大堆的概念,看看
上面這張圖很好的解釋了整個分段模式和分頁模式的綜合應用。下面是一些簡單的解釋。
首先是邏輯位址轉換成線性位址(上圖的左半張)
分段模式下,cpu要定址整個位址空間,分成了很多個段。**段,資料段以及各個段的訪問方式(讀寫等)都訪問在乙個段描述表中(gdt),gdt中每一項都描述了乙個特定的段,所以要找乙個段的基位址需要兩個資料:gdt的初始位址+gdt內段項的偏移量。gdt的初始位址存在了gdtr暫存器中了,gdt內段項的偏移量則是由段選擇子來確定,實際上cs,ds這些就是段選擇子。通過上面兩個資料就確定了線性位址中的段部分(確切的說是確定了段基位址),要組合成實際的線性位址,還需要的段內的偏移,這個位址是乙個有效位址。通過段+偏移就出來了線性位址。
出來了線性位址之後,怎麼樣轉化成實體地址呢??
1.要是沒有分頁模式的話,直接把線性位址當作實體地址處理。這個很簡單就可以理解。
2,要是開啟了分頁模式的話,就有點複雜了。
下面解釋線性位址轉化成實體地址(第一張圖的後半張)
這就是分頁模式的**
(1)cpu根據cr3暫存器的值獲取頁目錄所在實體地址,從而獲取頁目錄在記憶體中的位置。
(2)cpu根據線性位址的前10位(22~31)形成乙個索引,根據這個索引查詢頁目錄,找到頁表項。
(3)cpu根據線性位址的中間10位元位(12~21)形成頁表內索引,再根據第(2)步驟找到的頁表位址找到頁框的實體地址。
(4)cpu根據最後12位元形成偏移位址,和(3)的位址相加後得到實際的實體地址。
其實上面我漏了很多細節,我覺得細節怕講錯了,而且比較難。。。下午還要大物期中考試,得看會書了。。
記憶體管理機制
記憶體管理 jvm將記憶體分成三大主要區域 堆,棧,方法區,用來儲存資料。堆 堆中主要儲存引用型別物件,給成員變數分配空間。棧 jvm在執行程式時,在棧中會為每乙個方法都提供儲存空間叫棧幀,用來儲存方法中的區域性變數。方法區 用來儲存jvm載入的位元組碼檔案的資訊 類的資訊 包含類的方法,方法只有乙...
記憶體管理機制
記憶體管理是乙個作業系統必不可少 並且 非常重要的一環 linux 的成功 和它優秀的記憶體管理聯絡非常密切 因為乙個系統的高效性慾穩定性往往決定於它的記憶體管理機制 我項很多人吃過 dos 下 640k 的苦吧 前面我們介紹了 386 保護模式 從今天起我們將在此基礎上 分析 linux 的虛擬儲...
iOS 記憶體管理機制
學習要點 1.reference counting 引用計數機制 2.了解mrc apc和gc 3.autoreleasepool 執行機制 4.如何避免 retain cycle reference counting 引用計數機制 cocoa 上基本的記憶體管理機制就是引用計數,通過乙個 refe...