Windows驅動開發基礎(八)記憶體管理

來源:互聯網
上載者:User

標籤: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驅動開發基礎(八)記憶體管理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.