編碼學習筆記 ——裝載

參考:《程序員的自我修養》
程序執行時,所需要的指令和數據必須在內存中才能正常運行。
但是,往往程序所需要的內存大於物理內存,無法把所有指令和數據全部放在內存中。
通過增加內存來解決這個問題,不太划算,因爲相對於內存而言,磁盤比較便宜,因此動態裝載就出現了。
分頁:把地址空間人爲地分爲固定大小的頁,每一頁的大小由硬件或操作系統決定。對於系統而言,頁的大小是固定的。
爲什麼可執行文件常常被叫做image?
可執行文件在裝載時,實際上是被映射的虛擬空間。
1. 進程虛擬地址空間

虛擬地址空間由計算機硬件平臺決定。硬件平臺決定了地址空間的最大上限,即硬件尋址空間大小。

  • 32位的硬件平臺,虛擬地址空間的範圍爲 0 ~ 232,即0x00000000 ~ 0xFFFFFFFF。4GB。
  • 64位的硬件平臺,虛擬地址空間的範圍爲 0 ~ 263,即0x0000000000000000 ~ 0xFFFFFFFFFFFFFFFF。

C語言中,指針大小的位數與虛擬空間位數相同。32位平臺的指針爲32位,4個字節;64位平臺的指針爲64位,8個字節。

通常將虛擬地址空間分爲兩部分:系統虛擬地址空間和用戶虛擬地址空間。用戶進程只能訪問用戶虛擬地址空間,若訪問了系統地址空間,便會報錯。常見錯誤爲:“Segmentation fault”(Linux),“進程因非法操作需要關閉”(Windows)。

  • Linux默認分配:系統1GB,地址範圍 0xC0000000 ~ 0xFFFFFFFF;用戶3GB,地址範圍0x00000000 ~ 0xBFFFFFFF。
  • Windows默認分配:系統2GB,用戶2GB。可更改。
     
2. 裝載

進程的建立,需要做3件事:

  • 創建獨立的虛擬地址空間;
  • 讀取可執行文件頭,建立虛擬空間與可執行文件的映射關係;
  • 將CPU指令寄存器設置成可執行文件的入口地址,啓動運行。

頁映射關係函數虛擬空間物理內存的映射關係。

虛擬空間與可執行文件的映射關係:當程序執行發生頁錯誤時,操作系統將從物理內存中分配一個物理頁,然後將該“缺頁”從磁盤讀取到內存中,再設置“缺頁”的虛擬頁和物理頁的映射關係。

  • 可執行文件被映射時,以頁長度作爲單位。
     
3. 可執行文件鏈接視圖和執行視圖

ELF文件段的權限組合情況:

  • 可讀可執行:代碼段
  • 可讀可寫:數據段、BSS段
  • 只讀:只讀數據段

爲了節省內存空間,可執行文件在虛擬內存映射時,可以採取的方案:對於相同權限的段,合併到一起當作一個段進行映射。

Section:從存儲的角度。鏈接視圖。

  • readelf -S file.elf 可以查看可執行文件的Section信息。
    在這裏插入圖片描述

Segment:從裝載的角度。執行視圖。

  • readelf -l file.elf 可以查看可執行文件的Segment信息。
    在這裏插入圖片描述
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章