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

淺析Linux進程地址空間

這篇具有很好參考價值的文章主要介紹了淺析Linux進程地址空間。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

前言

現(xiàn)代處理器基本都支持虛擬內(nèi)存管理,在開啟虛存管理時,程序只能訪問到虛擬地址,處理器的內(nèi)存管理單元(MMU)會自動完成虛擬地址到物理地址的轉(zhuǎn)換。基于虛擬內(nèi)存機制,操作系統(tǒng)可以為每個運行中的進程創(chuàng)建獨享的虛擬地址空間,在這個空間中執(zhí)行的程序,無法感知系統(tǒng)中其它進程的存在,從而使得不同的進程在運行時可以互不干擾。

進程地址空間的大小

虛擬地址空間的最大長度與系統(tǒng)中實際可用的物理內(nèi)存數(shù)量無關(guān),而是取決于硬件平臺支持的尋址空間大小,即處理器的位數(shù)。32位處理器平臺下,支持的虛擬地址空間范圍為0x00000000~0xFFFFFFFF,總大小為2^32 字節(jié),即4GB;而在64位處理器平臺上,虛擬地址空間的范圍從0x0000000000000000擴展到了0xFFFFFFFFFFFFFFFF,總大小為2^64 字節(jié)。用戶進程通常無法直接訪問全部地址空間,操作系統(tǒng)會將一部分地址空間劃分給內(nèi)核程序,具體的劃分策略依賴于操作系統(tǒng)的實現(xiàn)。

進程地址空間的布局

下圖是在典型的32位和64位Linux操作系統(tǒng)上,運行時進程的地址空間布局:
淺析Linux進程地址空間,# 內(nèi)存管理,linux,服務(wù)器,運維

基于內(nèi)核的管理策略,進程虛擬地址空間并沒有全部分配給進程使用。Linux將進程地址空間劃分成兩個部分:位于高地址部分的內(nèi)核地址空間和位于低地址部分的用戶地址空間,其中

  • 內(nèi)核地址空間:內(nèi)核總是駐留在內(nèi)存中,是操作系統(tǒng)的一部分。內(nèi)核空間專為內(nèi)核保留,并且對于系統(tǒng)中所有的進程都是相同的。內(nèi)核空間只允許具備高特權(quán)級的內(nèi)核程序進行訪問;對于用戶程序,只能通過系統(tǒng)調(diào)用等方式陷入內(nèi)核空間中以訪問系統(tǒng)提供的資源;
  • 用戶地址空間:進程只能訪問用戶地址空間。用戶地址空間保存了用戶程序的運行指令和數(shù)據(jù)。內(nèi)核在創(chuàng)建進程時,會依據(jù)用戶可執(zhí)行文件中提供的信息在用戶空間中創(chuàng)建必要的區(qū)域,并為用戶進程維護環(huán)境變量、堆和棧等信息。對于系統(tǒng)中的每個進程,其用戶地址空間是彼此分離,完全隔絕的,進程只能訪問屬于自己的用戶地址空間部分的數(shù)據(jù)

用戶地址空間區(qū)域

由上圖可以看出,無論是32位系統(tǒng)或是64位系統(tǒng),進程用戶地址空間除了地址空間大小不同外,內(nèi)存布局基本相同,通常都包含以下幾個部分:

  • 當(dāng)前運行程序的二進制代碼,對應(yīng)于代碼段;
  • 存儲只讀數(shù)據(jù)和可讀寫數(shù)據(jù)的段,如常量和全局變量;
  • 用于動態(tài)分配內(nèi)存的堆;
  • 存儲局部變量以及實現(xiàn)過程調(diào)用的棧;
  • 保存命令行參數(shù)和環(huán)境變量的區(qū)域。

內(nèi)存映射區(qū)域

圖中有一個特殊的區(qū)域沒有畫出,就是內(nèi)存映射區(qū)域。內(nèi)存映射區(qū)域通常位于堆和棧之間,用于將磁盤中的內(nèi)容直接映射到內(nèi)存中進行訪問。Linux系統(tǒng)中的程序可以通過mmap系統(tǒng)調(diào)用來請求這種功能,相較于直接讀寫磁盤文件,內(nèi)存映射提供了一種更加高效的文件IO方式,典型的應(yīng)用場景就是動態(tài)庫的裝載。

進程地址空間訪問

