1. 程式人生 > >詳解:實體地址,虛擬地址,記憶體管理,邏輯地址之間的關係

詳解:實體地址,虛擬地址,記憶體管理,邏輯地址之間的關係

實體地址:

這裡說的實體地址是記憶體中的記憶體單元實際地址,不是外部匯流排連線的其他電子元件的地址!

實體地址屬於比較好理解的,實體地址就是記憶體中每個記憶體單元的編號,這個編號是順序排好的,實體地址的大小決定了記憶體中有多少個記憶體單元,實體地址的大小由地址匯流排的位寬決定!

虛擬地址:

虛擬地址是CPU保護模式下的一個概念,保護模式是80286系列和之後的x86相容CPU操作模式,在CPU引導完作業系統核心後,作業系統核心會進入一種CPU保護模式,也叫虛擬記憶體管理,在這之後的程式在執行時都處於虛擬記憶體當中,虛擬記憶體裡的所有地址都是不直接的,所以你有時候可以看到一個虛擬地址對應不同的實體地址,比如A程序裡的call函式入口虛擬地址是0x001,而B也是,但是它倆對應的實體地址卻是不同的,作業系統採用這種記憶體管理方法

1.      是防止程式對實體地址寫資料造成一些不可必要的問題,比如知道了A程序的實體地址,那麼向這個地址寫入資料就會造成A程序出現問題,在虛擬記憶體中執行程式永遠不知道自己處於記憶體中那一段的實體地址上!

現在作業系統執行在保護模式下即便知道其他程序的實體地址也不允許向其寫入!但是可以通過作業系統留下的後門函式獲取該程序上的虛擬地址空間所有控制權限並寫入指定資料,詳細會在反彙編程式設計中教給大家!

2.      虛擬記憶體管理採用一種拆東牆補西牆的形式,所以虛擬記憶體的記憶體會比實體記憶體要大許多。

在進入虛擬模式之前CPU以及Bootloader(BootLoader是在作業系統核心執行之前執行。可以初始化硬體裝置、建立記憶體空間對映圖,從而將系統的軟硬體環境帶到一個合適狀態,以便為最終呼叫

作業系統核心準備好正確的環境),作業系統核心均執行在真實模式下,直接對實體地址進行操作!

虛擬記憶體中也有分頁管理,這種管理方法是為了確保記憶體中不會出現記憶體碎片,當作業系統核心初始化完畢記憶體中的分頁表後CPU的分頁標誌位會被設定,這個分頁標誌位是給MMU看的!

分頁管理:

記憶體分頁其實就是我們所說的4G空間,記憶體的所有記憶體被作業系統核心以4G為每頁劃分開,當我們程式執行時會被載入到記憶體中的4G空間裡,其實說是有4G其實並沒有真正在的4G空間,4G空間中有一小部分被對映到了實體記憶體中,或者被對映到了硬碟的檔案上(fopen),或者沒有被對映,還有一部分在記憶體當中就會被劃分棧,堆,其中有大片大片的記憶體是沒有被對映的,同樣實體記憶體也是被分頁了用來與虛擬記憶體產生對映關係!

其實真正情況下只有3G使用者空間,假如你的記憶體是4G的那麼其中有1G是給作業系統核心使用的,所謂的4G空間只是作業系統基於虛擬記憶體這種拆東牆補西牆的形式給你一種感覺每個程序都有4G的可用空間一樣!

這裡來說一下拆東牆補西牆,當我們程式被載入進4G空間時其實根本用不了所謂的4G空間,其中有大片記憶體被閒置,那麼這個時候呢,其他程式被載入進來時發現記憶體不夠了,就把其他程式裡的4G空間裡閒置部分拿出來給這個程序用,換之這個程序記憶體不夠時就會把其他程序裡閒置的空間拿過來給該程序使用。銀行也是如此!

