一、相關概念
1、記憶體主要儲存程式執行時所需的機器**、資料等內容。
記憶體的最小儲存單元是位元組,記憶體中的每乙個位元組都有乙個位址。在32位系統上,使用32位的數來表示記憶體位址,因此一共可以表示2
32(4294967296-4g)個位元組。
2、位址
(1)位址空間。
系統中所有可用的記憶體位址的集合稱為位址空間。比如,如果可以使用4gb的記憶體,那麼其位址空間就是0x00000000~0xffffffff。
(2)物理記憶體。
硬體系統中真實存在的儲存空間稱為物理記憶體,物理記憶體的訪問通過硬體系統匯流排進行的。
但不是每台32位的機器都具有4gb的實體地址空間,因此實體地址空間不一定是0x00000000~0xffffffff,比如在物理記憶體為1gb的系統上,就可能只有0x00000000~0x3fffffff的位址可以使用。
(3)虛擬位址空間。
為了訪問記憶體的統一和方便,作業系統允許其上執行的程式訪問所有的4gb記憶體空間中的位址。因此作業系統必須進行一些必要的位址轉換工作,將程式訪問的位址轉換為物理記憶體中的真實實體地址,然後進行資料的訪問。作業系統進行轉換後,供程式使用的位址空間稱為虛擬位址空間。在32位系統上,可以使用的虛擬位址空間大小是4gb。
當然,由於虛擬位址空間可能比真實實體地址空間大,系統會將部分虛擬位址空間中的位址轉換為硬碟中的資料,在必要時將物理記憶體中的資料與硬碟中的資料進行交換。
這種位址轉換和資料交換是通過分頁和分段機制實現的
。(4)程序的記憶體空間:使用者記憶體空間與核心記憶體空間。
windows作業系統中的每個程序都有屬於自己的虛擬位址空間。32位的window作業系統將4gb(在64位系統上,這個值達到了8tb)的虛擬記憶體劃分為兩個部分,程序使用2gb,稱為使用者程序空間;核心使用2gb,稱為系統位址空間或核心位址空間(也可設定為使用者程序空間使用3gb,核心使用1gb,這裡只討論各為2gb的情況),使用者空間的位址範圍為
0x00000000~0
x7fffffff,核心空間的位址範圍為
0x80000000~
0xffffffff。虛擬位址空間在程序上是封閉的,程序只能訪問屬於自己的位址空間,如果要訪問其他程序的位址空間需特殊的機制。
3、分頁與分段記憶體管理、記憶體對映與位址轉換
32位位址的高10位稱為頁目錄索引(directory)、次10位稱為頁表索引(table),餘下的12位為偏移(offset)。如果只取前兩個部分的20位,末位補0,那麼其可能指向的位址都是4kb( 212)對齊的,也就是頁的基位址。所以32位中的前20位定位了頁的基位址(pfn),而最後12位是位址在頁內的偏移。
相當於先選定那本書,再選定那本書的頁數,再選中頁中的那行。
在位址轉換的過程中,還涉及乙個關鍵的系統暫存器cr3。cr3暫存器中的高12~32位儲存了頁目錄索引在物理記憶體中的位址。
位址轉換經過了如下過程。
(1)從cr3暫存器的12~32位中取出位址,末位補0,構成乙個32位的位址,此位址是頁目錄所在物理記憶體的基位址(因此頁目錄在記憶體中肯定是4kb對齊的)。
(2)以線性位址中的高10位的頁目錄索引(directory)中資料為偏移,加上上一步得到的頁目錄所在物理記憶體的基位址,在頁目錄中找到相應的頁目錄項(pde)。
(3)頁目錄項中包括了頁表的基位址,線性位址中的頁表索引(table)是頁表中的偏移,找到頁表項(pte)。
(4)頁表項(pte)中儲存的是實體地址空間中的頁面的位址(pfn),如果pfn指向的頁面是無效的(不在物理記憶體中),那麼會在系統核心中引起頁錯誤,系統核心會進行頁面排程,將物理記憶體中暫不使用的頁面交換到硬碟中,將硬碟中需要訪問的頁面交換到物理記憶體中,使用pfn指向的頁是有效的。
(5)現在已經找到了線性位址所對應的實體地址所在的頁的基址。
(6)在物理頁位址的基礎上,加上線性位址末12位的偏移,可得到線性位址與實體地址的對應。
從中可以看出位址轉換是以頁為單位的,也就是線性位址與所對應的實體地址的頁基位址(pfn)是會變化的,在頁內的偏移位址是不會發生變化的。
每乙個頁目錄項對應了乙個頁表,一共有2
10個頁目錄。每乙個頁表項對應了乙個記憶體分頁,每個頁表是最多可以表示2
10個頁表。最多一共是多有2
20個頁。
11 Windows API 記憶體管理(1)
一 相關概念 1 記憶體主要儲存程式執行時所需的機器 資料等內容。記憶體的最小儲存單元是位元組,記憶體中的每乙個位元組都有乙個位址。在32位系統上,使用32位的數來表示記憶體位址,因此一共可以表示2 32 4294967296 4g 個位元組。2 位址 1 位址空間。系統中所有可用的記憶體位址的集合...
13 Windows API 記憶體管理(3)
二 堆管理 使用者使用記憶體分配函式分配的記憶體都位於堆中,所以使用堆管理函式對記憶體進行分配 釋放等是最為直接的方式。windows系統中,每個程序都有自己的堆,每個程序的堆的數量也有所不同。windows系統中所謂的 堆 heap 並不是記憶體塊,而是一種用於記憶體管理的物件,也是一種記憶體組織...
c 中用windows api函式修改記憶體資料
這個問題來自伴水的 划拳機械人 對本文用途感興趣的朋友請大致閱讀伴水的帖子,在帖子中我用這個方法寫了剪刀五號 戰績不錯,當然屬於作弊的方法了。剪刀五號的思路就是每次出拳,盡量讓對方能贏,然後根據乙個位址段來掃瞄記憶體中對方所贏的局數的儲存位址,找到後在得到比賽結果時把記憶體資料改掉。這個類似以前打單...