1. 程式人生 > >作業系統原理:程序地址空間

作業系統原理:程序地址空間

Linux程序虛擬儲存

先回憶一下ELF檔案的組織結構,可以看這篇文章:Linux 連結與ELF檔案。程式執行後進程地址空間佈局則和作業系統密切相關。在將應用程式載入到記憶體空間執行時,作業系統負責程式碼段與資料段的載入,並在記憶體中為這些段分配空間。Linux的程序地址空間大致如下:

process

Linux核心虛擬儲存

核心虛擬儲存器包含了核心的程式碼和資料結構。核心虛擬儲存器的一些區域被對映到所有程序共享的記憶體頁面,比如每個程序共享核心的程式碼和全域性資料結構。Linux也將一組連續的虛擬頁面(大小等於同種DRAM的總量)對映到相應的一組連續的物理頁面。這使得核心可以遍歷的訪問物理儲存的任何特定位置。核心虛擬地址儲存器的其他區域包含了每個程序都不同的資料,如頁表、核心在程序上下文執行時所使用的棧,以及記錄虛擬地址空間當前組織的各種資料結構。
vm

Linux缺頁異常處理

當MMU翻譯某個虛擬地址A觸發缺頁時,此異常會導致控制轉移到核心缺頁處理程式:

  1. 虛擬地址不合法。缺頁處理程式搜尋程序區域結構連結串列,把A和每個區域的vm_start和vm_end比較,不合法,觸發段錯誤,kill程序。
  2. 訪問不合法。主要看程序是否有讀寫或執行這個區域內頁面的許可權,不合法則觸發保護異常,Linux也會報段錯誤,終止程序。
  3. 正常缺頁。核心判斷地址和訪問都是合法的,那麼選擇犧牲一個頁面,如果被修改過交換出去,換入新頁面更新頁表。

如下圖:
page fault

Linux虛擬儲存組織

通過下面的圖可以一看一下Linux核心資料結構組織一個程序虛擬地址空間的方式。核心為系統中每個程序維護了一個單獨的任務結構task_struct

, 結構中包含了核心執行該程序的所有資訊。
task struct

Linux程序地址空間

棧 (stack)

函式呼叫藉助的就是棧。Linux中ulimit -s命令可檢視和設定棧最大值,調高棧容量可能會增加記憶體開銷和啟動時間。

記憶體對映段 (mmmap)

核心將硬碟檔案的內容直接對映到記憶體,藉助Linux的mmap()系統呼叫。這裡也用來對映ELF檔案用到的動態連結庫。

堆 (heap)

分配的堆記憶體是經過位元組對齊的空間,以適合原子操作。堆管理器通過連結串列管理每個申請的記憶體,由於堆申請和釋放是無序的,最終會產生記憶體碎片。

堆的末端由break指標標識,當堆管理器需要更多記憶體時,可通過系統呼叫brk()和sbrk()來移動break指標以擴張堆,一般由系統自動呼叫。

資料段 (bss + data)

主要用來放全域性變數和靜態區域性變數,地址編譯期確定。

程式碼段 (text)

放的函式指令,地址編譯期確定。

更多有意思的細節可以看後面參考文獻。

Reference

相關推薦

作業系統原理程序地址空間

Linux程序虛擬儲存 先回憶一下ELF檔案的組織結構,可以看這篇文章:Linux 連結與ELF檔案。程式執行後進程地址空間佈局則和作業系統密切相關。在將應用程式載入到記憶體空間執行時,作業系統負責程式碼段與資料段的載入,並在記憶體中為這些段分配空間。Linu

Linux程序地址空間 程序記憶體佈局

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

c++ 編譯連結執行原理及虛擬地址空間佈局

當我們寫好.c/.cpp檔案時 此時檔案還不能執行 因為他要經過以下的四步才可以執行   .c/.cpp(生成.i)     編譯(生成.s)      彙編(生成.o)  &nbs

Linux程序地址空間 && 程序記憶體佈局

轉載自:https://blog.csdn.net/yusiguyuan/article/details/45155035   一 程序空間分佈概述       對於一個程序,其空間分佈如下圖所示:      

程序地址空間佈局

建立一個程序時,作業系統會為該程序分配一個 4GB 大小的程序地址空間,本文具體講的是程序地址空間的各個部分: 棧: 存放程式臨時建立的區域性變數,也就是程式碼塊之內或者函式之內的變數,但不包括sta

Linux系統程式設計——淺談程序地址空間與虛擬儲存空間

早期的記憶體分配機制 在早期的計算機中,要執行一個程式,會把這些程式全都裝入記憶體,程式都是直接執行在記憶體上的,也就是說程式中訪問的記憶體地址都是實際的實體記憶體地址。當計算機同時執行多個程式時,必須保證這些程式用到的記憶體總量要小於計算機實際實體記憶體的大小。 那當程式同時執行

深入理解 Linux 核心---程序地址空間

講述: 程序是怎樣看待動態記憶體的。 程序空間的基本組成。 缺頁異常處理程式在推遲給程序分配頁框中所起的作用。 核心怎樣建立和刪除程序的整個地址空間。 與程序的地址空間管理有關的 API 和系統呼叫。 程序的地址空間 程序的地址空間由允許程序使用的全部線性地址組成。 每個程序看到

15---程序地址空間

什麼是程序地址空間? 系統中每個使用者空間程序所看到的記憶體 程序地址空間有什麼特點? 核心允許程序使用虛擬記憶體 系統中所有程序之間以虛擬方式共享記憶體 對一個程序而言,它好像可以訪問系統中所有的實體記憶體,它擁有的地址空間可以遠大於系統實體記憶體 每個程序擁有

《Linux核心設計與實現》讀書筆記(十五)- 程序地址空間(kernel 2.6.32.60)

程序地址空間也就是每個程序所使用的記憶體,核心對程序地址空間的管理,也就是對使用者態程式的記憶體管理。 主要內容: 地址空間(mm_struct) 虛擬記憶體區域(VMA) 地址空間和頁表 1. 地址空間(mm_struct) 地址空間就是每個程序所能訪問的記憶體地址範圍。 這個地址

淺談程序地址空間與虛擬儲存空間

早期的記憶體分配機制 在早期的計算機中,要執行一個程式,會把這些程式全都裝入記憶體,程式都是直接執行在記憶體上的,也就是說程式中訪問的記憶體地址都是實際的實體記憶體地址。當計算機同時執行多個程式時,必

作業系統原理動態記憶體分配

動態記憶體分配背後的機制深刻的體現了電腦科學中的這句名言: All problem in CS can be solved by another level of indirection. — Butler Lampson

作業系統實驗程序的建立

實驗名稱:程序的建立實驗一、實驗目的:1.      加深對程序概念的理解,明確程序和程式的區別。進一步認識併發執行的實質。2.      認識程序生成的過程,學會使用fork生成子程序,並知道如何使子程序完成與父程序不同的工作。二、實驗要求:1.  將下面的程式編譯執行,並

深入理解作業系統原理程序管理(一)

一、概述 1、為什麼引入程序 程式併發執行時具有如下特徵: 間斷性 程式在併發執行時,由於它們共享資源或為完成同一項任務而相互合作,使在併發程式之間形成了相互制約的關係。相互制約將導致併發程式具有“執行-暫停-執行”這種間斷性活動規律。 失去封閉性

Linux程序地址空間 && 程序記憶體佈局

一 程序空間分佈概述     對於一個程序,其空間分佈如下圖所示:                                       程式段(Text):程式程式碼在記憶體中的對映,存放函式體的二進位制程式碼。 初始化過的資料(Data):在程式執

程序地址空間與虛擬儲存空間區別

在進入正題前先來談談作業系統記憶體管理機制的發展歷程,瞭解這些有利於我們更好的理解目前作業系統的記憶體管理機制。 一 早期的記憶體分配機制 在 早期的計算機中,要執行一個程式,會把這些程式全都裝入記憶體,程式都是直接執行在記憶體上的,也就是說程式中訪問的記憶體地址都是實際的

程序地址空間 get_unmmapped_area()

程序地址空間 get_unmapped_area() 在向資料結構插入新的記憶體區域之前,核心必須確認虛擬地址空間中有足夠的空閒空間,可用於給定長度的區域。該工作由get_unmmaped_area()完成。 在分析get_unmmaped_area()之前

如何獲得當前執行模組在程序地址空間的位置

(w)WinMain的hInstanceExe引數實際值是一個記憶體基地址;系統將可執行檔案的映像載入到程序地址空間中的這個位置。例如,系統開啟可執行檔案,並將它載入到地址0x00400000,則(w)WinMain的hInstanceExe引數值為0x00400000.

Linux程序地址空間的理解

對於Linux的虛擬記憶體的理解,這個例子算是一個很好的引導了,原文連結:http://blog.chinaunix.net/xmlrpc.php?r=blog/article&uid=26683523&id=3201345 《Linux核心設計與實現》15

程序地址空間分佈

轉載請註明出處:http://blog.csdn.net/wangxiaolong_china 對於一個程序,其空間分佈如下圖所示: C程式一般分為: 1.程式段:程式段為程式程式碼在記憶體中的對映.一個程式可以在記憶體中多有個副本. 2.初始化過的資料:

Windows運用AVL樹對程序地址空間的管理

32位Windows系統中,程序在使用者態可用的地址空間範圍是低2G(x64下是低8192G)。隨著程序不斷的申請和釋放記憶體,這個2G的地址空間,有的地址範圍是保留狀態(reserved),有的地址範圍是提交狀態(對映到了物理頁面,committed),有的地址範圍是空閒