當我們要對實體地址做操作時比如if語句要根據CPU的狀態標誌暫存器來做不同的跳轉,那麼這個時候就要對CPU額狀態暫存器做操作了就必須知道它的實體地址,記憶體中有一個電子元件叫MMU負責從作業系統已經初始化好的記憶體對映表裡查詢與虛擬地址對應的實體地址並轉換,比如mov 0x4h8這個是虛擬地址,當我們要對這個虛擬地址裡寫資料時那麼MMU會先判斷CPU的分頁狀態暫存器裡的標誌狀態是否被設定,如果被設定那麼MMU就會捕獲這個虛擬地址物理並在作業系統核心初始化好的記憶體對映表裡查詢與之對應的實體地址,並將其轉換成真正的實際實體地址,然後在對這個實際的實體地址給CPU,在由CPU去執行對應的命令,相反CPU往記憶體裡讀資料時比如A程序要讀取記憶體中某個虛擬地址的資料,A程序裡的指令給的是虛擬地址,MMU首先會檢查CPU的分頁狀態暫存器標誌位是否被設定,如果被設定MMU會捕獲這個虛擬地址並將其轉換成相應的實體地址然後提交給CPU,在由CPU到記憶體中去取資料!

當我們記憶體中的容量不夠時CPU會從磁碟中分割記憶體出來給程式用,當然磁碟分割出來的程式速度要慢許多,具體請檢視“深度理解指令集”這篇文章!

記憶體碎片,記憶體碎片分為兩種,一種是內部碎片和外部碎片!

內部碎片:

內部碎片是指在記憶體中已經被分配出去的記憶體,但是程序不使用這一塊記憶體,程序卻一直佔用著導致作業系統無法回收給其他程序使用,為了有效的防止這種空間上的浪費現象所以使用了記憶體分頁管理機制!

作業系統在記憶體中會維護一個記憶體資訊分頁表用於標示某段到某段為個頁面!

比如在記憶體中分配這樣的一個地址,當ID為1的記憶體不用了,但是該程序一直佔用著這段ID0-2的記憶體,所以如果此時分配一個長度為2位元組的記憶體空間,ID1的記憶體剛好足夠分配但是這段地址一直被該程序所佔用著,所以無法分配!

後來Intel工程師為了防止這種情況的出現用頁為單位的記憶體管理方式,有效的防止了這種記憶體碎片的情況發生!

這樣的話頁ID為1的地方為單獨的一個頁,當程序不使用時作業系統可以將該頁記憶體分配給其他程序所使用!

但是這種分頁記憶體往往也會出現一些記憶體碎片,比如分頁分到最後剩下一部分不足以分配給其他程序所使用的記憶體頁面也稱為內部碎片,只不過這種浪費比原本的浪費要節約許多!

外部碎片:

外部碎片是指還沒有被分配的記憶體空間,但是這些空間因為拆東牆補西牆的原因導致記憶體地址不連續,也無法分配給其他程序使用,或者地址連續但是卻因為容量太小無法分配給其他程序使用!

邏輯地址:

邏輯地址由兩部份組成,段識別符號和段內偏移量。段識別符號是由一個16位長的欄位組成,稱為段選擇符。其中前13位是一個索引號。後面3位包含一些硬體細節,如圖(轉載百度百科):


邏輯地址即程式中的段地址,比如說0x1到0x4為一個頁面,那麼0x1-0x4之間的段地址稱為邏輯地址,邏輯地址可以通過記憶體中的段數組裡尋找段選擇符+段偏移地址輕易得到實體地址。

