虚拟内存解疑
虛擬內存別稱虛擬存儲器(Virtual Memory)。電腦中所運行的 程序均需經由內存執行,若執行的程序占用內存很大或很多,則會導致內存消耗殆盡。為解決該問題,Windows中運用了虛擬內存技術,即勻出一部分硬盤空間來充當內存使用。當內存耗盡時,電腦就會自動調用硬盤來充當內存,以緩解內存的緊張。若計算機運行程序或操作所需的隨機存儲器(RAM)不足時,則 Windows 會用虛擬存儲器進行補償。它將計算機的RAM和硬盤上的臨時空間組合。當RAM運行速率緩慢時,它便將數據從RAM移動到稱為“分頁文件”的空間中。將數據移入分頁文件可釋放RAM,以便完成工作。 一般而言,計算機的RAM容量越大,程序運行得越快。若計算機的速率由于RAM可用空間匱乏而減緩,則可嘗試通過增加虛擬內存來進行補償。但是,計算機從RAM讀取數據的速率要比從硬盤讀取數據的速率快,因而擴增RAM容量(可加內存條)是最佳選擇。 虛擬內存是Windows 為作為內存使用的一部分硬盤空間。虛擬內存在硬盤上其實就是為一個碩大無比的文件,文件名是PageFile.Sys,通常狀態下是看不到的。必須關閉資源管理器對系統文件的保護功能才能看到這個文件。虛擬內存有時候也被稱為是“頁面文件”就是從這個文件的文件名中來的。 內存在計算機中的作用很大,電腦中所有運行的程序都需要經過內存來執行,如果執行的程序很大或很多,就會導致內存消耗殆盡。為了解決這個問題,WINDOWS運用了虛擬內存技術,即拿出一部分硬盤空間來充當內存使用,這部分空間即稱為虛擬內存,虛擬內存在硬盤上的存在形式就是 PAGEFILE.SYS這個頁面文件。
NT/2000的每一個進程都在啟動時分配了4GB(0xFFFFFFFF)的虛擬內存。其中的某些部份實際上是由所有進程共享的,例如核心和設備驅動程序區域。但它們都會被映射到每個進程的虛擬地址空間里。實際上沒有進程分配到4GB的物理內存,而是僅當需要時才分配物理內存。因此每一個進程都有各自的4GB虛擬內存,編址范圍從0x00000000到0xFFFFFFFF。其中,0x00000000-0x0000FFFF是為NULL指針分配而保留的。訪問該區域內存將導致“非法訪問”錯誤。0x00010000-0x7FFEFFFF是用戶進程空間。EXE文件的映像被加載到其中(起始地址0x00400000),DLL(動態鏈接庫)也被加載到這部份空間。如果DLL或EXE的代碼被裝入到該范圍的某些地址,就能夠被執行。訪問該區域中沒有代碼裝入的地址將導致“非法訪問”錯誤。0x7FFF0000-0x7FFFFFFF是保留區域,對此區域的任何訪問都將導致“非法訪問”錯誤。0x80000000-0xFFFFFFFF僅供操作系統使用。用于加載設備驅動程序和其它核心級代碼。從用戶級應用程序(ring 3)訪問此區域將導致“非法訪問”錯誤。
虛擬內存可以說是兩個不同的概念。從編程的角度來說,每個應用程序運行在獨立的尋址空間,由操作系統通過頁表機制,映射到真正的物理內存上邊。程序請求內存時,如果請求不到指定大小的連續內存,就會報錯。題主的問題應該就是這種情況 另一種概念是交換文件,也就是Linux swap的概念。內存訪問速度快,但容量有限的,操作系統會把暫時用不到的內存數據,以文件的形式寫到硬盤,節省的空間用來存儲更多的必要數據。虛擬空間可以提高使用體驗,但是有一種情況要注意,如果應用程序運行需要5G的內存,而機器只有4G內存,操作系統需要不停的將數據在內存和硬盤之類寫入寫出,體驗很差。結論是,能加內存加內存,能上固態上固態。
虛擬內存可以說是兩個不同的概念。從編程的角度來說,每個應用程序運行在獨立的尋址空間,由操作系統通過頁表機制,映射到真正的物理內存上邊。程序請求內存時,如果請求不到指定大小的連續內存,就會報錯。題主的問題應該就是這種情況 另一種概念是交換文件,也就是Linux swap的概念。內存訪問速度快,但容量有限的,操作系統會把暫時用不到的內存數據,以文件的形式寫到硬盤,節省的空間用來存儲更多的必要數據。虛擬空間可以提高使用體驗,但是有一種情況要注意,如果應用程序運行需要5G的內存,而機器只有4G內存,操作系統需要不停的將數據在內存和硬盤之類寫入寫出,體驗很差。結論是,能加內存加內存,能上固態上固態。
因為windows進程間共享數據是用內存映射文件實現的,包括RPC、COM、OLE、DDE、DDE、WINDOWS消息、剪貼板、套接字等最底層的機制就是內存映射文件。
所以要是不用業交換文件來實現進程間通信難道用臨時磁盤文件實現嗎
題主你還沒有搞清楚頁面文件(交換空間)與虛擬內存的正確含義,我想你是想表達,為什么大內存還要設置頁面文件?事實上,大內存根本無需設置頁面文件,尤其是大于8G的情況下,頁面文件是以前內存小的一個不得已的解決方案,用硬盤的一塊空間來當作內存使用。操作系統把處于不活躍的進程所占用的內存頁保存到硬盤上,留出更多的內存給活躍的進程使用,這樣做的后果就是,由于硬盤速度很慢,尤其是機械硬盤,使得當這些不活躍的程序激活的時候,操作系統需要大量讀寫硬盤,造成系統響應速度嚴重下降!如今內存容量已不再是瓶頸,題主應該仔細看看是哪些用不上的進程占用了寶貴的系統資源,及時清理后臺資源,把有限的資源用在正在使用的程序上才是硬道理。頁面文件可以一時用來救急,如果你一直需要開啟頁面文件,那么就應當考慮增加物理內存,并在物理內存足夠的情況下關閉頁面文件,否則你的靈感將會消失在系統的卡頓和等待中!
一個應用程序為什么會使用內存同時有使用虛擬內存呢
樓主,你這個問題。。。。問的有點讓人無語。。。。
應用程序(我以游戲為主,因為通常一般程序是不會占用很多虛擬內存的)
如果計算機缺少運行程序或操作所需的隨機存取內存 (RAM),則 Windows 使用虛擬內存)進行補償。 不知樓主有沒有發現,在Windows2000(XP)目錄下有一個名為pagefile.sys的系統文件,它的大小經常自己發生變動,小的時候可能只有幾十兆,大的時候則有數百兆,這種毫無規律的變化實在讓很多人摸不著頭腦。其實,pagefile.sys是Windows下的一個虛擬內存,它的作用與物理內存基本相似,但它是作為物理內存的“后備力量”而存在的,但是,它并不是在只有物理內存不夠用時才發揮作用的,也就是說在物理內存夠用時也有可能使用虛擬內存,如果你虛擬內存設置過小則會提示“虛擬內存不足”。
Windows內存結構梳理
多字節數據是按怎樣的順序存放的呢?實際情況和CPU有關,微處理中的存放順序有正序和逆序之分。正序(big-endian) 逆序(little-endian)
? ? 兩種編碼的區別:
? ? ?big-endian:高位字節存入低字節,低位字節存入高地址,一次排列
? ? ?little-endian:低位字節存入低地址,高位字節存入高地址。反序排列
?
? ?unicode是asc字符編碼的一個擴展,只不過在WINDOWS中,用兩個字節對其進行編碼,也稱為寬字符集
? ?unicode中,所有的字符都是16位,包括所有的7為asc碼都被擴充為16位(注意高位擴充的是〇)
? ?intel處理器在內存中,一個字存入存儲器要占有相繼的兩個字節,這個字存放時就按little-endian方式存入,即低位字節存入低地址,高位字節存入高地址
??
? ?API函數,這些函數提供應用程序運行所需要的窗口管理、圖形設備接口、內存管理等各項服務功能。這些功能以函數庫的形式組織在一起,形成餓了WINDOWS應用程序編程接口(API),簡稱win api。win api子系統負責將api調用轉換成WINDOWS操作系統的系統服務調用,所以,可以認為API函數是構筑整個WINDOWS框架的基石,在他的下面是WINDOWS的操作系統核心,而在他的上面則是WINDOWS應用程序,對于應用程序開發人員而言,所看到的WINDOWS操作系統實際上就是win API,操作系統的其他部分對開發人員來說是完全透明的
? ?WINDOWS運轉的核心是一個稱作“動態鏈接”的概念,WINDOWS提供了應用程序可利用的豐富的函數調用,這些函數采用動態鏈接即DLL實現
? ?win32API 是一個基于c語言的接口,但是win32API中的函數可以由用不同語言編寫的程序調用,只要在調用時遵循調用的規范即可
? ?
? ? API函數是區分字符集的:A表示ANSI;W表示Widechars,即unicode。前者是通常使用的單字節方式,后者是寬字節方式,以便處理雙字節字符。
? ?
? ? 句柄是WINDOWS標識,由應用程序建立或使用的對象所使用的一個唯一的整數值(通常是32位)。WINDOWS要使用各種各樣的句柄來標識諸如應用程序實例、窗口、圖標、菜單、輸出設備、文件等對象。程序通過調用WINDOWS函數獲取句柄,然后在其他WINDOWS函數中使用這個句柄,以引用他代表的對象。句柄的實際值對程序來說無關緊要,這個值是被WINDOWS模塊內部用來引用相應對象的
? ? ?當一個進程被初始化時,系統要為他分配一個句柄表,句柄值是放入進程的句柄表中的索引
? ? ?unicode影響到計算機工業的每個部分,對操作系統和編程語言的影響最大
? ? ?在NT架構下,win32API能接受unicode和ASCI字符串,而其內核則只能使用unicode ,所有這些操作對用戶來說都是透明的,但進行這些字符串的轉換需要占用系統資源。
? ??
? ? ?WINDOWS是一個消息驅動式系統,WINDOWS消息提供應用程序與應用程序之間、應用程序與WINDOWS系統之間進行通信的手段。應用程序想要實現的功能由消息來觸發,并且靠對消息的響應和處理來完成。
? ? ?WINDOWS系統中有兩種消息隊列:一種是系統消息隊列,另一種是應用程序消息隊列。計算機的所有輸入設備由WINDOWS監控。當一個事件發生時,WINDOWS先將輸入的消息放入系統消息隊列中,再將輸入的消息拷貝到相應的應用程序隊列中,應用程序中的消息循環從他的消息隊列中檢索每個消息并且發送給相應的窗口函數中。一個事件的發生,到達處理他的窗口函數必須經歷上述過程。值得注意的是消息的非搶先性,即不論事件的急與緩,總是按到達的先后順序排隊(一些系統消息除外)
? ? ?由于WINDOWS本身是由消息驅動的,所以調試程序時跟蹤一個消息會得到相當底層的答案。
? ? ?一般來說,80X86及其以后的各代CPU可在實模式、保護模式、虛擬86模式下運轉
? ? ?在保護模式下程序可以利用更多的內存,可以實現多任務系統
? ? ?在保護模式下,CPU的尋址方式與實模式不同,實模式下的尋址方式是“段基址+段偏移”,段的默認大小為64kB,所有段都是可讀/寫的,唯有代碼段是可執行的,段的特權級為0.而在保護模式下內存是“線性”的,因為這時段寄存器的意義不同,他里面存放的不再是段基地址,二十存放著段選擇子,這呃值是不直接參與尋址的,只是全局描述表(global descriptor table ,GDT)或本地描述表(local descriptor table,LDT)的一個指針,不同段寄存器有不同的屬性(讀、寫、執行、特權級等)
? ? ?虛擬內存(virtual memory)不是真正的內存,他通過映射(map)的方法,使可用的虛擬地址達到4GB,每個應用程序可以被分配2GB的虛擬地址,剩下的2GB留給操作系統自己用。WINDOWS是一個分時多任務操作系統,CPU時間被分成一個個的事件片后分配給不同程序,在一個時間片里,和這個程序執行不無關的東西并不映射到線性地址中。因此每個程序都有自己的4GB尋址空間,互補干擾。在物理內存中,操作系統和系統DLl代碼需要供每個應用程序調用,所以在所有的時間必須映射;用戶exe程序只在自己所屬的時間片內被映射,而用戶DLL則有選擇地被映射。
簡單地說,虛擬內存的實現方法和過程如下:
1、當一個應用程序被啟動時,操作系統就創建一個新進程,并給每個進程分配2GB的虛擬地址(不是內存,只是地址)
2、虛擬內存管理器將應用程序的代碼映射到那個應用程序的虛擬地址中的某個位置,并把當前所需要的代碼讀取到物理地址中(注意:虛擬地址和應用程序代碼在物理內存中的位置是沒有關系的)
3、如果使用動態鏈接庫DLL,DLL也被映射到進程的虛擬地址空間,在需要的時候才被讀入物理內存
4、其他項目(例如數據、堆棧)的空間是從物理內存中分配的,并被映射到虛擬地址空間中
5、應用程序通過使用他的虛擬地址空間中的地址開始執行,然后虛擬內存管理器把每次的內存訪問映射到物理位置
關于虛擬內存,要明白一下幾點:
1、應用程序是不會直接訪問物理地址的
2、虛擬內存管理器通過虛擬地址的訪問請求,控制所有的物理地址訪問
3、每個應用程序都有相互獨立的4GB尋址空間,不同應用程序的地址空間是隔離的
4、DLL程序沒有自己的“私有”空間,他們總是被映射到其他應用程序的地址空間中,作為其他應用程序的一部分運行。因為如果他不和其他程序同屬一個地址空間,應用程序就無法調用他
使用虛擬內存的好處是:簡化了內存的管理,并可彌補物理內存的不足;可以防止多任務環境下各個應用程序之間的沖突
? ? ? 在保護模式下,所有的應用程序都有權限級別,這個權限級別按優先次序分為4等
? ? ? 0等級權限可以執行所有的指令并訪問所有數據,操作系統核心層是運行在ring0級的,而win32子系統(如動態鏈接庫)是運行在ring3級的,以提供與應用程序的接口
? ? ? 保護模式使應用程序沒有權限去破壞操作系統,只能規矩地使用win32API接口函數與系統打交道。如果想控制系統,就必須取得0特權級,比如調試工具softICE就是工作在0特權級上的
WINDOWS的可執行文件(EXE、DLL)是PE格式
? ? ? PE文件使用的是一個平面地址空間,所有代碼和數據都被合并在一起,組成一個很大的結構。文件的內容被分割為不同的區塊(section,又稱區段、節等),塊中包含代碼或數據。每個塊都有他自己在內存中的一套屬性,比如:這個塊是否包含代碼、是否只讀或可讀/寫等
每個塊都有不同的名字,這個名字用來表示區塊的功能。常見的快的有.text,.rdata,.data,.idata,.rsrc等。各種塊的含義如下:
? ?.text:實在編譯或匯編結束時產生的一種塊,他的內容全是指令代碼;
? ?.rdata:是運行期只讀數據;
? ?.data:是初始化的數據塊;
? ?.idata:包含其他外來的DLL的函數及數據信息,即輸入表;
? ?.rsrc:包含模塊的全部資源,如圖標、菜單、位圖等。
? ? ? PE文件非常好的一個地方就是在磁盤上的數據結構與在內存中的結構是一致的,裝載一個可執行文件到內存中,主要就是將一個PE文件的某一部分映射到地址空間中。這樣,PE文件的數據結構在磁盤和內存中是一樣的
? ? ? 程序訪問存儲器所使用的邏輯地址稱為虛擬地址,又稱為內存偏移地址(memory offset)。與實地址模式下的分段地址類似,虛擬地址也可以寫成“段:偏移量”的形式,這個的段是指段選擇子。例如“0167:00401000”就是這個表示方法(0167:這個是段選擇子,其數據保存在CS段選擇器里。同一程序在不同系統環境下,此值可能不同,一般也不需要關心此值)
? ? ? 基地址:文件執行時將被映射到指定內存地址中,這個初始內存地址稱為基地址(imagebase)。這個值是由PE文件本身設定的
NT/2000的每一個進程都在啟動時分配了4GB(0xFFFFFFFF)的虛擬內存。其中的某些部份實際上是由所有進程共享的,例如核心和設備驅動程序區域。但它們都會被映射到每個進程的虛擬地址空間里。實際上沒有進程分配到4GB的物理內存,而是僅當需要時才分配物理內存。因此每一個進程都有各自的4GB虛擬內存,編址范圍從0x00000000到0xFFFFFFFF。其中,0x00000000-0x0000FFFF是為NULL指針分配而保留的。訪問該區域內存將導致“非法訪問”錯誤。0x00010000-0x7FFEFFFF是用戶進程空間。EXE文件的映像被加載到其中(起始地址0x00400000),DLL(動態鏈接庫)也被加載到這部份空間。如果DLL或EXE的代碼被裝入到該范圍的某些地址,就能夠被執行。訪問該區域中沒有代碼裝入的地址將導致“非法訪問”錯誤。0x7FFF0000-0x7FFFFFFF是保留區域,對此區域的任何訪問都將導致“非法訪問”錯誤。0x80000000-0xFFFFFFFF僅供操作系統使用。用于加載設備驅動程序和其它核心級代碼。從用戶級應用程序(ring 3)訪問此區域將導致“非法訪問”錯誤。
虛擬內存可以說是兩個不同的概念。從編程的角度來說,每個應用程序運行在獨立的尋址空間,由操作系統通過頁表機制,映射到真正的物理內存上邊。程序請求內存時,如果請求不到指定大小的連續內存,就會報錯。題主的問題應該就是這種情況 另一種概念是交換文件,也就是Linux swap的概念。內存訪問速度快,但容量有限的,操作系統會把暫時用不到的內存數據,以文件的形式寫到硬盤,節省的空間用來存儲更多的必要數據。虛擬空間可以提高使用體驗,但是有一種情況要注意,如果應用程序運行需要5G的內存,而機器只有4G內存,操作系統需要不停的將數據在內存和硬盤之類寫入寫出,體驗很差。結論是,能加內存加內存,能上固態上固態。
虛擬內存可以說是兩個不同的概念。從編程的角度來說,每個應用程序運行在獨立的尋址空間,由操作系統通過頁表機制,映射到真正的物理內存上邊。程序請求內存時,如果請求不到指定大小的連續內存,就會報錯。題主的問題應該就是這種情況 另一種概念是交換文件,也就是Linux swap的概念。內存訪問速度快,但容量有限的,操作系統會把暫時用不到的內存數據,以文件的形式寫到硬盤,節省的空間用來存儲更多的必要數據。虛擬空間可以提高使用體驗,但是有一種情況要注意,如果應用程序運行需要5G的內存,而機器只有4G內存,操作系統需要不停的將數據在內存和硬盤之類寫入寫出,體驗很差。結論是,能加內存加內存,能上固態上固態。
因為windows進程間共享數據是用內存映射文件實現的,包括RPC、COM、OLE、DDE、DDE、WINDOWS消息、剪貼板、套接字等最底層的機制就是內存映射文件。
所以要是不用業交換文件來實現進程間通信難道用臨時磁盤文件實現嗎
題主你還沒有搞清楚頁面文件(交換空間)與虛擬內存的正確含義,我想你是想表達,為什么大內存還要設置頁面文件?事實上,大內存根本無需設置頁面文件,尤其是大于8G的情況下,頁面文件是以前內存小的一個不得已的解決方案,用硬盤的一塊空間來當作內存使用。操作系統把處于不活躍的進程所占用的內存頁保存到硬盤上,留出更多的內存給活躍的進程使用,這樣做的后果就是,由于硬盤速度很慢,尤其是機械硬盤,使得當這些不活躍的程序激活的時候,操作系統需要大量讀寫硬盤,造成系統響應速度嚴重下降!如今內存容量已不再是瓶頸,題主應該仔細看看是哪些用不上的進程占用了寶貴的系統資源,及時清理后臺資源,把有限的資源用在正在使用的程序上才是硬道理。頁面文件可以一時用來救急,如果你一直需要開啟頁面文件,那么就應當考慮增加物理內存,并在物理內存足夠的情況下關閉頁面文件,否則你的靈感將會消失在系統的卡頓和等待中!
一個應用程序為什么會使用內存同時有使用虛擬內存呢
樓主,你這個問題。。。。問的有點讓人無語。。。。
應用程序(我以游戲為主,因為通常一般程序是不會占用很多虛擬內存的)
如果計算機缺少運行程序或操作所需的隨機存取內存 (RAM),則 Windows 使用虛擬內存)進行補償。 不知樓主有沒有發現,在Windows2000(XP)目錄下有一個名為pagefile.sys的系統文件,它的大小經常自己發生變動,小的時候可能只有幾十兆,大的時候則有數百兆,這種毫無規律的變化實在讓很多人摸不著頭腦。其實,pagefile.sys是Windows下的一個虛擬內存,它的作用與物理內存基本相似,但它是作為物理內存的“后備力量”而存在的,但是,它并不是在只有物理內存不夠用時才發揮作用的,也就是說在物理內存夠用時也有可能使用虛擬內存,如果你虛擬內存設置過小則會提示“虛擬內存不足”。
Windows內存結構梳理
多字節數據是按怎樣的順序存放的呢?實際情況和CPU有關,微處理中的存放順序有正序和逆序之分。正序(big-endian) 逆序(little-endian)
? ? 兩種編碼的區別:
? ? ?big-endian:高位字節存入低字節,低位字節存入高地址,一次排列
? ? ?little-endian:低位字節存入低地址,高位字節存入高地址。反序排列
?
? ?unicode是asc字符編碼的一個擴展,只不過在WINDOWS中,用兩個字節對其進行編碼,也稱為寬字符集
? ?unicode中,所有的字符都是16位,包括所有的7為asc碼都被擴充為16位(注意高位擴充的是〇)
? ?intel處理器在內存中,一個字存入存儲器要占有相繼的兩個字節,這個字存放時就按little-endian方式存入,即低位字節存入低地址,高位字節存入高地址
??
? ?API函數,這些函數提供應用程序運行所需要的窗口管理、圖形設備接口、內存管理等各項服務功能。這些功能以函數庫的形式組織在一起,形成餓了WINDOWS應用程序編程接口(API),簡稱win api。win api子系統負責將api調用轉換成WINDOWS操作系統的系統服務調用,所以,可以認為API函數是構筑整個WINDOWS框架的基石,在他的下面是WINDOWS的操作系統核心,而在他的上面則是WINDOWS應用程序,對于應用程序開發人員而言,所看到的WINDOWS操作系統實際上就是win API,操作系統的其他部分對開發人員來說是完全透明的
? ?WINDOWS運轉的核心是一個稱作“動態鏈接”的概念,WINDOWS提供了應用程序可利用的豐富的函數調用,這些函數采用動態鏈接即DLL實現
? ?win32API 是一個基于c語言的接口,但是win32API中的函數可以由用不同語言編寫的程序調用,只要在調用時遵循調用的規范即可
? ?
? ? API函數是區分字符集的:A表示ANSI;W表示Widechars,即unicode。前者是通常使用的單字節方式,后者是寬字節方式,以便處理雙字節字符。
? ?
? ? 句柄是WINDOWS標識,由應用程序建立或使用的對象所使用的一個唯一的整數值(通常是32位)。WINDOWS要使用各種各樣的句柄來標識諸如應用程序實例、窗口、圖標、菜單、輸出設備、文件等對象。程序通過調用WINDOWS函數獲取句柄,然后在其他WINDOWS函數中使用這個句柄,以引用他代表的對象。句柄的實際值對程序來說無關緊要,這個值是被WINDOWS模塊內部用來引用相應對象的
? ? ?當一個進程被初始化時,系統要為他分配一個句柄表,句柄值是放入進程的句柄表中的索引
? ? ?unicode影響到計算機工業的每個部分,對操作系統和編程語言的影響最大
? ? ?在NT架構下,win32API能接受unicode和ASCI字符串,而其內核則只能使用unicode ,所有這些操作對用戶來說都是透明的,但進行這些字符串的轉換需要占用系統資源。
? ??
? ? ?WINDOWS是一個消息驅動式系統,WINDOWS消息提供應用程序與應用程序之間、應用程序與WINDOWS系統之間進行通信的手段。應用程序想要實現的功能由消息來觸發,并且靠對消息的響應和處理來完成。
? ? ?WINDOWS系統中有兩種消息隊列:一種是系統消息隊列,另一種是應用程序消息隊列。計算機的所有輸入設備由WINDOWS監控。當一個事件發生時,WINDOWS先將輸入的消息放入系統消息隊列中,再將輸入的消息拷貝到相應的應用程序隊列中,應用程序中的消息循環從他的消息隊列中檢索每個消息并且發送給相應的窗口函數中。一個事件的發生,到達處理他的窗口函數必須經歷上述過程。值得注意的是消息的非搶先性,即不論事件的急與緩,總是按到達的先后順序排隊(一些系統消息除外)
? ? ?由于WINDOWS本身是由消息驅動的,所以調試程序時跟蹤一個消息會得到相當底層的答案。
? ? ?一般來說,80X86及其以后的各代CPU可在實模式、保護模式、虛擬86模式下運轉
? ? ?在保護模式下程序可以利用更多的內存,可以實現多任務系統
? ? ?在保護模式下,CPU的尋址方式與實模式不同,實模式下的尋址方式是“段基址+段偏移”,段的默認大小為64kB,所有段都是可讀/寫的,唯有代碼段是可執行的,段的特權級為0.而在保護模式下內存是“線性”的,因為這時段寄存器的意義不同,他里面存放的不再是段基地址,二十存放著段選擇子,這呃值是不直接參與尋址的,只是全局描述表(global descriptor table ,GDT)或本地描述表(local descriptor table,LDT)的一個指針,不同段寄存器有不同的屬性(讀、寫、執行、特權級等)
? ? ?虛擬內存(virtual memory)不是真正的內存,他通過映射(map)的方法,使可用的虛擬地址達到4GB,每個應用程序可以被分配2GB的虛擬地址,剩下的2GB留給操作系統自己用。WINDOWS是一個分時多任務操作系統,CPU時間被分成一個個的事件片后分配給不同程序,在一個時間片里,和這個程序執行不無關的東西并不映射到線性地址中。因此每個程序都有自己的4GB尋址空間,互補干擾。在物理內存中,操作系統和系統DLl代碼需要供每個應用程序調用,所以在所有的時間必須映射;用戶exe程序只在自己所屬的時間片內被映射,而用戶DLL則有選擇地被映射。
簡單地說,虛擬內存的實現方法和過程如下:
1、當一個應用程序被啟動時,操作系統就創建一個新進程,并給每個進程分配2GB的虛擬地址(不是內存,只是地址)
2、虛擬內存管理器將應用程序的代碼映射到那個應用程序的虛擬地址中的某個位置,并把當前所需要的代碼讀取到物理地址中(注意:虛擬地址和應用程序代碼在物理內存中的位置是沒有關系的)
3、如果使用動態鏈接庫DLL,DLL也被映射到進程的虛擬地址空間,在需要的時候才被讀入物理內存
4、其他項目(例如數據、堆棧)的空間是從物理內存中分配的,并被映射到虛擬地址空間中
5、應用程序通過使用他的虛擬地址空間中的地址開始執行,然后虛擬內存管理器把每次的內存訪問映射到物理位置
關于虛擬內存,要明白一下幾點:
1、應用程序是不會直接訪問物理地址的
2、虛擬內存管理器通過虛擬地址的訪問請求,控制所有的物理地址訪問
3、每個應用程序都有相互獨立的4GB尋址空間,不同應用程序的地址空間是隔離的
4、DLL程序沒有自己的“私有”空間,他們總是被映射到其他應用程序的地址空間中,作為其他應用程序的一部分運行。因為如果他不和其他程序同屬一個地址空間,應用程序就無法調用他
使用虛擬內存的好處是:簡化了內存的管理,并可彌補物理內存的不足;可以防止多任務環境下各個應用程序之間的沖突
? ? ? 在保護模式下,所有的應用程序都有權限級別,這個權限級別按優先次序分為4等
? ? ? 0等級權限可以執行所有的指令并訪問所有數據,操作系統核心層是運行在ring0級的,而win32子系統(如動態鏈接庫)是運行在ring3級的,以提供與應用程序的接口
? ? ? 保護模式使應用程序沒有權限去破壞操作系統,只能規矩地使用win32API接口函數與系統打交道。如果想控制系統,就必須取得0特權級,比如調試工具softICE就是工作在0特權級上的
WINDOWS的可執行文件(EXE、DLL)是PE格式
? ? ? PE文件使用的是一個平面地址空間,所有代碼和數據都被合并在一起,組成一個很大的結構。文件的內容被分割為不同的區塊(section,又稱區段、節等),塊中包含代碼或數據。每個塊都有他自己在內存中的一套屬性,比如:這個塊是否包含代碼、是否只讀或可讀/寫等
每個塊都有不同的名字,這個名字用來表示區塊的功能。常見的快的有.text,.rdata,.data,.idata,.rsrc等。各種塊的含義如下:
? ?.text:實在編譯或匯編結束時產生的一種塊,他的內容全是指令代碼;
? ?.rdata:是運行期只讀數據;
? ?.data:是初始化的數據塊;
? ?.idata:包含其他外來的DLL的函數及數據信息,即輸入表;
? ?.rsrc:包含模塊的全部資源,如圖標、菜單、位圖等。
? ? ? PE文件非常好的一個地方就是在磁盤上的數據結構與在內存中的結構是一致的,裝載一個可執行文件到內存中,主要就是將一個PE文件的某一部分映射到地址空間中。這樣,PE文件的數據結構在磁盤和內存中是一樣的
? ? ? 程序訪問存儲器所使用的邏輯地址稱為虛擬地址,又稱為內存偏移地址(memory offset)。與實地址模式下的分段地址類似,虛擬地址也可以寫成“段:偏移量”的形式,這個的段是指段選擇子。例如“0167:00401000”就是這個表示方法(0167:這個是段選擇子,其數據保存在CS段選擇器里。同一程序在不同系統環境下,此值可能不同,一般也不需要關心此值)
? ? ? 基地址:文件執行時將被映射到指定內存地址中,這個初始內存地址稱為基地址(imagebase)。這個值是由PE文件本身設定的
總結
- 上一篇: sps及pps在解码器内传递过程
- 下一篇: 人心散了、项目必然要败