導航:首頁 > 物理學科 > 虛擬內存怎麼映射到物理內存

虛擬內存怎麼映射到物理內存

發布時間:2022-09-26 03:38:07

① Linux - 用戶態內存映射 和 內核態內存映射

操作系統的內存管理,主要分為三個方面。
第一,物理內存的管理,相當於會議室管理員管理會議室。
第二,虛擬地址的管理,也即在項目組的視角,會議室的虛擬地址應該如何組織。
第三,虛擬地址和物理地址如何映射,也即會議室管理員如果管理映射表。

那麼虛擬地址和物理地址如何映射呢?

每一個進程都有一個列表vm_area_struct,指向虛擬地址空間的不同的內存塊,這個變數的名字叫mmap。

其實內存映射不僅僅是物理內存和虛擬內存之間的映射,還包括將文件中的內容映射到虛擬內存空間。這個時候,訪問內存空間就能夠訪問到文件裡面的數據。而僅有物理內存和虛擬內存的映射,是一種特殊情況。

如果我們要申請小塊內存,就用brk。brk函數之前已經解析過了,這里就不多說了。如果申請一大塊內存,就要用mmap。對於堆的申請來講,mmap是映射內存空間到物理內存。

另外,如果一個進程想映射一個文件到自己的虛擬內存空間,也要通過mmap系統調用。這個時候mmap是映射內存空間到物理內存再到文件。可見mmap這個系統調用是核心,我們現在來看mmap這個系統調用。

用戶態的內存映射機制包含以下幾個部分。

物理內存根據NUMA架構分節點。每個節點裡面再分區域。每個區域裡面再分頁。

物理頁面通過夥伴系統進行分配。分配的物理頁面要變成虛擬地址讓上層可以訪問,kswapd可以根據物理頁面的使用情況對頁面進行換入換出。

對於內存的分配需求,可能來自內核態,也可能來自用戶態。

對於內核態,kmalloc在分配大內存的時候,以及vmalloc分配不連續物理頁的時候,直接使用夥伴系統,分配後轉換為虛擬地址,訪問的時候需要通過內核頁表進行映射。

對於kmem_cache以及kmalloc分配小內存,則使用slub分配器,將夥伴系統分配出來的大塊內存切成一小塊一小塊進行分配。

kmem_cache和kmalloc的部分不會被換出,因為用這兩個函數分配的內存多用於保持內核關鍵的數據結構。內核態中vmalloc分配的部分會被換出,因而當訪問的時候,發現不在,就會調用do_page_fault。

對於用戶態的內存分配,或者直接調用mmap系統調用分配,或者調用malloc。調用malloc的時候,如果分配小的內存,就用sys_brk系統調用;如果分配大的內存,還是用sys_mmap系統調用。正常情況下,用戶態的內存都是可以換出的,因而一旦發現內存中不存在,就會調用do_page_fault。

② 你真的了解虛擬內存和物理內存嗎

在文章開始之前,先說下閱讀本文後能學到的知識。

如果你已經掌握了這些知識,那麼就不用繼續閱讀了,如果這些知識你都不熟悉或者不太清楚的話,那就繼續閱讀,從文章中來獲取答案。

為什麼會出現虛擬內存呢?這就要從最初的操作系統來說起了,最初的操作系統並沒有現在那麼完善,剛開始的時候,程序是直接裝載到物理內存中的。這就導致了下面的一些問題:

先說問題1,為什麼會導致程序編寫困難呢?因為,操作系統是同時運行好多程序的,編寫的程序是直接操作物理內存的,編寫的時候就要考慮,自己的程序操作的內存地址,是否已經被其他程序佔用了,如果被佔用了的話,就要重新編寫程序,重新安排程序的操作地址。

再看問題2,因為是直接操作物理內存,這就意味著一個程序可以操作內存中的所有地址,如果有惡意程序修改了其他程序在用的地址中的數據,這就可能導致其他程序崩潰。

