Linux進(jìn)程概念4程序地址空間-創(chuàng)新互聯(lián)

一. 程序地址空間

此時(shí)我們的研究是在kernel 2.6.32和32位平臺(tái)進(jìn)行說明

成都創(chuàng)新互聯(lián)成立與2013年,是專業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計(jì)網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元克什克騰做網(wǎng)站,已為上家服務(wù),為克什克騰各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:189820811081. 程序地址空間圖

我們?cè)趯W(xué)習(xí)C/C++時(shí)候,應(yīng)該學(xué)習(xí)過內(nèi)存布局,以及了解各種變量的存儲(chǔ)位置,例如局部變量存儲(chǔ)在棧區(qū),動(dòng)態(tài)申請(qǐng)的內(nèi)容在堆區(qū),全局變量,常量等在數(shù)據(jù)常量區(qū),如果用一張圖來表示,如下:
在這里插入圖片描述
已初始化區(qū)和未初始化區(qū)指全局變量

我們可以用代碼來進(jìn)行驗(yàn)證一下

#include#includeint g_unval;
int g_val = 100;
int main(int argc,char* argv[],char* env[])
{printf("代碼區(qū)地址          :  %p\n",main);
    const char* p = "hello world!";
    printf("字符常量區(qū)地址      :  %p\n",p);
    printf("已初始化全局區(qū)地址  :  %p\n",&g_val);
    printf("未初始化全局區(qū)地址  :  %p\n",&g_unval);
    char* q0 = (char*)malloc(10);
    char* q1 = (char*)malloc(10);
    char* q2 = (char*)malloc(10);
    char* q3 = (char*)malloc(10);
    char* q4 = (char*)malloc(10);
    printf("堆區(qū)地址            :  %p\n",q0);
    printf("堆區(qū)地址            :  %p\n",q1);
    printf("堆區(qū)地址            :  %p\n",q2);
    printf("堆區(qū)地址            :  %p\n",q3);
    printf("堆區(qū)地址            :  %p\n",q4);
    printf("棧區(qū)地址            :  %p\n",&q0);
    printf("棧區(qū)地址            :  %p\n",&q1);
    printf("棧區(qū)地址            :  %p\n",&q2);
    printf("棧區(qū)地址            :  %p\n",&q3);
    printf("棧區(qū)地址            :  %p\n",&q4);
    printf("第一個(gè)命令行地址    :  %p\n",argv[0]);
    printf("最后一個(gè)命令行地址  :  %p\n",argv[argc-1]);
    printf("環(huán)境變量地址        :  %p\n",env[0]);
    return 0;
}

根據(jù)運(yùn)行結(jié)果,發(fā)現(xiàn)從代碼區(qū)開始到環(huán)境變量區(qū),按照地址類型都是逐漸增大的,堆區(qū)向上生長(zhǎng),地址增大。棧區(qū)向下生長(zhǎng),地址減小
在這里插入圖片描述

那么該程序地址空間圖就是我們的內(nèi)存空間嗎,不是,我們可以證明以下:

當(dāng)我們用fork創(chuàng)建一個(gè)子進(jìn)程時(shí),在程序中設(shè)置一個(gè)全局變量val=100
當(dāng)我們分別用父子進(jìn)程訪問該全局變量時(shí),在子進(jìn)程中將該全局變量的值改為100
而我們?cè)儆酶高M(jìn)程打印時(shí),發(fā)現(xiàn)父進(jìn)程打印的值還為100
并且父子進(jìn)程打印該全局變量的地址都是一樣的

所以父子進(jìn)程訪問的地址,絕對(duì)被保存到了不同的物理內(nèi)存中

所以進(jìn)程地址空間是內(nèi)存嗎?

進(jìn)程地址空間不是內(nèi)存,由上一步可知,內(nèi)存中同一個(gè)地址的值,不可能被不同的進(jìn)程讀取,來表現(xiàn)出不同的值
所以進(jìn)程地址空間絕對(duì)不是物理內(nèi)存,我們?cè)谡Z言上打印出來的地址,其實(shí)都叫做“虛擬地址”。

**深入理解在這里插入圖片描述
父子進(jìn)程只能看到進(jìn)程地址空間的虛擬內(nèi)存
子進(jìn)程會(huì)拷貝一份父進(jìn)程的虛擬地址
也就是說:一個(gè)進(jìn)程對(duì)應(yīng)一份進(jìn)程地址空間。有多少個(gè)進(jìn)程就有多少個(gè)進(jìn)程地址空間。

由上圖可知,父子進(jìn)程雖然虛擬地址一樣,但其實(shí)子進(jìn)程修改其值后,它兩虛擬地址存儲(chǔ)在物理內(nèi)存中的地址將不一樣。所以他們虛擬地址相同,但物理內(nèi)存映射到不同地方

