程式裝載面臨的挑戰
可執行程式載入後占用的記憶體空間應該是連續的。(寫好的**變成了指令之後,是一條一條順序執行的就可以了)
不能讓程式自己規定在記憶體中載入的位置,因為可能你想要的記憶體位址已經被其他載入了的程式占用了。
虛擬記憶體位址:指令裡用到的記憶體位址
物理記憶體位址:實際在記憶體硬體裡面的空間位址
分段:找出一段連續的物理記憶體和虛擬記憶體位址進行對映的方法
分段缺點:會有記憶體碎片
1gb的記憶體。我們先啟動乙個圖形渲染程式,占用了512mb的記憶體,接著啟動乙個chrome瀏覽器,占用了128mb記憶體,再啟動乙個python程式,占用了256mb記憶體。這個時候,我們關掉chrome,於是空閒記憶體還有1024 - 512 - 256 = 256mb。按理來說,我們有足夠的空間再去裝載乙個200mb的程式。但是,這256mb的記憶體空間不是連續的,而是被分成了兩段128mb的記憶體。因此,實際情況是,我們的程式沒辦法載入進來。
解決有記憶體碎片方法:記憶體分頁
當需要進行記憶體交換的時候,讓需要交換寫入或者從磁碟裝載的資料更少一點
記憶體分頁:把整個物理記憶體空間切成一段段固定尺寸的大小
頁:連續並且尺寸固定的記憶體空間
有了頁,任何程式都不需要一次性載入完所有指令和資料,只需要載入當前需要用到就行了。
記憶體分頁的另乙個好處:使得我們可以執行那些遠大於我們實際物理記憶體的程式。這樣一來,任何程式都不需要一次性載入完所有指令和資料,只需要載入當前需要用到就行了。
Linux下ELF可執行檔案裝載與執行
1 建立子程序 核心建立task struct資料結構,繼承父程序的虛擬位址空間 virtual memory space,vms 2 呼叫execve 系統呼叫執行指定的elf檔案 1 呼叫核心態函式sys execve 動態申請乙個linux binprm資料結構,並用elf可執行檔案的資料填充...
可執行檔案裝載與程序 動態鏈結
我們知道,可執行檔案只有裝載到記憶體以後才能被cpu執行。要了解裝載的過程,就必須先了解程序的虛擬位址空間的概念。一,程序虛擬位址空間的概念 1,程序和程式的區別 程式是靜態的概念,是未裝入記憶體的 程序是動態的概念,有時候也叫它 runtime 是已經裝入記憶體並且跑了起來的。2,程序虛擬位址空間...
可執行檔案及linux程序記憶體
通過編譯器編譯為可執行檔案,linux下執行檔案的格式為elf。linux下物理記憶體通過mmu管理對映到程序的虛擬記憶體中,虛擬記憶體的分布 2.data段 資料段,初始化的全域性變數和static變數。為何還產生bss段,為了可執行程式更加的小。3.bss 未初始化的全域性變數和static變數...