《windows程序設計02》由會員分享,可在線閱讀,更多相關《windows程序設計02(38頁珍藏版)》請在裝配圖網上搜索。
1、,單擊此處編輯母版標題樣式,單擊此處編輯母版文本樣式,第二級,第三級,第四級,第五級,*,單擊此處編輯母版標題樣式,單擊此處編輯母版文本樣式,第二級,第三級,第四級,第五級,*,Windows程序設計根底,32,位處理器有,3,種工作模式,:,實模式:重啟以后到載入,WINDOWS,以前都是實模式,純,32,位,windows,是不能進入實模式的。,保護模式:保護模式提供的保護機制管理和維護自己,保護主要指對存儲器的保護。進入保護模式是每個,32,位系統(tǒng)必須的。,虛擬,86,模式:為了讓以前的,16,位程序能在,32,位下運行,,32,位處理器就提供了虛擬,86,模式。,第二章,win32,程
2、序運行原理,2.1 CPU,的保護模式和,Windows,系統(tǒng),擴展模式:,1兼容模式:該模式下,64位操作系統(tǒng)運行在32位兼容環(huán)境,能正常運行16,32位應用程序就像根本的保護模式一樣,訪問32位地址空間,但不能運行純16位實模式程序就是不能運行虛擬86模式程序了。264位模式:在該模式下,處理器完全執(zhí)行64位指令,使用64位地址空間和64操作數,運行16,32位程序必須切換到兼容模式。,64,位處理器,系統(tǒng)管理模式:當SMI引腳為有效進入系統(tǒng)管理模式,首先保存當前的CPU上下文。它有獨立的地址空間,用來執(zhí)行電源管理或系統(tǒng)平安方面的指令。根本模式,32位處理器對多任務操作系統(tǒng)的支持性主要表達
3、在,1在硬件上為任務之間的切換提供了良好的條件,2實現了多任務隔離,“進程地址空間獨立,在windows下,任務被進程取代,進程就是正在運行的應用程序的實例。但是占用cpu時間片的不是進程,而是線程。,Windows,的多任務實現,虛擬內存,保護模式下,32位處理器有32根地址線,處理器尋址范圍0 x000000000 xFFFFFFFF232,4GB。,32位機器上的RAM的大小很難到達4GB,windows為每個進程分配4GB的地址空間主要依靠cpu的支持。cpu在保護模式下支持虛擬內存。它可以幫助操作系統(tǒng)將磁盤空間當作內存空間來使用。,各進程內的地址空間安排,2GB,的系統(tǒng)空間,2GB,
4、的用戶空間,0 xFFFFFFFF,0 x80000000,0 x7FFFFFFF,0 x00000000,整個系統(tǒng)共用,每個進程私有,用戶空間局部是進程私有地址空間,進程不能以任何方式讀、寫其他進程此局部空間中的數據。對所有應用程序,大量進程數據被保存在塊空間中而相互獨立,所以應用程序很少被其他程序打斷,使系統(tǒng)更加穩(wěn)定。,系統(tǒng)空間局部放置操作系統(tǒng)的代碼,包括內核代碼、設備驅動代碼、設備I/O緩沖區(qū)等。系統(tǒng)空間局部在所有的進程中是共享的。在32位系統(tǒng)中,這些數據結構被完全的保護起來,如果試圖訪問這局部內存,訪問線程會遇到一個訪問異常。,兩種地址空間區(qū)別,32位處理器共定義了4種0-3特權級別,
5、或稱環(huán)。0是最高級特權級,3級是最低級用戶級。,為了阻止應用程序訪問或者修改關鍵的系統(tǒng)數據,windows提供了兩種訪問模式:,內核模式使用0級:系統(tǒng)程序的代碼在此模式下運行,用戶模式使用3級:用戶程序的代碼在此模式下運行,內核模式和用戶模式,CPU,支持的特權級類別,應用程序,常規(guī)擴展,系統(tǒng)服務,內核,級別,0,級別,1,級別,2,級別,3,在實模式下,沒有級別之分,.,在保護模式下,CPU,有,4,個特權級別,.,雖然每個進程都有自己的4G地址空間。但內核模式下的系統(tǒng)和設備驅動程序共用一塊虛擬地址空間。即整個系統(tǒng)共用的2G局部。虛擬內存中的每一頁的頁屬性中都有訪問模式標記,它標識了哪一個模
6、式下的代碼才有權限訪問該頁。系統(tǒng)地址空間的頁僅僅能夠從內核模式訪問,所有用戶地址空間的頁都從用戶模式訪問。,當應用程序調用一個系統(tǒng)函數的時候,用戶的應用程序會從用戶模式切換到內核模式去執(zhí)行。例如:Win32函數ReadFile最終會調用Windows內部的從文件中讀取數據的程序代碼,因為這些代碼訪問了系統(tǒng)內部的數據,所以他們必須運行在內核模式下。,內核模式:,研究WDMWindows Driver Model,設備驅動類,用戶模式:,SDK程序設計,兩種模式下的程序設計,內核對象是系統(tǒng)提供的用戶模式下代碼與內核模式下代碼進行交互的根本接口。軟件開發(fā)人員會經常的創(chuàng)立、翻開和操作內核對象。,2.2
7、,內核對象,為了管理應用程序,系統(tǒng)有必要維護一些不允許用戶應用程序直接訪問的數據。一個內核對象就是一塊內核分配的內存,它只能被運行在內核模式下的代碼訪問。內核對象記錄的數據在整個系統(tǒng)中只有一份,故也稱系統(tǒng)資源。,內核對象和普通的數據結構間的最大區(qū)別是其內部數據結構是隱藏的,必須調用一個對象效勞才能從此對象中得到數據,或者是向其輸入數據,而不能直接讀或者改變對象的內部數據。增加這些限制來保證內核對象包含一致的狀態(tài)。,引入內核對象,系統(tǒng)可方便的完成以下任務:,1為系統(tǒng)資源提供可識別的名字。,2在進程之間共享資源和數據。,3保護資源不被未經認可的代碼訪問。,4跟蹤對象的引用情況。在不被使用時,釋放占
8、有空間。,內核對象的數據結構僅能從內核模式訪問,所以直接在內存中定位這些數據結構對應用程序來說是不可能的。應用程序必須使用API函數訪問內核對象。調用函數創(chuàng)立內核對象時,函數會返回標識此內核對象的句柄。,為了使系統(tǒng)穩(wěn)定,這些句柄和進程有關,就是僅對創(chuàng)立該內核對象的進程有效。,假設要多個進程共享一個內核對象,要調用DuplicateHandle函數復制一個進程句柄傳給其他進程即可。,對象句柄,內核對象是進程內的資源,使用計數屬性指明進程對特定內核對象的引用次數,第一次創(chuàng)立內核對象時,系統(tǒng)為進程分配內核對象資源,并將該內核對象的使用計數屬性初始化為1。翻開一次使用計數加1,關閉,系統(tǒng)將使用計數減1
9、,當系統(tǒng)發(fā)現引用次數是0時,它就會自動關閉資源。,使用計數,2.3 進程的創(chuàng)立,進程和線程,進程是一個正在運行的程序,它擁有自己的虛擬地址空間,擁有自己的代碼、數據和其他系統(tǒng)資源,如進程創(chuàng)立的文件、管道、同步對象等。一個進程也包含了一個或者多個運行在此進程內的線程。,線程是進程內執(zhí)行代碼的獨立實體。沒有它,進程中的程序代碼是不可能執(zhí)行的。操作系統(tǒng)創(chuàng)立進行后會創(chuàng)立一個線程執(zhí)行進程中的代碼,稱主線程,它在運行過程中創(chuàng)立其他線程,一般將主線程創(chuàng)立的線程稱為該進程的輔助線程。,進程是不活潑的,一個進程要完成任何事情,必須有一個運行在它的地址空間中的線程。此線程負責執(zhí)行該進程地址空間的代碼。每個進程至少
10、擁有一個在它的地址空間中運行的線程。對一個不包含任何線程的進程來說,它是沒有理由繼續(xù)存在下去的,系統(tǒng)會自動銷毀該進程和它的地址空間。,進程和程序,程序:一連串靜態(tài)的指令,進程:一個容器,它包含一系列運行在這個程序實例上下文中的線程使用的資源。,Win32進程的兩個組成局部,進程內核對象:操作系統(tǒng)使用此內核對象來管理該進程。這個內核對象也是操作系統(tǒng)存放進程統(tǒng)計信息的地方。,私有的虛擬地址空間:此地址空間包含了所有可執(zhí)行的或者是DLL模塊的代碼和數據,它也是程序動態(tài)申請內存的地方,比方說線程堆棧和進程堆。,應用程序必須有一個入口函數,它在程序開始運行時被調用。控制臺應用程序入口函數是,main,。
11、,int main(int argc,char*argv),應用程序的啟動過程,開始,主線程調用,C/C+,運行期啟動函數,N,操作系統(tǒng)調用,CreateProcess,函數創(chuàng)建新的進程,系統(tǒng)創(chuàng)建一個進程內核對象,使用計數初始化為,1,系統(tǒng)為進程創(chuàng)建主線程,成功,調用程序入口函數,main,Y,結束,系統(tǒng)為新進程創(chuàng)建虛擬地址空間,加載應用程序運行時需要代碼和數據,CreateProcess,函數,WIN32API函數CreateProcess用來創(chuàng)立一個新的進程和它的主線程,,這個新進程運行指定的可執(zhí)行文件。函數原型:BOOL CreateProcess(LPCTSTR lpApplicati
12、onName,/可執(zhí)行文件名稱 LPTSTR lpCommandLine,/指定要傳遞給執(zhí)行模塊的參數 LPSECURITY_ATTRIBUTES lpProcessAttributes,/進程平安性 LPSECURITY_ATTRIBUTES lpThreadAttributes,/進程平安性 BOOL bInheritHandles,/指定當前進程中的可繼承句柄是否可被新進程繼承 DWORD dwCreationFlags,/指定新進程的優(yōu)先級及其他創(chuàng)立標志,LPVOID lpEnvironment,/指定新進程使用的環(huán)境變量,LPCTSTR lpCurrentDirectory,/指定新
13、進程使用的當前目錄,LPSTARTUPINFO lpStartupInfo,/指定新進程中主窗口的位置、大小和句柄等,LPPROCESS_INFORMATION lpProcessInformation/返回新進程的標志信息,);,lpApplicationName:指向一個NULL結尾的、用來指定可執(zhí)行模塊的字符串。這個字符串可以是可執(zhí)行模塊的絕對路徑,也可以是相對路徑,在后一種情況下,函數使用當前驅動器和目錄建立可執(zhí)行模塊的路徑。這個參數可以被設為NULL,在這種情況下,可執(zhí)行模塊的名字必須處于 lpCommandLine 參數的最前面并由空格符與后面的字符分開。這個被指定的模塊可以是一個
14、Win32應用程序。如果適當的子系統(tǒng)在當前計算機上可用的話,它也可以是其他類型的模塊如MS-DOS 或 OS/2。,lpCommandLine,:指向一個,NULL,結尾的、用來指定要運行的命令行。,這個參數可以為空,那么函數將使用參數指定的字符串當作要運行的程序的命令行。如果,lpApplicationName,和,lpCommandLine,參數都不為空,那么,lpApplicationName,參數指定將要被運行的模塊,,lpCommandLine,參數指定將被運行的模塊的命令行。新運行的進程可以使用,GetCommandLine,函數獲得整個命令行。,C,語言程序可以使用,argc,和
15、,argv,參數。,如果lpApplicationName參數為空,那么這個字符串中的第一個被空格分隔的要素指定可執(zhí)行模塊名。如果文件名不包含擴展名,那么.exe將被假定為默認的擴展名。如果文件名以一個點.結尾且沒有擴展名,或文件名中包含路徑,.exe將不會被加到后面。如果文件名中不包含路徑,Windows將按照如下順序尋找這個可執(zhí)行文件:1.當前應用程序的目錄。2.父進程的目錄。3.Windows 95:Windows系統(tǒng)目錄,可以使用GetSystemDirectory函數獲得。Windows NT:32位Windows系統(tǒng)目錄??梢允褂肎etSystemDirectory函數獲得,目錄名
16、是SYSTEM32。4.在Windows NT中:16位Windows系統(tǒng)目錄。不可以使用Win32函數獲得這個目錄,但是它會被搜索,目錄名是SYSTEM。5.Windows目錄??梢允褂肎etWindowsDirectory函數獲得這個目錄。6.列在PATH環(huán)境變量中的目錄。如果被創(chuàng)立的進程是一個以MS-DOS或16位Windows為根底的應用程序,lpCommandLine參數應該是一個以可執(zhí)行文件的文件名作為第一個要素的絕對路徑,因為這樣做可以使32位Windows程序工作的很好,這樣設置lpCommandLine參數是最強壯的。,dwCreationFlags:指定附加的、用來控制優(yōu)先級和進程的創(chuàng)立的標志。以下的創(chuàng)立標志可以以除下面列出的方式外的任何方式組合后指定。,值:,CREATE_DEFAULT_ERROR_MODE,含義:新的進程不繼承調用進程的錯誤模式。,值:,CREATE_NEW_CONSOLE,含義:新的進程將使用一個新的控制臺,而不是繼承父進程的控制臺。這個標志不能與,DETACHED_PROCESS,標志一起使用。,值:,CREATE_NEW_PROCESS_