虛擬位址空間

2021-09-25 09:33:34 字數 1435 閱讀 4311

大多數計算機使用8位的塊,或者叫做位元組(byte),來作為最小的可定址的儲存器單元,而不是訪問儲存器中單獨的位。 機器級程式將儲存器視為乙個非常大的位元組陣列,稱為虛擬儲存器。儲存器的乙個位元組都由唯一的數字來標識,稱為它的位址(虛擬位址)。所有可能虛擬位址的集合就稱作虛擬位址空間。

——引自《深入理解計算機系統》p23

1、保留區(低位址,128m,禁止訪問)

位於虛擬位址空間的最低部分,未賦予實體地址。任何對它的引用都是非法的,用於捕捉使用空指標和小整型值指標引用記憶體的異常情況。它並不是乙個單一的記憶體區域,而是對位址空間中受到作業系統保護而禁止使用者程序訪問的位址區域的總稱。大多數作業系統中,極小的位址通常都是不允許訪問的,如null。c語言將無效指標賦值為0也是出於這種考慮,因為0位址上正常情況下不會存放有效的可訪問資料。

2、.text段:指令段/**段,資料以外都是指令,可執行**、字串字面值、唯讀變數

3、.data段:資料段,儲存初始化且初始化不為0的全域性變數和靜態區域性變數。注意:在 data 段上面有乙個 rodata 段(rodata 段的位置在.o 檔案時去觀察它是在.bss 段的下方),它的屬性是只可讀。所以當我們這樣定義字串時:char *p = 「helloworld」; *p = 『a』;會報錯的原因就是這裡的」hello world」在 rodata 段存放,它只可讀,不可修改。

4、.bss段:資料段,儲存未初始化或者初始化為0的全域性變數和靜態區域性變數。

5、堆區:從低位址到高位址,動態分配的記憶體。堆用於存放程序執行時動態分配的記憶體段,可動態擴張或縮減。堆中內容是匿名的,不能按名字直接訪問,只能通過指標間接訪問。當程序呼叫malloc(c)/new(c++)等函式分配記憶體時,新分配的記憶體動態新增到堆上(擴張);當呼叫free(c)/delete(c++)等函式釋放記憶體時,被釋放的記憶體從堆中剔除(縮減) 。

6、共享庫的儲存對映區 lib.so

7、棧區:從高位址到低位址,儲存區域性變數、函式引數、返回位址等。在執行時負責函式的形參,區域性變數的管理,主要由esp和ebp暫存器記錄當前棧頂和當前棧低的函式呼叫管理。棧的起始位址和堆的起始位址不固定:防止棧溢位或者是程式的攻擊。

8、命令列引數。main()函式的引數列表 :argc引數個數 ar**引數內容 envp環境變數  int main(int argc,char * ar**,char * envp)

例如:./run "hellp" "world"

9、環境變數envp

10、核心空間: 核心總是駐留在記憶體中,是作業系統的一部分。核心空間為核心保留,不允許應用程式讀寫該區域的內容或直接呼叫核心**定義的函式。

zone_dma:可直接訪問記憶體(加快磁碟記憶體資料的讀寫)

zone_normal

zone_highmen:高階記憶體(在記憶體中對映高於1g的物理記憶體)

虛擬位址空間

當處理器讀或寫入記憶體位置時,它會使用虛擬位址。作為讀或寫操作的一部分,處理器將虛擬位址轉換為實體地址。通過虛擬位址訪問記憶體有以下優勢 程序可用的虛擬位址範圍稱為該程序的 虛擬位址空間 每個使用者模式程序都有其各自的專用虛擬位址空間。對於 32 位程序,虛擬位址空間通常為 2 gb,範圍從 0x0...

虛擬位址空間

14 共 14 對本文的評價是有幫助 評價此主題 程序可用的虛擬位址範圍稱為該程序的 虛擬位址空間 每個使用者模式程序都有其各自的專用虛擬位址空間。對於 32 位程序,虛擬位址空間通常為 2 gb,範圍從 0x00000000 至 0x7fffffff。對於 64 位程序,虛擬位址空間為 8 tb,...

虛擬位址空間

1 text 段 存放程式執行的一塊記憶體區域,此區域大小在執行之前就已經確定下來了。2 data資料段 全域性初始化資料區 靜態資料區 只初始化一次,指用來存放程式中已初始化的全域性變數的一塊記憶體區域 已經初始化的全域性變數 靜態變數和常量 3 bss未初始化資料區 用來存放程式中未初始化的全域...