windows遊戲程式設計《二》位址

2021-06-21 05:59:36 字數 1728 閱讀 3921

位址有虛擬位址,邏輯位址,線性位址,實體地址!以下分別介紹下

虛擬位址(virtual address)是指由程式產生的由段選擇符和段內偏移位址兩部分組成的位址。因為這兩部分組成的位址並沒有直接用來訪問物理記憶體,而是需要通過分段位址變換機制處理或對映後才對應到物理記憶體位址上,因此這種位址被稱為虛擬位址。虛擬位址空間由gdt對映的全域性位址空間和由ldt對映的區域性位址空間組成。選擇符的索引部分由13位表示,加上區分gdt和ldt的1位,因此intel 80x86 cpu共可以索引16384個選擇符。若每個段的長度都取最大值4gb,則最大虛擬位址空間範圍是16384×4gb = 64tb。 

現代作業系統普遍採用虛擬記憶體管理機制,這需要mmu的支援,mmu通常是cpu的一部分,如果處理器沒有用mmu或沒啟用時,cpu執行單元發出的記憶體位址將直接傳送到晶元引腳上,被記憶體晶元(物理記憶體)接收,這稱為實體地址。如果啟用了,cpu執行單元發出的記憶體將被mmu截獲,從cpu到mmu的位址稱為虛擬位址(va),而mmu將這個位址翻譯成另乙個位址傳送到cpu晶元的外部位址引腳上,也就是講虛擬位址對映成實體地址!

cpu發出取指令請求時的位址是當前上下文的va,mmu再從頁表找到這個虛擬位址的實體地址,完成取址。同樣讀取資料的也是va,也是通過mmu從頁表中找到實體地址,再產生匯流排時序,完成取資料的!

邏輯位址(logical address)是指由程式產生的與段相關的偏移位址部分。在intel保護模式下即是指程式執行**段限長內的偏移位址(假定**段、資料段完全一樣)。應用程式設計師僅需與邏輯位址打交道,而分段和分頁機制對他來說是完全透明的,僅由系統程式設計人員涉及。不過有些資料並不區分邏輯位址和虛擬位址的概念,而是將它們統稱為邏輯位址。 

線性位址(linear address)是虛擬位址到物理位址變換之間的中間層,是處理器可定址的記憶體空間(稱為線性位址空間)中的位址。程式**會產生邏輯位址,或者說是段中的偏移位址,加上相應段的基位址就生成了乙個線性位址。如果啟用了分頁機制,那麼線性位址可以再經變換以產生乙個實體地址。若沒有啟用分頁機制,那麼線性位址直接就是實體地址。intel 80386的線性位址空間容量為4gb。 

實體地址(physical address)是指出現在cpu外部位址匯流排上的定址物理記憶體的位址訊號,是位址變換的最終結果位址。如果啟用了分頁機制,那麼線性位址會使用頁目錄和頁表中的項變換成實體地址。如果沒有啟用分頁機制,那麼線性位址就直接成為實體地址了。 

如上所述,有時我們也把邏輯位址稱為虛擬位址。因為邏輯位址與虛擬記憶體空間的概念類似,並且也與實際物理記憶體容量無關。 

讀pe頭是其中系統某程序的事,當它呼叫createprocess時是kernel32.dll在該程序中建立臨時空間並讀取pe頭. 再根據pe頭的資訊,向ring0級的ntoskrnl申請乙個4g的段, 再用類似writeprocessmemory的方法從磁碟上的pe檔案映象到新建程序空間的記憶體中. 然後處理各個表,最後開始建立執行緒從入口開始執行. 

虛擬儲存(或虛擬記憶體)(virtual memory)是指計算機呈現出要比實際擁有的記憶體大得多的記憶體量。因此它允許程式設計師編制並執行比實際系統擁有的記憶體大得多的程式。這使得許多大型專案也能夠在具有有限記憶體資源的系統上實現。乙個很恰當的比喻是:你不需要很長的軌道就可以讓一列火車從上海開到北京。你只需要足夠長的鐵軌(比如說3km)就可以完成這個任務。採取的方法是把後面的鐵軌立刻鋪到火車的前面,只要你的操作足夠快並能滿足要求,列車就能像在一條完整的軌道上執行。這也就是虛擬記憶體管理需要完成的任務。在linux 0.12核心中,給每個程式(程序)都劃分了總容量為64mb的虛擬記憶體空間。因此程式的邏輯位址範圍是0x0000000到0x4000000。 

3 2 7 位址翻譯

有乙個tlb與乙個data cache 儲存器以位元組為編址單位 虛擬位址14位 實體地址12位 頁面大小為64位元組 tlb為四路相連,共有16個條目 data cache是物理定址,直接對映的,行大小為4個位元組,總共有16個組 寫出訪問位址0x03d4,0x00f1和0x0229的過程 因為本...

socket程式設計學習(二)位址轉換與套接字

1,in addr t inet addr const char cp 將ip位址轉換成乙個32位的整數 我們舉個例子 int main 中斷的列印資訊是 addr is 3232235876 ip 4 bytes is 64,1,a8,c0 通過inet addr 函式,ntohl函式,我們得到了...

Linux記憶體管理 二 位址對映

基本概念 cpu位數 alu位數 匯流排 可作為位址匯流排或資料匯流排或控制匯流排使用,具體視傳送指令而定 位址匯流排 cpu通過位址匯流排來指定儲存單元 資料匯流排 cpu與記憶體或其他器件之間的資料傳送的通道,位數與cpu位數一樣 cpu定址 cpu發出相應指令到位址匯流排上,尋找主存相應位址 ...