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

一. 程序地址空間

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

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

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

我們可以用代碼來進(jì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("第一個命令行地址    :  %p\n",argv[0]);
    printf("最后一個命令行地址  :  %p\n",argv[argc-1]);
    printf("環(huán)境變量地址        :  %p\n",env[0]);
    return 0;
}

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

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

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

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

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

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

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

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

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

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

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

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

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

在這里插入圖片描述

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

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

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

總:

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

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

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

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

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

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

struct mm_struct{......
}

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

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

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

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

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

廣告

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

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