国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

【Linux】虛擬地址空間

這篇具有很好參考價(jià)值的文章主要介紹了【Linux】虛擬地址空間。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。


一、引入

對(duì)于C/C++程序,我們眼中的內(nèi)存是這樣的:
【Linux】虛擬地址空間

我們利用這種對(duì)于與內(nèi)存的理解看一下下面這段代碼:

【Linux】虛擬地址空間

運(yùn)行結(jié)果:

【Linux】虛擬地址空間

觀察父子進(jìn)程中 val 變量的值,以及 val 的地址,我們發(fā)現(xiàn)父子進(jìn)程中 val 的地址都是同一個(gè)地址 但是 val 的值并不相同,這是什么意思????jī)?nèi)存中同一個(gè)地址卻存放了兩個(gè)不同的變量值?這顯然是不可能的!地址具有唯一性,地址處存放的數(shù)據(jù)也具有唯一性!

一種合理的解釋是:我們?cè)贑程序中所用到的地址的一個(gè)虛擬地址,并不是真正的物理內(nèi)存地址!

在C/C++程序中我們所使用到的地址都是虛擬地址,這些虛擬地址組合起來(lái)就形成了虛擬地址空間,在Linux中虛擬地址空間被一個(gè)叫struct mm_struct的結(jié)構(gòu)體所管理。

那么我們想知道這個(gè)程序的虛擬地址空間到底虛擬了多大的內(nèi)存呢?
答案是:每個(gè)進(jìn)程所能訪問(wèn)的最大的虛擬地址空間由計(jì)算機(jī)的硬件平臺(tái)決定,具體地說(shuō)是由 CPU 的位數(shù)決定的。

比如 32 位的 CPU 決定了虛擬地址空間的大小為 [ 0 , 2 32 ? 1 ] [0 ,2^{32}-1] [0232?1],即 0x00000000 - 0xFFFFFFFF,也就是我們常說(shuō)的 4 GB 虛擬內(nèi)存空間。如果是 64 位的CPU,那么尋址范圍是 [ 0 , 2 64 ? 1 ] [0 ,2^{64}-1] [0,264?1],即 0x0000000000000000 - 0xFFFFFFFFFFFFFFFF,共有 17 179 864 184 GB。

【Linux】虛擬地址空間

所以開(kāi)頭我們看到的內(nèi)存其實(shí)是操作系統(tǒng)為我們程序虛擬的虛擬地址空間,這個(gè)虛擬地址空間的分配如下:

【Linux】虛擬地址空間

二、虛擬地址與物理內(nèi)存的聯(lián)系

經(jīng)過(guò)上面的介紹我們知道了原來(lái)我們認(rèn)為內(nèi)存其實(shí)是虛擬地址空間,但是我們的代碼與數(shù)據(jù)是要真真實(shí)實(shí)的存儲(chǔ)在物理內(nèi)存中,虛擬地址空間里面存放的僅僅是一些代碼和數(shù)據(jù)的虛擬地址,那么我們是怎么通過(guò)虛擬地址來(lái)找到物理內(nèi)存中的代碼與數(shù)據(jù)呢?

答案是:通過(guò)一種數(shù)據(jù)結(jié)構(gòu)——頁(yè)表和一種硬件——MMU(內(nèi)存管理單元),通過(guò)頁(yè)表來(lái)進(jìn)行虛擬地址與物理地址一 一對(duì)應(yīng)從而找到相應(yīng)的代碼與數(shù)據(jù)

【Linux】虛擬地址空間

明白了這些后我們?cè)賮?lái)看開(kāi)頭的問(wèn)題,為什么同一個(gè)地址存放的是不同的數(shù)據(jù)?

【Linux】虛擬地址空間
在父進(jìn)程剛開(kāi)始創(chuàng)建子進(jìn)程時(shí),子進(jìn)程是的大多數(shù)數(shù)據(jù)(如:task_struct , 虛擬程地址空間等數(shù)據(jù))都是以父進(jìn)程為模板創(chuàng)建而來(lái)的,因此在最初時(shí)父進(jìn)程與子進(jìn)程的虛擬地址空間和頁(yè)表是相同的,然后父進(jìn)程嘗試去修改變量 val 的值,由于進(jìn)程具有獨(dú)立性,操作系統(tǒng)不能讓父進(jìn)程的修改影響到子進(jìn)程,于是發(fā)生了寫(xiě)時(shí)拷貝,操作系統(tǒng)先在物理內(nèi)存中重新找一塊空間保存了父進(jìn)程修改后的 val 值,然后將父進(jìn)程頁(yè)表中對(duì)應(yīng)物理地址進(jìn)行更改。

