程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 驅動開發中函數內存分配

驅動開發中函數內存分配

編輯:C++入門知識

[cpp]
#ifdef ALLOC_PRAGMA 
        #pragma alloc_text(INIT, DriverEntry) 
         
        #pragma alloc_text(PAGE, PreCreate) 
    
    
#endif   
認情況下,內核加載器會加載所有的代碼部分和全局數據到非分頁內存中。而且,加載器是一次加載整個驅動的可執行文件,包括相關的DLL。加載後,內核加載器關閉驅動程序文件,甚至你可以刪除當前正在執行的驅動文件。
但是,你可以告訴加載器你希望驅動的哪部分是可分頁,所謂可分頁,就是可能會被換頁出內存(Page out)

 

分頁內存是虛擬內存,在物理上未必總是能得到。

操作系統實現虛擬內存的主要方法就是通過分頁機制。在Win32中,物理地址空間,二維虛擬地址空間和實際內存地址是三個不同的概念。操作系統通過段選擇子構成二維虛擬地址空間,每個進程有一個4G的地址空間,然後操作系統的內存管理器件把每個進程映射到一維物理地址空間的不同部分,但是因為我們實際機器上大都沒有4G內存,所以,實際內存空間是物理地址空間的子集。

分頁管理器把地址空間劃分成4K大小的頁面(非IntelX86體系與之不同),當進程訪問某個頁面時,操作系統首先在Cache中查找頁面,如果該頁面不在內存中,則產生一個缺頁中斷(PageFault),進程就會被阻塞,直至要訪問的頁面從外存調入內存中。
我們知道,在處理低優先級的中斷時,仍可以發生高優先級的中斷。既然缺頁過程也是一個中斷過程,那麼就產生一個問題,即,缺頁中斷和其他中斷的優先級的問題。如果在高於缺頁中斷的中斷優先級上再發生缺頁中斷,內核就會崩潰。所以在DISPATCH_LEVEL級別以上,絕對不能使用分頁內存,一旦使用分頁內存,就有發生缺頁中斷的可能,前面說過,這樣會導致內核崩潰。


簡單來說就是,如果你寫的驅動級別比較高,或者就是硬件驅動,代碼必須一直在內存中,就不用特別聲明。

如果你覺得部分函數可以被從內存中轉換到硬件臨時文件中,也不會影響程序運行就可以聲明是分頁的。


初始化完成後就不需要保留的代碼可以用下面方式聲明

[cpp] 
#pragma alloc_text(INIT, DriverEntry) 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved