程序記憶體組織

2021-09-27 11:59:25 字數 1272 閱讀 1048

對32位作業系統而言,定址空間(或者叫線性位址空間)為4g(2的32次方),也就是說乙個程序的最大位址空間為4g。為了保證核心的安全,現在的作業系統一般都強制使用者程序不能直接操作核心。具體的實現方式基本都是由作業系統將虛擬位址空間劃分為兩部分,一部分為核心空間,另一部分為使用者空間。針對linux作業系統而言,最高的1g位元組(從虛擬位址0xc000 0000到0xffff ffff)由核心使用,稱為核心空間。而較低的3g位元組(從虛擬位址0x0000 0000到0xbfff ffff)由各個程序使用,稱為使用者空間。

在高階語言中,面對的是變數、函式、表示式和語句等語言元素,而在程序的記憶體空間中,所有的高階語言資訊都轉化成二進位制形式。

使用者空間:

在32位的linux系統中,程序擁有4gb的線性空間。其中高1gb的位址空間分配給作業系統的核心,剩餘的3g位址空間稱為使用者空間,用於存放程序的使用者級**和資料。在使用者空間中,最關鍵的部分為**段、資料段、堆和棧。

**段:

**段是用來存放可執行檔案的操作指令,是可執行程式在記憶體中的映象。**段需要防止在執行時被非法修改,所以只准許讀取操作,而不允許寫入修改操作。**段通常是指用來存放程式執行**的一塊記憶體區域。**段(.text)儲存程序的二進位制**,其中cpu的程式計數器pc指標就是指向**段區的某條指令的起始位址。程式執行時,pc指標在**段內移動。

資料段:

資料段用來存放可執行檔案中已初始化的全域性變數,即存放程式靜態分配的變數和全域性變數,資料段(.data)儲存程序的靜態資料,比如全域性變數、常量字串等。

程序空間中的堆:

堆是用於存放程序執行中被動態分配的記憶體段,大小不固定,可動態擴張或收縮。儲存程式執行時狀態分配的資料所在的位址空間。c語言的malloc和free操作的記憶體便是堆的記憶體。當堆空間不足時,作業系統會自動增加堆的大小,堆的位址空間是向高位址方向增長的(它不是資料結構中的意義上的堆)。堆的記憶體空間是由程式申請的,並由程式負責釋放。

程序空間中的棧:

棧又稱堆疊,棧是使用者存方程式臨時建立的區域性變數,也就是括弧"{}"中定義的變數,不包括static宣告的變數。程序空間的棧由作業系統分配,記憶體的申請與**都由os管理。棧是使用者和資料結構理論的棧原理相似,滿足先進後出的原則。cpu的棧指標暫存器esp總是指向棧頂位置。當資料入棧時,esp減小,但資料出棧時,esp增加。

Linux0 11核心 記憶體組織和程序結構

程序結構 linux0.11中的每個程序都有如下的結構 在gdt中占有兩項,一項是tss段描述符,一項是ldt段描述符。在task陣列中占有一項,指向一頁物理記憶體,該物理記憶體低端是程序控制塊task struct 裡面包括tss段和ldt段 其餘部分是程序的核心態堆疊。在頁目錄表和頁表中設定有相...

Linux0 11核心 記憶體組織和程序結構

程序結構 linux0.11中的每個程序都有如下的結構 在gdt中占有兩項,一項是tss段描述符,一項是ldt段描述符。在task陣列中占有一項,指向一頁物理記憶體,該物理記憶體低端是程序控制塊task struct 裡面包括tss段和ldt段 其餘部分是程序的核心態堆疊。在頁目錄表和頁表中設定有相...

Linux0 11核心 記憶體組織和程序結構

程序結構 linux0.11中的每個程序都有如下的結構 在gdt中占有兩項,一項是tss段描述符,一項是ldt段描述符。在task陣列中占有一項,指向一頁物理記憶體,該物理記憶體低端是程序控制塊task struct 裡面包括tss段和ldt段 其餘部分是程序的核心態堆疊。在頁目錄表和頁表中設定有相...