虛擬內存概念的出現就解決了上面的問題,虛擬內存的概念出現後,程序的編寫就不再直接操作物理內存了,對每個程序來說,它們就相當於擁有了所有的內存空間,可以隨意操作,就不用擔心自己操作的內存地址被其他程序佔用的問題了。同時,因為程序操作的是虛擬內存地址,這樣就不會出現因為修改了其他應用程序內存地址中的數據而導致其他應用程序崩潰的問題了。

這時,你可能會問,CPU都是操作物理內存的,這虛擬內存怎麼和物理內存對應呢?問題很好,下文會給你答案。

這里有必要說下物理內存和虛擬內存的概念,可能有的讀者分的不太清楚。

解讀一下這張圖,就是有1G虛擬內存是編寫的應用程序操作不到的,應用程序最多隻能操作3G的虛擬內存空間。

有計算機基礎的人應該都知道,計算機的CPU操作的是物理內存的地址,而現在編寫的程序操作的都是虛擬內存地址,那麼虛擬內存怎樣和物理內存對應起來的呢?這就涉及到一些操作系統的知識了,虛擬內存和物理內存都有分頁的概念,一般一頁是4096個位元組, 現在的操作系統虛擬地址和物理地址建立對應關系採用的是頁映射的方式

假設我們的32位機器有16 KB的內存,每個頁大小為 4096 位元組,則共有4個頁,

假設程序所有的指令和數據總和為32 KB,那麼程序總共被分為8個頁。我們將它們編號為P0~P7。很明顯,16 KB的內存無法同時將32 KB的程序裝入,那麼我們將按照動態裝入的原理來進行整個裝入過程。如果程序剛開始執行時的入口地址在P0,這時裝載管理器(我們假設裝載過程由一個叫裝載管理器的傢伙來控制,就像覆蓋管理器一樣)發現程序的P0不在內存中,於是將內存F0分配給P0,並且將P0的內容裝入F0;運行一段時間以後,程序需要用到P5,於是裝載管理器將P5裝入F1;就這樣,當程序用到P3和P6的時候,它們分別被裝入到了F2和F3,它們的映射關系如圖所示。

可能上面的內容你還意猶未盡,那就再來簡單的描述一下,Linux是怎樣裝載可執行程序的.首先,操作系統是會為一個可執行程序分配一個進程的,然後裝載相應的可執行文件並執行。當有虛擬內存存在的情況下,上面的過程就要做三件事:

首先是創建虛擬地址空間。創建一個虛擬空間實際上並不是創建空間而是創建映射函數所需要的相應的數據結構。

讀取可執行文件頭,並且建立虛擬空間與可執行文件的映射關系。為什麼要建立映射關系呢?因為, 當程序執行發生頁錯誤時,操作系統將從物理內存中分配一個物理頁,然後將該「缺頁」從磁碟中讀取到內存中,再設置缺頁的虛擬頁和物理頁的映射關系 ,這樣程序才得以正常運行。但是很明顯的一點是,當操作系統捕獲到缺頁錯誤時,它應知道程序當前所需要的頁在可執行文件中的哪一個位置。這就是虛擬空間與可執行文件之間的映射關系。

再來看第3步,其實仔細思考第三步是會發現一些問題的,這里的可執行文件的入口地址是虛擬內存地址,那麼就可能存在兩個可執行程序的虛擬入口地址相同的問題,這個問題怎麼解決呢?這時一個叫做「內存管理單元(Memory Management Unit)」簡稱「MMU」的硬體就誕生了,它的作用之一就是地址翻譯,將虛擬地址翻譯成物理地址,可以看下圖,加深理解

簡單總結一下這部分的內容,當操作系統裝載一個可執行程序時,會首先創建虛擬地址空間,這個地址空間實際上就是一個數據結構;然後建立可執行文件與虛擬地址的映射,映射的作用就是知道虛擬空間對應可執行文件的哪個位置;最後就是將CPU的指令寄存器設置成可執行文件的入口地址,開始執行程序,程序開始執行的時候是會到入口地址那裡找數據或程序執行,如果入口地址沒有程序或數據,就會產生缺頁中斷,然後將虛擬地址對應可執行文件中的部分裝載到物理內存中,再將這塊物理內存和虛擬內存建立映射。

