1. 程式人生 > >Windows地址空間

Windows地址空間

ring line 請求 space 根據 print virt 系統數據 每次

  虛擬地址空間
  
  ? 當處理器讀取或寫入存儲器位置時,它使用虛擬地址。作為讀或寫操作的一部分,處理器將虛擬地址轉換為物理地址。通過虛擬地址訪問內存具有以下優勢:
  
  程序可以使用連續範圍的虛擬地址來訪問在物理內存中不連續的大內存緩沖區。
  
  程序可以使用一系列虛擬地址來訪問大於可用物理內存的內存緩沖區。隨著物理內存的供應變小,內存管理器將物理內存頁(通常為4000 bytes)保存到磁盤文件中。根據需要,在物理內存和磁盤之間移動數據頁或代碼頁。
  
  不同進程使用的虛擬地址彼此隔離。一個進程中的代碼不能改變另一個進程或操作系統正在使用的物理內存。
  
  進程可用的虛擬地址範圍稱為進程的虛擬地址空間。每個用戶模式進程都有自己的私有虛擬地址空間。對於32位進程,虛擬地址空間通常為2千兆字節範圍0x00000000到0x7FFFFFFF。對於64位進程,虛擬地址空間為8 TB,範圍為0x000’00000000到0x7FF’FFFFFFFF。一系列虛擬地址有時稱為一系列虛擬內存。
  
  此圖說明了虛擬地址空間的一些關鍵功能。
  
  virtualaddressspace01
  
  該圖顯示了兩個64位進程的虛擬地址空間:Notepad.exe和MyApp.exe。
  
  ? 每個進程都有自己的虛擬地址空間,從0x000’0000000到0x7FF’FFFFFFFF。每個陰影塊表示一頁(4千字節大小)的虛擬或物理內存。
  
  ? 註意,記事本進程使用三個連續的虛擬地址頁面,從0x7F7’93950000開始。但是這三個連續的虛擬地址頁面被映射到物理內存中的不連續頁面。另請註意,兩個進程都使用從0x7F7’93950000開始的虛擬內存頁面,但這些虛擬頁面映射到物理內存的不同頁面。
  
  用戶空間和系統空間
  
  ? Notepad.exe和MyApp.exe等進程在用戶模式下運行。核心操作系統組件和許多驅動程序在更特權的內核模式下運行。每個用戶模式進程都有自己的專用虛擬地址空間,但所有以內核模式運行的代碼都共享一個稱為系統空間的虛擬地址空間。用戶模式進程的虛擬地址空間稱為用戶空間。
  
  ? 在32位Windows中,總可用虛擬地址空間為2 ^ 32bytes(4gigabytes 節)。通常,較低的2gigabytes 字節用於用戶空間,而較高的2千兆字節用於系統空間。
  
  ![virtualaddressspace02]img\virtualaddressspace02.png)
  
  在32位Windows中,您可以選擇(在啟動時)指定超過2千兆字節可用於用戶空間。結果是可用於系統空間的虛擬地址更少。您可以將用戶空間的大小增加到3千兆字節,在這種情況下,系統空間只有1千兆字節可用。
  
  在64位Windows中,理論上的虛擬地址空間量為2 ^ 64bytes(16exabytes ),但實際上只使用了16-exabyte範圍的一小部分。從0x000’00000000到0x7FF’FFFFFFFF的8TB範圍用於用戶空間,並且從0xFFFF0800’00000000到0xFFFFFFFF’FFFFFFFF的248TB範圍的部分用於系統空間。
  
  def process(string):
print(‘Processing:‘, string)

# 每次叠代一個字符
with open(‘fileone.txt‘) as f:
  while True:
char = f.read(1)
  if not char: break
  process(char)

#每次叠代一行字符
with open(‘fileone.txt‘) as f:
while True:
line = f.readline()
process(line)

#讀取所有內容,使用read
with open(‘fileone.www.dasheng178.com txt‘) as f: for char in f.read():
process(char)

#使用readlines
with open(‘fileone.txt‘)www.yongshiyule178.com as f: for char in f.readlines(www.mhylpt.com/):
process(char)

# 使用fileinput實現延遲叠代,讀取實際需要文本的部分
import fileinput
for line in fileinput.input(www.fengshen157.com ‘fileone.txt‘):
process(line)
  
  在用戶模式下運行的代碼可以訪問用戶空間,但無權訪問系統空間。此限制可防止用戶模式代碼讀取或更改受保護的操作系統數據結構。在內核模式下運行的代碼可以訪問用戶空間和系統空間。也就是說,以內核模式運行的代碼可以訪問系統空間和當前用戶模式進程的虛擬地址空間。
  
  在內核模式下運行的驅動程序必須非常小心,直接讀取或寫入用戶空間中的地址。這個場景說明了原因。
  
  用戶模式程序啟動從設備讀取某些數據的請求。程序提供緩沖區的起始地址以接收數據。
  
  在內核模式下運行的設備驅動程序例程啟動讀取操作並將控制權返回給其調用者。
  
  稍後,設備會中斷當前正在運行的任何線程,以表示讀取操作已完成。中斷由在此任意線程上運行的內核模式驅動程序例程處理,該線程屬於任意進程。
  
  此時,驅動程序不得將數據寫入步驟1中提供的用戶模式程序的起始地址。此地址位於發起請求的進程的虛擬地址空間中,這很可能與目前的進程。
  
  分頁池和非分頁池
  
  ? 在用戶空間中,可以根據需要將所有物理內存頁面分頁到磁盤文件。在系統空間中,某些物理頁面可以被分頁,而其他物理頁面則不能。系統空間有兩個用於動態分配內存的區域:分頁池和非分頁池。
  
  可以根據需要將頁面緩沖池中分配的內存分頁到磁盤文件中。在非分頁池中分配的內存永遠不能分頁到磁盤文件。

Windows地址空間