天天看點

程式員的自我修養——連結,裝載與庫(五)

  • 可執行檔案隻有裝載到記憶體中才能被CPU執行。
  • 程式是個靜态的概念,它就是一些預先編譯好的指令和資料集合的一個檔案。程序是個動态的概念,它是程式運作時的一個過程,很多時候把動态庫叫做運作時也有一定的含義。
  • 程式運作時都會擁有自己的虛拟位址空,虛拟空間的大小由CPU的位數來決定(32位虛拟位址空間大小為4GB,64位虛拟位址空間的大小為無窮(目前階段))。
  • C語言指針的大小的位數與虛拟位址空間的位數相同。
  • 程式在運作時處于作業系統的監管之下,程序的虛拟位址空間的大小是由作業系統來配置設定和回收的。
  • 作業系統為程序配置設定的虛拟位址空間的大小,其中一部由作業系統(作業系統的核心)使用。
  • 靜态裝載:将程式所需要的指令和資料全部加載到記憶體裡,以便使程式順利的運作。
  • 動态裝載:将程式最常使用的指令和資料加載到記憶體裡,不常使用的存放到外部磁盤裡。
  • 程式局部性原理包括時間局部性原理和空間局部性原理。
  • 覆寫裝入和頁映射都是利用了程式局部性原理的是兩種動态裝載的方法。
  • 頁映射:将資料和指令按頁的大小按照頁的大小進行劃分(頁的大小由硬體決定),按照頁進行裝載,頁利用了程式的局部性原理(每次頁被裝載時都要進行重定位)。
  • 每個程序都擁有獨立的虛拟位址空間,程序的建立一般分為三部:第一:建立一個獨立的虛拟位址空間(指令和資料被分成頁,虛拟位址空間實質是的映射函數所需要的資料結構)。第二:讀取可執行檔案頭,并且建立虛拟位址空間與可執行檔案的映射關系。第三:将CPU的指令寄存器設定成可執行檔案的入口位址,啟動運作。
  • 程式的執行發生缺頁錯誤時,作業系統從實體記憶體中配置設定一個實體頁,然後将該“缺頁”從磁盤中讀取到記憶體中,這個過程中會存在虛拟位址空間與可執行檔案(也叫做映射檔案,一般存放在磁盤中)之間的映射關系(儲存在作業系統内部的一個資料結構中)。
  • 當可執行檔案中的段增多時,就會産生空間浪費的問題。我們可以對于相同權限的段,把它們合并到一起當作一個段進行映射,這樣可以明顯的減少頁面的内部碎片,進而節省了記憶體的空間。
  • 段的權限包括:第一,以代碼段為代表的權限為可讀可寫可執行的段。第二,以資料段和BSS段位代表的權限為可讀可寫的段。第三,以隻讀資料段為代表的權限為隻讀的段。
  • 作業系統通過給程序空間劃分出一個個VMA(虛拟記憶體區域)來管理程序的虛拟空間,可執行檔案中将相同權限屬性的,有相同映射檔案的映射成一個VMA(虛拟記憶體區域)。
  • 程序一般可分為四種VMA區域:代碼VMA  資料VMA  堆VMA  棧VMA。
  • 可執行檔案最終是要被作業系統裝載運作的,這個裝載的過程一般是通過虛拟記憶體的頁映射機制來完成的。、
  • 可執行檔案的段與段接壤處的頁面,将該頁面分别映射兩次。
  • 程序啟動時需要包括程序運作的環境,其中包括:系統環境變量和程序的運作參數。而這些資訊一般被存放在程序的虛拟位址空間中。
  • 程序在啟動以後,程式的庫部分會把堆棧裡的初始化的資訊中的參數資訊傳遞給main(),也就是我們熟知的main()函數裡面的兩個argc和argv,這兩個參數分别對應這裡的指令行參數數量和指令行參數字元串指針數組。