一般作業系統需要維護兩個段描述表:GDT(全域性描述符表GDTGlobalDescriptor Table在整個系統中,全域性描述符表GDT只有一張(一個處理器對應一個GDT),GDT可以被放在記憶體的任何位置,但CPU必須知道GDT的入口,也就是基地址放在哪裡,Intel的設計者門提供了一個暫存器GDTR用來存放GDT的入口地址,程式設計師將GDT設定在記憶體中某個位置之後,可以通過LGDT指令將GDT的入口地址裝入此暫存器,從此以後,CPU就根據此暫存器中的內容作為GDT的入口來訪問GDT了。GDTR中存放的是GDT在記憶體中的基地址和其表長界限。),LDT(區域性描述符表可以有若干張,每個程序任務都有一張,LDT對應GDT裡的某段子描述符,可以把LDT理解成二級描述符,GDT為一級描述符,LDT的入口地址儲存在LDTR的暫存器裡)。

如圖所示:


GDT在記憶體中的地址和大小存放在CPUgdtr控制暫存器中,而LDT則在ldtr暫存器中。

什麼時候使用全域性和區域性的呢?這是由段描述符中的T1欄位表示的,=0,表示用GDT=1表示用LDT

區域性的表示程序自己的,僅程序自己可以使用,全域性的則表示作業系統等所有程序都可以使用!

如果不使用段偏移表示地址的話則稱為虛擬地址!

線性地址:

線性地址是邏輯地址到實體地址之間的一箇中間層變換,程式程式碼會產生邏輯地址,或者說是段中的偏移地址,加上相應段的基地址就生成了一個線性地址,邏輯地址是如何知道自己的段基的址?是通過區域性LDT段描述符獲取的。

如果啟用了分頁機制,那麼MMU記憶體管理單元會在記憶體對映表裡尋找與線性地址對應的實體地址。若沒有啟用分頁機制,那麼線性地址直接就是實體地址。Intel 80386的線性地址空間容量為4G(2的32次方即32根地址匯流排定址)。

總結:

1.虛擬地址是CPU保護模式下的一個概念,保護模式是80286系列和之後的x86相容CPU操作模式,在進入虛擬模式之前CPU以及Bootloader,作業系統核心均執行在真實模式下,直接對實體地址進行操作!

2.虛擬記憶體中也有分頁管理,這種管理方法是為了確保記憶體中不會出現記憶體碎片,當作業系統核心初始化完畢記憶體中的分頁表後CPU的分頁標誌位會被設定,這個分頁標誌位是給MMU看的!

3.虛擬記憶體採用一種拆東牆補西牆的形式讓每個程序都擁有3G使用者空間!

4.當記憶體中的容量不夠時會從磁碟中切割記憶體出來供程序使用!

5.內部碎片:

內部碎片是指在記憶體中已經被分配出去的記憶體,但是程序不使用這一塊記憶體,程序卻一直佔用著導致作業系統無法回收給其他程序使用!

6.外部碎片:

外部碎片是指還沒有被分配的記憶體空間,但是這些空間因為拆東牆補西牆的原因導致記憶體地址不連續,也無法分配給其他程序使用,或者地址連續但是卻因為容量太小無法分配給其他程序使用!

7.記憶體中有一個叫MMU(記憶體管理單元)的電子元件負責從作業系統已經初始化好的記憶體對映表裡查詢與虛擬地址對應的實體地址並轉換,

8.邏輯地址由兩部份組成,段識別符號和段內偏移量

邏輯地址即程式中的段地址,比如說0x1到0x4為一個頁面,那麼0x1-0x4之間的段地址稱為邏輯地址,邏輯地址可以通過記憶體中的段數組裡尋找段選擇符+段偏移地址輕易得到實體地址。

線性地址是邏輯地址到實體地址之間的一箇中間層變換,程式程式碼會產生邏輯地址,或者說是段中的偏移地址,加上相應段的基地址就生成了一個線性地址。


相關推薦

實體地址虛擬地址記憶體管理邏輯地址之間關係

實體地址:這裡說的實體地址是記憶體中的記憶體單元實際地址,不是外部匯流排連線的其他電子元件的地址!實體地址屬於比較好理解的,實體地址就是記憶體中每個記憶體單元的編號,這個編號是順序排好的,實體地址的大小決定了記憶體中有多少個記憶體單元,實體地址的大小由地址匯流排的位寬決定!虛