注意:虛擬地址不更改,只改變物理地址!因?yàn)槲锢淼刂穼?shí)實(shí)在在的變化了,虛擬地址沒(méi)有必要更改。

三、為什么要有虛擬地址空間

可能你會(huì)覺(jué)得為什么要有虛擬地址空間呢?我們的進(jìn)程為什么不直接使用物理地址呢?直接使用物理地址還能減少中間層提高運(yùn)行的效率。

要回答這個(gè)問(wèn)題我們可以從下面幾個(gè)的角度來(lái)回答:

  • 防止地址隨意訪問(wèn),保護(hù)物理內(nèi)存與其他進(jìn)程

如果我們沒(méi)有虛擬地址空間,當(dāng)我們?cè)趦?nèi)存中運(yùn)行兩個(gè)程序時(shí),如果其中在一個(gè)進(jìn)程中發(fā)生了越界訪問(wèn),那么就有可能訪問(wèn)到其他的進(jìn)程,這樣進(jìn)程之間就會(huì)互相影響了,進(jìn)程的獨(dú)立性就無(wú)法保證了
【Linux】虛擬地址空間
有了虛擬地址空間以后我們便可以通過(guò)頁(yè)表來(lái)進(jìn)行判斷越界后的地址與接下來(lái)的操作是否統(tǒng)一的,如果是統(tǒng)一的便進(jìn)行映射。

  • 將進(jìn)程管理和內(nèi)存管理進(jìn)行解耦合!
    這里我們先來(lái)談一談malloc的本質(zhì),malloc函數(shù)是在調(diào)用后向OS申請(qǐng)內(nèi)存,操作系統(tǒng)立馬給你,還是需要的時(shí)候在給你呢 ?
    答案是:在你需要的時(shí)候給你?。?!
    那么為什么會(huì)是這樣的呢?因?yàn)椴僮飨到y(tǒng)要管理好所有的軟硬件資源,OS一般不允許任何的浪費(fèi)或者不高效的行為出現(xiàn)!

    我們?cè)谏暾?qǐng)完內(nèi)存以后并不一定立馬使用,在你申請(qǐng)成功之后,和你使用之前,就以一段小小的時(shí)間窗口,這個(gè)空間沒(méi)有被正常使用,但是別人用不了,于是這塊空間就處于了閑置狀態(tài)! 這是OS不允許的!

    于是我們?cè)谟?code>malloc申請(qǐng)空間時(shí)OS其實(shí)是先通過(guò)task_struct找到虛擬地址空間和管理虛擬地址空間的mm_struct結(jié)構(gòu)體,然后對(duì)于虛擬地址空間的內(nèi)容進(jìn)行修改并將mm_struct里關(guān)于堆區(qū)的范圍進(jìn)行修改,然后頁(yè)表中關(guān)于虛擬地址的部分的內(nèi)容會(huì)進(jìn)行增加,但是新增的虛擬地址去沒(méi)有與實(shí)際的物理地址建立映射關(guān)系,只有當(dāng)你要使用你申請(qǐng)的空間時(shí),OS才會(huì)真正的為你分配空間,并將頁(yè)表中新增的虛擬地址對(duì)應(yīng)的物理地址的映射關(guān)系建立起來(lái)!這時(shí)OS才真正的完成了內(nèi)存分配!
    【Linux】虛擬地址空間

這個(gè)時(shí)候,我們將頁(yè)表從中間一分為二,左邊就是進(jìn)程管理,右邊就是內(nèi)存管理,進(jìn)程管理發(fā)生錯(cuò)誤不影響內(nèi)存管理,內(nèi)存管理出現(xiàn)錯(cuò)誤不影響進(jìn)程管理,這樣我們就實(shí)現(xiàn)了進(jìn)程與內(nèi)存管理的解耦合!