盡管系統(tǒng)中每個進程都擁有巨大的虛擬地址空間,實際可使用的物理內(nèi)存確是有限的,因此內(nèi)核必須考慮如何合理地安排有限的物理地址到虛擬地址空間區(qū)域的映射。Linux內(nèi)核為每個進程維護了獨立的進程頁表,并管理著系統(tǒng)中所有的物理內(nèi)存,通過動態(tài)建立虛擬地址和物理地址的頁表映射,每個進程只會訪問所需要的那一部分物理內(nèi)存,從而實現(xiàn)了內(nèi)存的高效使用。下圖簡要顯示了進程虛擬地址空間中的地址到實際物理地址的轉(zhuǎn)換過程:
淺析Linux進程地址空間,# 內(nèi)存管理,linux,服務(wù)器,運維

缺頁異常

內(nèi)核遵循按需分配的原則,在進程實際需要某個虛擬內(nèi)存區(qū)域的數(shù)據(jù)之前,內(nèi)核不會為其建立虛擬內(nèi)存到物理內(nèi)存的頁面映射。若進程訪問的虛擬地址空間部分沒有與具體的物理頁幀建立關(guān)聯(lián),處理器會自動觸發(fā)缺頁異常,并調(diào)用內(nèi)核設(shè)置的缺頁異常處理函數(shù)進行處理。內(nèi)核缺頁異常處理函數(shù)會檢測觸發(fā)缺頁異常的虛擬地址合法性,并在通過后,為其分配物理頁幀和建立頁面映射關(guān)系,并返回重新執(zhí)行觸發(fā)異常的指令。

非法內(nèi)存訪問

完整的進程地址空間被劃分成了不同的區(qū)域,對于不同的區(qū)域,其設(shè)置的訪問權(quán)限也都不相同,這同時也就意味著,用戶程序在隨意訪問了某個內(nèi)存地址時,如內(nèi)核空間部分的部分,則可能觸發(fā)不可恢復(fù)的錯誤。典型的幾種訪問了非法地址的情況如下所示:文章來源地址http://www.zghlxwxcb.cn/news/detail-809366.html

  • 內(nèi)核空間區(qū)域:內(nèi)核空間區(qū)域?qū)?yīng)的頁表項,設(shè)置了高特權(quán)級訪問權(quán)限,對于運行在低特權(quán)級的用戶程序來說,是沒有資格訪問的;
  • 只讀權(quán)限區(qū)域:只讀權(quán)限的區(qū)域包含代碼段、只讀數(shù)據(jù)段以及其它被設(shè)置了只讀權(quán)限的區(qū)域,如果對這類區(qū)域進行寫操作,則會觸發(fā)異常;
  • 極低地址區(qū)域:大部分操作系統(tǒng)中,都不允許進程訪問極小的內(nèi)存地址,對應(yīng)于地址空間中保留未用的部分區(qū)域。也正因如此,C語言中NULL宏默認被定義成0,訪問NULL指針則會觸發(fā)空指針異常;
  • 未分配的區(qū)域:堆和棧之間的區(qū)域默認情況下,內(nèi)核沒有分配給進程使用。若用戶在沒有申請該段區(qū)域的情況下進行訪問,會導(dǎo)致錯誤。

相關(guān)參考

  • 《深入理解Linux內(nèi)核架構(gòu)》
  • 《程序員的自我修養(yǎng)—鏈接、裝載與庫》

到了這里,關(guān)于淺析Linux進程地址空間的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

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

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