IP地址的分類及範圍A、B、C、D、E五類是如何劃分的?

網絡地址分類 IP地址分類 IP地址劃分 IP地址類型 IP地址範圍 IP地址的分類及範圍詳解:A、B、C、D、E五類是如何劃分的?最近在考證,有一項內容是網絡IP地址劃分的題目,一直從事IT的猛然發現回答這個問題時產生了懷疑,於是習慣百度了一下,發現網上廣泛流傳的有關IP地址劃分的文章居

UX術語幸運飛艇源碼下載任務流用戶流流程圖以及其它全新術語

希望 演示 重要 職位 flow 重新 生成 img 所有 用戶幸運飛艇源碼下載【大神源碼論壇】dsluntan.com 【布丁源碼論壇】budingbbs.com 企娥3393756370 體驗擁有一長串專業的術語和可交付內容。當在線查看UX相關職位描述時,所羅列的這類

#圖文從實際和理論出發帶你瞭解Java中的多執行緒

這裡並沒有講什麼新東西,只是把多執行緒一些知識來個總結。大家懂得可以複習複習,還有些童鞋對多執行緒朦朧的可以拿這個做為入門~ 舉個栗子說明啥是多執行緒:玩遊戲,前面一堆怪,每個怪都是一個執行緒,你射了一槍,子彈飛出去了,這顆子彈也是一個執行緒。你開啟你的程序管理,看到你遊戲的後臺程序,這就是程序

koa2+webpack4+React+pm2純手工架子搭建SSR專案入門教程以及流程指引手把手教你實現服務端首屏渲染SSR專案

本人全職喵姐,兼職程式設計師,才疏學淺,大神如果有好的idea能指點迷津的話感激不盡。以下專案為純手工搭建的Webpack4+React+KOA2+PM2前端豆腐渣工程,房子的簡陋模型,入門教程以及流程指引。後續要精裝修還是蓋茅草屋看你自己了……/微微笑(自帶表情包)……先學習…...

Kotlin第三章實戰

一,搭建開發環境 1,安裝Android Studio 3.0及以上版本 2,升級Gradle外掛版本至少為4.1 3,升級Kotlin外掛版本 4,工程配置 ①,配置工程build.gradle buildscript { ext.kotlin_version = '

Kotlin第一章基本語法

一,簡介 Kotlin是JetBrains開發的基於JVM的語言,Kotlin可以編譯成Java位元組碼,也可以編譯成JavaScript,方便在沒有JVM的裝置上執行。 特點:比Java更安全,能夠靜態檢測常見的陷阱。如:引用空指標。程式碼更易表現,書寫方便,便於閱讀

Android隱式啟動Activity匹配Actioncategorydata

關於Android隱式啟動Activity 隱式啟動Activity的intent到底發給哪個activity,需要進行三個匹配,一個是action,一個是category,一個是data,可以是全部或部分匹配 同樣適用於Service和BroadcastReceiver,下面是以Activity為例

01揹包的四種解法動態規劃貪心法回溯法優先佇列式分支限界法(C語言編寫)

最近剛完成了演算法課程設計,題目是用多種解法解決01揹包問題,經過一番探索,終於成功的用四種方法完成了本次實驗,下面記錄分享一下成果: 首先解釋下什麼是01揹包問題:給定一組共n個物品,每種物品都有自己的重量wi, i=1~n和價值vi, i=1~n,在限定的總重量(揹包的

c++類訪問許可權建構函式拷貝建構函式構函式

類的定義 類可以看做是一種資料型別,類這種資料型別是一個包含成員變數和成員函式的集合。類的成員變數和普通變數一樣,也有資料型別和名稱,佔用固定長度的記憶體。但是,在定義類的時候不能對成員變數賦值,因為類只是一種資料型別或者說是一種模板,本身不佔用記憶體空間,而變數的值則需要

二進位制世界上有10種人一種懂二進位制一種不懂。

  目錄 一、十進位制整數轉二進位制、八進位制、十六進位制 二、二進位制轉十進位制、八進位制、十六進位制 三、十進位制、八進位制、十六進位制轉二進位制 四、二進位制小數與十進位制小數 一、十進位制整數轉二進位制、八進位制、十六進位制 首先是一張 十進位制

GRUB2配置預設啟動項超時時間隱藏引導選單配置檔案圖形化配置

配置檔案詳解: /etc/default/grub # 設定預設啟動項,推薦使用數字 GRUB_DEFAULT=0 # 註釋掉下面這行將會顯示引導選單 #GRUB_HIDDEN_TIMEOUT=0 # 黑屏,並且不顯示GRUB_HIDDEN_TIMEOUT過程中的倒計

例項分割模型Mask R-CNN從R-CNNFast R-CNNFaster R-CNN再到Mask R-CNN

   Mask R-CNN是ICCV 2017的best paper,彰顯了機器學習計算機視覺領域在2017年的最新成果。在機器學習2017年的最新發展中,單任務的網路結構已經逐漸不再引人矚目,取而代之

IOS開發者賬號分類個人版公司版和企業版

iOS Developer Program 目前有三種: 個人版,公司版和企業版。 •$ 99 - 個人- 此計劃是為開發者能夠自由地創造iPhone / iPod Touch/ iPad的商業應用,並且能夠釋出他們的應用程式在App Store上。- 此計劃每年有100臺

修復nova的後端映象檔案掛ceph生成虛擬機器檔案變大1024倍(bug)

感謝朋友支援本部落格,歡迎共同探討交流,由於能力和時間有限,錯誤之處在所難免,歡迎指正! 如有轉載,請保留源作者部落格資訊。 如需交流,歡迎大家部落格留言。 前端介面生成虛擬機

串列埠引數波特率資料位停止位奇偶校驗位

簡介 串列埠是一種非常通用的裝置通訊的協議(不要與通用序列匯流排Universal Serial Bus(USB)混淆)。大多數計算機包含兩個基於RS232的串列埠。串列埠同時也是儀器儀表裝置通用的通訊協議;很多GPIB相容的裝置也帶有RS-232口。同時,串列埠通訊協

視訊編解碼學習變換量化與熵編碼

第6章 變換編碼1. 變換編碼變換編碼的目的去除空間訊號的相關性將空間訊號的能力集中到頻域的一小部分低頻係數上能量小的係數可通過量化去除,而不會嚴重影響重構影象的質量塊變換和全域性變換塊變換:離散餘弦變換(Discrete Cosine Transform,DCT),4x4,

最強Java併發程式設計知識點梳理BAT面試題等

本文原創,更多內容可以參考: Java 全棧知識體系。如需轉載請說明原處。 知識體系系統性梳理 Java 併發之基礎 A. Java進階 - Java 併發之基礎:首先全域性的瞭解併發的知識體系,同時瞭解併發理論基礎和執行緒基礎,併發關鍵字等,這些是你理解Java併發框架的基礎。@pdai Ja

CSRF 攻擊防禦Spring Security應用等

本文原創,更多內容可以參考: Java 全棧知識體系。如需轉載請說明原處。 CSRF(Cross-site request forgery跨站請求偽造,也被稱成為“one click attack”或者session riding,通常縮寫為CSRF或者XSRF,是一種對網站的惡意利用。 @pdai

圖文記憶體總是不夠我靠HBase說服了Leader為新專案保駕護航

​ ​ 大家好,我是小羽 最近在工作中用到了 Hbase 這個資料庫,也順便做了關於 Hbase 的知識記錄來分享給大家。其實 Hbase的內容體系真的很多很多,這裡介紹的是小羽認為在工作中會用到的一些技術點,希望可以幫助到大家。 可以這麼說網際網路都是建立在形形色色的資料庫之上的,現在主流的資料庫有這麼幾種