【Linux】虛擬地址空間

  • 可以讓進(jìn)程以統(tǒng)一的視角,看待自己的代碼和數(shù)據(jù)!
    在這里我們來(lái)討論一下我們的程序在被編譯的時(shí)候,沒(méi)有被加載到內(nèi)存,我們的程序內(nèi)部有沒(méi)有地址呢?
    答案是:有的!

    我們的C/C++程序在被編譯時(shí)就采用了虛擬地址空間的方式進(jìn)行編譯,并將數(shù)據(jù)按照代碼段,已初始化數(shù)據(jù)段,未初始化數(shù)據(jù)段等方式進(jìn)行分類存儲(chǔ)。當(dāng)我們的程序加載進(jìn)內(nèi)存時(shí),我們的程序可以分批式的將程序的數(shù)據(jù)段,代碼段,分批的加載進(jìn)地址空間中。
    注意:編譯好的程序并沒(méi)有堆區(qū)和棧區(qū),只有加載進(jìn)內(nèi)存時(shí)形成進(jìn)程時(shí)才有堆區(qū)與棧區(qū)!

有了地址空間之后我們的進(jìn)程便不再關(guān)心代碼與數(shù)據(jù)究竟在內(nèi)存中的哪里,我們每個(gè)進(jìn)程都是以統(tǒng)一的視角——虛擬地址空間的方式來(lái)待自己的代碼與數(shù)據(jù)。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-404697.html