本文主要講解了虛擬內存有關的知識、簡單的講解了一下虛擬內存和物理內存之間的映射以及程序裝載的過程,希望大家閱讀後對虛擬內存能有更深的理解。

③ 怎麼把虛擬內存轉換到物理內存!

我的電腦右鍵屬性--系統屬性--高級--設置---高級---最下面那個更改鍵--之後在自定義大小那裡輸入自己要的素質---再按設置--確定--確定--OK了!

重啟下就生效。。。

④ linux內核中虛擬內存是怎樣映射到物理內存的

當程序在運行的時候,會檢測到數據在虛擬內存中,並沒在物理內存中,這時候會產生一個缺頁中斷, 有缺頁中斷來映射。

⑤ 虛擬內存怎麼才能充當物理內存使用

不管是什麼系統,虛擬內存一般應該改成物理內存的兩倍就可以了。
256在現在已經比較小了。系統在運行程序的時候,先把程序調到內存使用。
如果不夠,可佔用虛擬內存。虛擬內存其實用的是你的硬碟空間。
物理內存超級重要。
所以,建議擴大內存,再買一根256的,才幾十塊。我們這里是這個價錢。
而且還可以雙通道。比一根512的效果還好。
虛擬內存不能充當物理內存使用。

⑥ 虛擬內存向物理內存映射是根據什麼機理

從操作系統的角度講,虛擬內存是屬於虛擬存儲器的范疇。有的作業很大,無法全部被裝入內存,或者有大量的作業要求運行,但內存不足以容納,所以只能將少量作業裝入內存,將其他作業留在外存上等待。
基於局部性原理,應用程序在運行之前,僅需要把把當前運行部分頁面或段裝如內存,其餘留在盤上。程序在運行的時候,如果它所要訪問的頁已經調入,便可繼續執行下去;但是如果程序所要訪問的頁沒有調入內存,此時程序利用OS提供的請求調頁功能,將他們調入。如果此時內存已經滿了,則還需要利用頁的置換功能,將內存中暫時不用的頁調到盤上,騰出足夠內存空間。如此這樣,便可以使一個大的用戶程序能在較小的內存空間上運行,也可以在內存中同時裝入更多的進程使它們並發運行。對用戶而言,大的內存容量只是一中感覺,故稱為虛擬存儲器。

⑦ 虛擬內存的地址映射

映射虛擬地址的形式可以分成靜態虛擬地址映射和動態虛擬地址映射.所謂靜態,就是在OEMAddressTable中定義映射關系或者是OS啟動後調用CreateStaticMapping和NKCreateStaticMapping來實現從虛擬地址到物理地址的映射;動態則是通過VirtualAlloc和VirtualCopy(或者調用MmmapIoSpace函數).這兩種映射虛擬地址的形式區別在於靜態虛擬地址只能由內核使用,用於ISR訪問外設存儲.而動態虛擬地址可以在應用程序里訪問物理地址(比如在驅動中操作寄存器).
在X86和ARM體系的CPU里,有一個數據結構對於地址映射技術尤其重要:OEMAddressTable.這個數組定義了外設從4G的虛擬地址到512M物理地址的映射關系.它位於public\common\oak\csp\x86\oal目錄下的oeminit.asm中,格式為Virtual Address, Physical Address, Size

在X86下大小必須是4M的倍數,ARM下為1M的倍數.內核建立了兩個范圍的虛擬地址:從0x80000000到0x9FFFFFFF是帶緩存的物理地址映射,而0xA0000000 到 0xBFFFFFFF 是不帶緩存的物理地址映射.驅動訪問外設時,應該用不帶緩存段的虛擬地址. 要注意的一點是,如果改動了OEMAddressTable,相應要改動config.bib.

1.如果是在bootloader中訪問設備寄存器,可以直接操作物理地址。

2.wince啟動後,硬體上ARM和X86體系的處理器啟動了MMU,操作系統只能訪問到虛擬地址,不能直接操作物理內存了。但是如果是X86的CPU,由於它的外設I/O埠和存儲器空間分開編址,可以直接嵌入匯編或者使用宏read_port_xxx,write_port_xxx來讀寫設備寄存器的物理地址。