相關(guān)文章

  • 【Linux】程序地址空間?進程地址空間

    【Linux】程序地址空間?進程地址空間

    了解進程的運行: ?運行結(jié)果:我們會發(fā)現(xiàn)這打印的結(jié)果亂七八糟,因為它也不知道什么時候該干什么 ?我們讓代碼睡眠1秒:打印的結(jié)果就正常了 ?以前我們學(xué)習(xí)的內(nèi)存管理(程序地址空間): ?為了驗證上面虛擬地址,我們運行下面代碼: (這種問題出現(xiàn)的原因在下面的為

    2024年02月13日
    瀏覽(21)
  • Linux: 進程地址空間究竟是什么?進程地址空間存在意義何在?

    Linux: 進程地址空間究竟是什么?進程地址空間存在意義何在?

    ?在C/C++中,我們常將內(nèi)存分為: 代碼區(qū)、常量區(qū)、全局區(qū)(靜態(tài)區(qū))、堆、棧 等等。相關(guān)內(nèi)存區(qū)域劃分如下:(X86, 32位平臺) 如何驗證C/C++中各區(qū)域的相對位置呢? ?我們可以在每個區(qū)域中選擇一個地址來驗證C/C++中各區(qū)域的相對位置??!具體如下: 【源代碼】: 【運行

    2024年04月08日
    瀏覽(26)
  • Linux之進程(四)(進程地址空間)

    Linux之進程(四)(進程地址空間)

    目錄 一、程序地址空間 二、進程地址空間 1、概念 2、寫時拷貝 3、為什么要有進程地址空間 四、總結(jié) 我們先來看看下面這張圖。這張圖是我們在學(xué)習(xí)語言時就見到過的內(nèi)存區(qū)域劃分圖。? 下面我們在Linux下看一看內(nèi)存區(qū)域是不是也是這么劃分的。 可見在Linux下也是符合上面

    2024年02月04日
    瀏覽(23)
  • 【Linux】進程>環(huán)境變量&&地址空間&&進程調(diào)度

    【Linux】進程>環(huán)境變量&&地址空間&&進程調(diào)度

    主頁: 醋溜馬桶圈-CSDN博客 專欄: Linux_醋溜馬桶圈的博客-CSDN博客 gitee :mnxcc (mnxcc) - Gitee.com 目錄 1.環(huán)境變量 1.1 基本概念 1.2 常見環(huán)境變量? 1.3 查看環(huán)境變量方法? 1.4?和環(huán)境變量相關(guān)的命令 1.5 環(huán)境變量的組織方式 1.6 通過代碼如何獲取環(huán)境變量 1.6.1 命令行第三個參數(shù) 1

    2024年04月15日
    瀏覽(28)
  • 【Linux】進程周邊006之進程地址空間

    【Linux】進程周邊006之進程地址空間

    ? ?? 樊梓慕: 個人主頁 ??? 個人專欄: 《C語言》 《數(shù)據(jù)結(jié)構(gòu)》 《藍橋杯試題》 《LeetCode刷題筆記》 《實訓(xùn)項目》 《C++》 《Linux》 ?? 每一個不曾起舞的日子,都是對生命的辜負 目錄 前言 1.程序地址空間 1.1驗證地址空間的排布 ?1.2利用fork函數(shù)觀察當(dāng)子進程修改某個共

    2024年02月04日
    瀏覽(43)
  • 【Linux】—— 進程地址空間

    【Linux】—— 進程地址空間

    序言: 在上篇中,我們講解了關(guān)于進程優(yōu)先級的概念。本期,我將給大家介紹的是關(guān)于進程地址空間的話題。 目錄 (一)程序地址空間回顧 (二)代碼演示 (三)進程地址空間的引入 總結(jié) 我們在學(xué)習(xí)C/C++語言的時候,大家可能都見過這樣的空間布局圖: 一個程序有哪些

    2024年02月15日
    瀏覽(25)
  • 【Linux】深挖進程地址空間

    【Linux】深挖進程地址空間

    作者簡介:?舊言~,目前大二,現(xiàn)在學(xué)習(xí)Java,c,c++,Python等 座右銘:松樹千年終是朽,槿花一日自為榮。 目標:熟悉【Linux】進程地址空間 毒雞湯:也許有一天,你發(fā)覺日子特別的艱難,那可能是這次的收獲特別的巨大。 望小伙伴們點贊??收藏?加關(guān)注喲????? ????

    2024年02月03日
    瀏覽(26)
  • 【Linux】理解進程地址空間

    【Linux】理解進程地址空間

    ?? 作者: 阿潤菜菜 ?? 專欄: Linux系統(tǒng)編程 ?我們在學(xué)習(xí)C語言的時候,都學(xué)過內(nèi)存區(qū)域的劃分如棧、堆、代碼區(qū)、數(shù)據(jù)區(qū)這些。但我們其實并不真正理解內(nèi)存 — 我們之前一直說的內(nèi)存是物理上的內(nèi)存嗎? 我們先看一段測試代碼: 運行結(jié)果: 我們可以注意到子進程的變量

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

    Linux--進程地址空間

    1.線程地址空間 所謂進程地址空間(process address space),就是從進程的視角看到的地址空間,是進程運行時所用到的虛擬地址的集合。 簡單地說,進程就是內(nèi)核數(shù)據(jù)結(jié)構(gòu)和代碼和本身的代碼和數(shù)據(jù),進程本身不能訪問物理地址,之時候就需要有一個中間媒介,就是地址空間,

    2024年02月11日
    瀏覽(21)
  • Linux:進程地址空間

    Linux:進程地址空間

    目錄 1.程序地址空間? 2.進程地址空間 我們在講C/C++語言的時候,32位平臺下,我們見過這樣的空間布局圖 我們來驗證一下這張圖的正確性: 運行結(jié)果: 通過觀察靜態(tài)變量的位置,可以認為靜態(tài)變量就是全局變量,只是靜態(tài)變量只初始化一次,有作用域的限制。 這里棧區(qū)還

    2024年02月04日
    瀏覽(28)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

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

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包