Windows內核開發-1-Windows內部概述1


Windows內部概述-1-

進程:

進程是一個程序的運行實例的控制和管理對象。一般的程序員所說進程運行,這樣的說法是不對的,因為進程不能運行程序,進程只能管理該程序運行。線程才是真正的執行代碼的東西。

一個進程應該具備以下的內容:

1: 對於一種可執行程序而言,進程包含了執行代碼的所需要的初始代碼和數據。

2: 每個進程有一個虛擬地址空間,用來給代碼分配內存

3: 一個主令牌對象用來存儲進程的默認安全內容,該對象被進程中的線程執行代碼來使用。

4: 一個指向執行對象的專用句柄表,如事件、信號量和文件。

5: 一個進程可以有一個或多個線程來執行代碼。一個普通的用戶態的進程被一個線程創建(執行經典的main/WinMain 函數來創建)。一個沒有線程的普通用戶進程是沒有用的。

 

一個進程由一個唯一的進程ID來標識,是唯一的。一旦一個進程被摧毀,它的進程ID可以被新的進程所獲取。需要注意的是:可執行文件並不能唯一標識進程,只有進程ID可以。例如:我可以通過QQ.EXE這個可執行文件開多個QQ來使用。

每個進程有自己的內存空間,有自己的線程,自己的進程ID,是完全獨立的。

總結:可執行程序和進程、線程的關系可以好比如面向對象的關系,可執行程序是類,進程是對象,線程的對象里面可以具體執行的函數。可執行程序運行必須實例化成進程,但是進程也不能運行,進程是靠進程內部的線程來具體運行代碼的,每個進程和進程是完全獨立開的,有唯一的進程ID可以標識。可以和面向對象來對比記憶。

 

虛擬內存

每個進程有自己虛擬的、線性的、單獨的內存空間。這段內存空間從0開始(或者接近0,因為可執行模塊和ntdll.dll是第一個被映射的,接着是更多的子系統DLL)。一旦一個可執行程序的第一個線程開始了,內存就開始被分配了,用來加載更多的DLL。

這段內存是私有的,意味着其它進程是無法訪問這段內存的。這段內存的范圍從0開始(雖然從技術角度來說前面的64KB地址空間是不能被任何辦法來分配和使用的,這是系統自動添加的),然后一直到最大值,最大值由操作系統的位數來取決,取決辦法如下(注:這里說的是用戶的進程地址空間):

1 當32位的進程在32位操作系統上時:進程地址空間默認為2G。

2 當32位進程在32位操作系統上且使用了地址增長空間設置(也就是在PE頭中設置了LARGEADDRESSAWARE這個標志位),該進程的地址空間可以達到3G(具體的看設置)

3 當64位進程在64位操作系統上時,地址空間可以有8TB,Windows8.1及以后有128TB.

4 當32位進程在64位OS(操作系統)上時,如果鏈接器設置了LARGEADDRESSAWARE地址空間有4G,否則還是2GB.(通常都是4G)

每個進程有自己的地址空間,但是這只是相對的,並不是絕對的。例如:當你要訪問0x40000這個地址的數據的時候,你必須選擇是在那個進程里面訪問,不然這樣是不行。

每個進程的內存被成為虛擬內存,這意味着,它和真實存在物理內存存在間接的聯系:進程的緩沖區內容可能被直接映射到了物理內存里面,也有可能被臨時存儲在了文件里面(硬盤)。”虛擬“這個術語只有在針對執行來說才有效果,不需要知道虛擬內存是否在物理內存中真實存在因為如果虛擬內存中的內容有映射到物理內存里面,那么CPU可以直接通過物理內存來訪問,如果沒有CPU就會引起頁錯誤異常,這會引發內存管理器的頁錯誤處理程序將從適當的文件中獲取數據再將其復制到內存里面,然后再在映射緩沖區的頁面表條目中進行所需的更改,然后再給CPU發指令讓它再次獲取。

 

 

內存管理的單位被稱為頁。一個頁面的大小是由CPU來決定的(當然也可以配置),在任何情況下,內存管理器必須遵守頁的大小,通常在所有窗口都支持的頁面大小為4KB(這也被稱為小頁面大小)。

除了默認支持的4KB頁面大小(小頁面大小),Windows還支持大頁面,這個頁面的大小由2MB(x86/64/ARM64)和4MB(ARM)。大頁面基於使用了Page Directory Entry(PDE)來映射而不是采用頁面映射表。有了大頁面就會讓與內存直接處理的內容更快。

 

頁狀態

狀態  
空閑(free) 內存頁不可用
保留(Reserve) 內存頁被預定了,但還未做物理內存做映射,還是不可以
提交(Commit) 內存被分配,並且與物理內存進行了映射,進程可以使用了

 

系統內存

進行的地址空間只有下半部是供進行使用的,當某個線程正在執行時,從地址0到上限地址都是可以直接看到的。但是操作系統也必須在進程空占有空間:操作系統在一個進程中占有高地址的地址空間(通常是直接占有一半的高地址地址空間)。如下所示:

1 對於32位OS系統占用2GB以上的虛擬內存空間地址從0x80000000到0xFFFFFFFF,和前面的進程空間向對應互相采用2G的虛擬空間

2 在32位OS且開啟了額外的進程地址空間相對應進程的1GB高地址空間

3 在64位操作系統上,Windows8之前的占有8TB的尋地址內存空間,在WIndows8之后的占用128TB以上的虛擬內存空間

 

系統的空間和進程並沒有關系,畢竟對於進程來說都是在相同的系統上,相同的內核驅動上,且相同地系統為每個進程提供的服務驅動程序,因此系統中的任何地址空間都是相對的,並不是絕對的。因為從每個進程來看都是一樣的,也可以理解為每個進程都有共享的相同系統進程地址。從用戶進程切換到系統進程是違規的。

系統空間是內核本身的、硬件抽象層(HAL)和內核驅動程序的位置一旦加載后就不會變了。因此內核驅動程序是自動受保護的,不會受用戶模式來訪問的。所以內核驅動如果有問題就是至關重要的了。

虛擬內存總結:

對於不同位的進程和不同位的操作系統有不同的解釋:但是相同的是每個進程只有操作系統位數一部分的地址空間,還有一部分的地址空間是屬於系統進程的,系統進程的內容是唯一的大家都是一樣的,但是不能用普通進程來訪問操作系統進程。例如一個32位的進程只有2GB的進程空間,操作系統還有2GB的進程空間,每個進程的內存空間是獨立的,如果要用的時候會通過映射或者從文件讀取來使用,內存的單位是頁,最通常的頁的大小是4KB。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM