標籤:windows 7 驅動開發
Windows驅動開發基礎系列,轉載請標明出處:http://blog.csdn.net/ikerpeng/article/details/38826159
就32位的電腦來說,他有4G的真實的實體記憶體。但是這樣是不夠的,於是引入了虛擬記憶體的概念。使得每一個進程都有4G的虛擬記憶體。
虛擬記憶體實際上就是採用了一種映射的方式。4G的記憶體實際上被分頁。一般來說一個頁的大小是4K。也是說它被分為了1M個頁。在這麼多的頁裡面,有一部分是對應於實體記憶體的(可以是多對一的);有一部分是對應於磁碟上的空間,但是這部分的資料會被標記為(Dirty);還有一部分是空的!
沒找到太合適的圖哈。
虛擬記憶體中低2G被稱為使用者模式地址;高位的2G被稱為核心模式地址。所有進程的核心地址映射完全一致,進程切換的時候,只要改變使用者模式地址的映射。
Windows驅動程式使用的記憶體資源非常珍貴,分配記憶體時要盡量節約。和應用程式一樣,局部變數是存放在棧空間中的。但棧空間不會像應用程式那麼大,所以驅動程式不適合遞迴調用或者局部變數是大型資料結構。如果需要大型資料結構,我們可以在堆中申請。
Windows規定有些有些虛擬記憶體頁面是可以交換到檔案中的,這類的記憶體被稱為分頁記憶體;反之不能的被稱為:非分頁式記憶體。
當程式的插斷要求在DISPATCH_LEVEL或之上的時候,程式只能使用非分頁式記憶體,否則就會出現藍色當機畫面。
Windows驅動中使用的鏈表:
對於單鏈表,每一個元素中的Next指向下一個元素;對於雙鏈表,每一個元素中有兩個指標:BLINK指向前一個元素, FLINK 指向後一個元素. 初始化的時候指向自己。:
我們看看他的結構體:
<span style="font-family:Microsoft YaHei;font-size:14px;">typedef struct _LIST_ENTRY { struct _LIST_ENTRY *Flink; struct _LIST_ENTRY *Blink;} LIST_ENTRY, *PLIST_ENTRY;</span>
裡面沒有定義資料,需要程式猿自己定義每一個資料的類型。
例如:
typedef struct _MYDATASTRUCT{
LIST_ENTRY ListEntry;
ULONG x;
ULONG y;
}MYDATASTRUCT,*PMYDATASTRUCT;
在我們對於記憶體的操作過程中,如果頻繁的申請記憶體,會出現:空洞問題,也就是我們的磁碟片段。為了避免這個問題,驅動程式中使用Lookaside結構來處理。他就像是一個記憶體容器,先向Windows申請了一塊比較大的記憶體地區,然後自己可以智能的避免產生空洞的情況。
運行時函數:一般來說是以Rtl開頭的,是程式運行時必不可少的。包括:記憶體間複製(可重疊,不可重疊),填充記憶體,記憶體比較等。
本小節完!
參考文獻:
《 Windows 驅動開發技術詳解 》
Windows驅動開發基礎(八)記憶體管理