到了這里,關(guān)于【Linux】虛擬地址空間的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 【Linux系統(tǒng)化學(xué)習(xí)】進(jìn)程地址空間 | 虛擬地址和物理地址的關(guān)系

    【Linux系統(tǒng)化學(xué)習(xí)】進(jìn)程地址空間 | 虛擬地址和物理地址的關(guān)系

    ========================================================================= 個(gè)人主頁(yè)點(diǎn)擊直達(dá): 小白不是程序媛 Linux專欄: Linux系統(tǒng)化學(xué)習(xí) 代碼倉(cāng)庫(kù): Gitee ========================================================================= 目錄 虛擬地址和物理地址 頁(yè)表 進(jìn)程地址空間 進(jìn)程地址空間存在的意義 我們?cè)趯W(xué)

    2024年02月05日
    瀏覽(25)
  • 【Linux-14】進(jìn)程地址空間&虛擬空間&頁(yè)表——原理&知識(shí)點(diǎn)詳解

    【Linux-14】進(jìn)程地址空間&虛擬空間&頁(yè)表——原理&知識(shí)點(diǎn)詳解

    前言 大家好吖,歡迎來(lái)到 YY 滴 系列 ,熱烈歡迎! 本章主要內(nèi)容面向接觸過(guò)Linux的老鐵 主要內(nèi)容含: 歡迎訂閱 YY 滴C++專欄!更多干貨持續(xù)更新!以下是傳送門(mén)! YY的《C++》專欄 YY的《C++11》專欄 YY的《Linux》專欄 YY的《數(shù)據(jù)結(jié)構(gòu)》專欄 YY的《C語(yǔ)言基礎(chǔ)》專欄 YY的《初學(xué)者易

    2024年04月29日
    瀏覽(31)
  • 【看表情包學(xué)Linux】進(jìn)程地址空間 | 區(qū)域和頁(yè)表 | 虛擬地址空間 | 初識(shí)寫(xiě)時(shí)拷貝

    【看表情包學(xué)Linux】進(jìn)程地址空間 | 區(qū)域和頁(yè)表 | 虛擬地址空間 | 初識(shí)寫(xiě)時(shí)拷貝

    ?? ??? 爆笑 教程 ????《看表情包學(xué)Linux》?? ? 猛戳訂閱 ? ? ?? ?? 寫(xiě)在前面: 本章核心主題為?\\\"進(jìn)程地址空間\\\",會(huì)通過(guò)驗(yàn)證 Linux 進(jìn)程的地址空間來(lái)開(kāi)頭,拋出 \\\"同一個(gè)值能有不同內(nèi)容\\\" 的現(xiàn)象,通過(guò)該現(xiàn)象去推導(dǎo)出 \\\"虛擬地址\\\" 的概念。然后帶著大家理解為什么虛擬地

    2024年01月20日
    瀏覽(19)
  • Linux內(nèi)核源碼分析 (B.2)虛擬地址空間布局架構(gòu)

    Linux內(nèi)核源碼分析 (B.2)虛擬地址空間布局架構(gòu)

    Linux內(nèi)核只是操作系統(tǒng)當(dāng)中的一部分,對(duì)下管理系統(tǒng)所有硬件設(shè)備,對(duì)上通過(guò)系統(tǒng)調(diào)用向 Library Routine 或其他應(yīng)用程序提供API接口。 內(nèi)存管理可以通過(guò)以下三個(gè)維度進(jìn)行介紹: 用戶空間 相當(dāng)于應(yīng)用程序使用 malloc() 申請(qǐng)內(nèi)存,通過(guò) free() 釋放內(nèi)存。 malloc() / free() 是 glibc 庫(kù)的內(nèi)

    2024年02月09日
    瀏覽(41)
  • [Linux]環(huán)境變量 進(jìn)程地址空間(虛擬內(nèi)存與物理內(nèi)存的關(guān)系)

    [Linux]環(huán)境變量 進(jìn)程地址空間(虛擬內(nèi)存與物理內(nèi)存的關(guān)系)

    hello,大家好,這里是bang_bang,今天我們來(lái)講一下語(yǔ)言層級(jí)上的程序地址空間和系統(tǒng)層級(jí)上的進(jìn)程地址空間的區(qū)別,在下面中我舉的例子會(huì)設(shè)計(jì)到環(huán)境變量,所以開(kāi)篇我先講講環(huán)境變量。 目錄 1??環(huán)境變量 ?? 基本概念 ??環(huán)境變量相關(guān)命令 ??查看環(huán)境變量echo ??添加全局環(huán)

    2024年02月15日
    瀏覽(38)
  • 【Linux】程序地址空間?進(jìn)程地址空間

    【Linux】程序地址空間?進(jìn)程地址空間

    了解進(jìn)程的運(yùn)行: ?運(yùn)行結(jié)果:我們會(huì)發(fā)現(xiàn)這打印的結(jié)果亂七八糟,因?yàn)樗膊恢朗裁磿r(shí)候該干什么 ?我們讓代碼睡眠1秒:打印的結(jié)果就正常了 ?以前我們學(xué)習(xí)的內(nèi)存管理(程序地址空間): ?為了驗(yàn)證上面虛擬地址,我們運(yùn)行下面代碼: (這種問(wèn)題出現(xiàn)的原因在下面的為

    2024年02月13日
    瀏覽(21)
  • 【Linux】程序地址空間

    【Linux】程序地址空間

    首先引入地址空間的作用 我們發(fā)現(xiàn),但我們子進(jìn)程修改全局變量g_val的時(shí)候,父進(jìn)程的g_val沒(méi)有受到影響,但是他們的地址都是一樣的,這是為什么呢? 由此我們知道,這里的地址絕對(duì)不是物理內(nèi)存的地址,而是虛擬地址(線性地址);并且?guī)缀跛姓Z(yǔ)言,如果有地址的概念

    2024年02月13日
    瀏覽(13)
  • Linux--程序地址空間

    Linux--程序地址空間

    ??北塵_ :個(gè)人主頁(yè) ??個(gè)人專欄 :《Linux操作系統(tǒng)》《經(jīng)典算法試題 》《C++》 《數(shù)據(jù)結(jié)構(gòu)與算法》 ??走在路上,不忘來(lái)時(shí)的初心 @[TOC](文章目錄) 我們?cè)谥vC語(yǔ)言的時(shí)候,老師給大家畫(huà)過(guò)這樣的空間布局圖 下圖是內(nèi)存嗎?答案不是,它是進(jìn)程/虛擬地址空間。 可是我們對(duì)他

    2024年02月03日
    瀏覽(14)
  • [Linux 進(jìn)程(五)] 程序地址空間深度剖析

    [Linux 進(jìn)程(五)] 程序地址空間深度剖析

    Linux學(xué)習(xí)路線比較線性,也比較長(zhǎng),因此一個(gè)完整的知識(shí)點(diǎn)學(xué)習(xí)就會(huì)分布在兩篇文章中,沒(méi)有連貫起來(lái),訂閱的朋友諒解一下,再次感謝訂閱! 上一篇文章最后講到了程序地址空間分布,大家可以先復(fù)習(xí)一下上一篇文章:程序地址空間的初認(rèn)識(shí) 本片我們深度學(xué)習(xí)一下程序地址

    2024年01月19日
    瀏覽(24)
  • [Linux 進(jìn)程(四)] 再談環(huán)境變量,程序地址空間初識(shí)

    [Linux 進(jìn)程(四)] 再談環(huán)境變量,程序地址空間初識(shí)

    上一篇我們講了環(huán)境變量,如果有不明白的先讀一下上一篇文章:環(huán)境變量講解 本篇文章我們繼續(xù)完善環(huán)境變量這章剩下的內(nèi)容,以及main函數(shù)第三個(gè)參數(shù)的詳解,進(jìn)程地址空間的初始。 看完上一篇文章的同學(xué),肯定知道了如何查看環(huán)境變量,命令行輸入 env: 我們查看一下

    2024年01月18日
    瀏覽(24)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包