3.wince軟體結構里對應MMU的是一個名為OEMAddressTable的數據結構(源文件oeminit.asm中),其中建立了物理地址和虛擬地址的靜態映射關系,也可以在其中改動系統所能識別物理內存的大小,以支持大內存。

4.我們也可以在wince啟動後調用CreateStaticMapping和NKCreateStaticMapping來實現OEMAddressTable中的這種物理地址和虛擬地址的靜態映射關系。

5.建立了靜態映射關系的虛擬地址只能由內核模式下的程序來操作,例如 ISR。除非你在定製系統時,選擇了full kernal mode,使所有程序都運行在完全內核模式下,這將導致系統不穩定。

6.如果要在驅動程序中訪問設備寄存器,必須建立動態虛擬地址映射,可以調用MmmapIoSpace函數來實現,或者通過VirtualAlloc和VirtualCopy函數來實現。其實MmmapIoSpace內部就調用了後者。

7.在驅動中訪問虛擬地址時,必須是非緩存段(位於0xA0000000 到 0xBFFFFFFF )。

8.使用VirtualCopy函數映射物理地址時,其lpvSrc參數必須右移8位,且相應的fdwProtect參數必須帶page_physical。

9.如果是ARM體系的處理器,訪問掛在系統匯流排上的設備寄存器前,必須先把匯流排地址轉化成CPU的地址,通過HalTranslateBusAddress實現兩種物理地址的變換,然後再調用MmmapIoSpace函數作虛實地址的轉換。
也可以使用 TransBusAddrToVirtual ()直接把匯流排上的地址轉化成系統的虛擬地址。 在一般的應用程序中訪問 I/O 是訪問它的緩存段虛擬地址,而驅動中必須訪問無緩存段虛擬地址。簡單來說無緩存段虛擬地址 = 緩存段虛擬地址 +0x20000000 。

全是供參考。不知道合不合你用呢!!!

⑧ 如何把虛擬內存移動到D盤

虛擬內存移動到D盤步驟:

1、第一步,右鍵點擊電腦,選擇屬性,如下圖所示:

注意事項:通常不推薦自定義大小,因為系統本身是科學設置的。如果自己定義,可以設置為物理內存的1.5-3倍,最多2-4倍足夠。

⑨ 虛擬內存 移動到物理內存

你的操作系統我沒用過,所以不太清楚,不過win7和XP系統可以通過設置虛擬內存,這個虛擬內存設置主要是為了解決內存不足的問題,不過你的電腦內存應該足夠的,要是你的操作系統能設置虛擬內存,那你把這個虛擬內存設很小就行了。電腦卡的原因不止是內存問題,具體原因說不清,不過一般是內存不足,CPU處理不過來導致的。

閱讀全文

與虛擬內存怎麼映射到物理內存相關的資料

熱點內容
word中化學式的數字怎麼打出來 瀏覽:876
乙酸乙酯化學式怎麼算 瀏覽:1556
沈陽初中的數學是什麼版本的 瀏覽:1509
華為手機家人共享如何查看地理位置 瀏覽:1211
一氧化碳還原氧化鋁化學方程式怎麼配平 瀏覽:1044
數學c什麼意思是什麼意思是什麼 瀏覽:1577
中考初中地理如何補 瀏覽:1465
360瀏覽器歷史在哪裡下載迅雷下載 瀏覽:839
數學奧數卡怎麼辦 瀏覽:1562
如何回答地理是什麼 瀏覽:1215
win7如何刪除電腦文件瀏覽歷史 瀏覽:1197
大學物理實驗干什麼用的到 瀏覽:1657
二年級上冊數學框框怎麼填 瀏覽:1872
西安瑞禧生物科技有限公司怎麼樣 瀏覽:1589
武大的分析化學怎麼樣 瀏覽:1383
ige電化學發光偏高怎麼辦 瀏覽:1508
學而思初中英語和語文怎麼樣 瀏覽:1834
下列哪個水飛薊素化學結構 瀏覽:1572
化學理學哪些專業好 瀏覽:1615
數學中的棱的意思是什麼 瀏覽:1268