地址空間,是對(duì)物理內(nèi)存的一種虛擬化表示,虛擬空間最后一定要以某種方式轉(zhuǎn)化到物理內(nèi)存
二. 物理內(nèi)存

進(jìn)程=管理維護(hù)進(jìn)程的數(shù)據(jù)結(jié)構(gòu)+進(jìn)程代碼數(shù)據(jù)
所以物理內(nèi)存中存儲(chǔ)了進(jìn)程實(shí)際是存儲(chǔ)了管理維護(hù)進(jìn)程的數(shù)據(jù)結(jié)構(gòu)和進(jìn)程代碼數(shù)據(jù)

1.假設(shè)沒有虛擬地址空間

如果沒有地址空間,我們進(jìn)程訪問的地址都是物理地址
此時(shí)會(huì)有很多問題。如:

  • 一個(gè)進(jìn)程的數(shù)據(jù)存放的內(nèi)存位置是不連續(xù)的。訪問特別不方便
  • 增加了異常越界的概率。我們的指針容易寫壞別人的空間和數(shù)據(jù)

在這里插入圖片描述

頁表中存儲(chǔ)的是虛擬內(nèi)存到物理內(nèi)存的映射關(guān)系

盡管在內(nèi)存中val1,val2兩個(gè)不連續(xù),但在虛擬地址中申請(qǐng)的為連續(xù)空間,通過映射關(guān)系將其與內(nèi)存關(guān)聯(lián)。
這個(gè)映射、關(guān)聯(lián)由OS管理

這個(gè)時(shí)候從用戶管理內(nèi)存變?yōu)橛蒓S管理內(nèi)存,OS可以更好防止上面兩個(gè)問題

總:

  • 地址空間,通過虛擬內(nèi)存,將空間連續(xù)化處理了
  • 偽造的虛擬地址,可能并沒有在該表存在。OS會(huì)幫我們終止,就沒有寫入內(nèi)存
  • 在頁表中,一個(gè)數(shù)據(jù)會(huì)有讀寫兩個(gè)權(quán)限。
  • 頁表管理映射關(guān)系

為什么要存在虛擬地址空間?

1.地址空間,通過虛擬內(nèi)存,將空間連續(xù)化處理了
2.保護(hù)內(nèi)存

系統(tǒng)中存在多個(gè)地址空間,需要被管理起來

2. 進(jìn)程地址空間 什么是進(jìn)程地址空間

地址空間本質(zhì)是一個(gè)數(shù)據(jù)結(jié)構(gòu),用來描述進(jìn)程所占有資源的一張表

struct mm_struct{......
}

我們每創(chuàng)建一個(gè)進(jìn)程,便會(huì)創(chuàng)建一個(gè)mm_struct
在task_struct中有一部分空間指向進(jìn)程地址空間
所以O(shè)S在管理進(jìn)程時(shí),同時(shí)也要將mm_struct組織與管理起來

地址空間如何工作?
  • 地址空間展現(xiàn)給用戶的是一張?zhí)摂M地址表,當(dāng)進(jìn)程訪問虛擬內(nèi)存地址是,都需要通過頁表轉(zhuǎn)換去物理內(nèi)存中拿到對(duì)應(yīng)的數(shù)據(jù)和代碼
  • 申請(qǐng)空間的本質(zhì):向內(nèi)存索要空間,得到物理地址,然后在特定區(qū)域中申請(qǐng)沒有使用的虛擬地址,建立映射關(guān)系,返回虛擬地址即可
注:
  • 物理地址用戶都看不到,由OS管理
  • 用戶編寫的程序一般只映射到物理內(nèi)存地址中的用戶區(qū),他們之間映射關(guān)系的頁表,稱之為用戶級(jí)頁表。還有一部分?jǐn)?shù)據(jù)映射到物理內(nèi)存地址中的內(nèi)核中,我們稱之為內(nèi)核級(jí)頁表
  • 計(jì)算機(jī)中的硬件mmu(內(nèi)存管理單元),用于虛擬地址到物理地址的轉(zhuǎn)換,這個(gè)轉(zhuǎn)換不用跑CPU了,因該硬件幫做,提高效率

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

當(dāng)前文章:Linux進(jìn)程概念4程序地址空間-創(chuàng)新互聯(lián)
文章地址:http://muchs.cn/article6/heoig.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供關(guān)鍵詞優(yōu)化網(wǎng)站營(yíng)銷、建站公司、外貿(mào)建站、ChatGPTApp設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

外貿(mào)網(wǎng)站建設(shè)