當前位置:首頁 » 歷物理化 » 虛擬地址物理地址

虛擬地址物理地址

發布時間: 2021-07-31 22:12:44

Ⅰ 虛擬地址的物理地址分別是什麼 (1)224

電腦里的物理地址能虛擬。
如果CPU寄存器中的分頁標志位被設置,那麼執行內存操作的機器指令時,CPU(准確來說,是MMU,即Memory Management Unit,內存管理單元)會自動根據頁目錄和頁表中的信息,把虛擬地址轉換成物理地址,完成該指令。
物理地址 (physical address): 放在定址匯流排上的地址。放在定址匯流排上,如果是讀,電路根據這個地址每位的值就將相應地址的物理內存中的數據放到數據匯流排中傳輸。如果是寫,電路根據這個地址每位的值就在相應地址的物理內存中放入數據匯流排上的內容。物理內存是以位元組(8位)為單位編址的。
虛擬地址 (virtual address): CPU啟動保護模式後,程序運行在虛擬地址空間中。注意,並不是所有的「程序」都是運行在虛擬地址中。CPU在啟動的時候是運行在實模式的,Bootloader以及內核在初始化頁表之前並不使用虛擬地址,而是直接使用物理地址的。

Ⅱ 虛擬地址是怎麼轉換成物理地址的

進程注入唄。
虛擬地址向物理地址轉換是硬體轉換,對程序看來是透明的

Ⅲ 虛擬地址,邏輯地址,線性地址,物理地址有什麼區別

邏輯地址(Logical Address) 是指由程式產生的和段相關的偏移地址部分。例如,你在進行C語言指針編程中,能讀取指針變數本身值(&操作),實際上這個值就是邏輯地址,他是相對於你當前進程數據段的地址,不和絕對物理地址相干。只有在Intel實模式下,邏輯地址才和物理地址相等(因為實模式沒有分段或分頁機制,Cpu不進行自動地址轉換);邏輯也就是在Intel保護模式下程式執行代碼段限長內的偏移地址(假定代碼段、數據段如果完全相同)。應用程式員僅需和邏輯地址打交道,而分段和分頁機制對你來說是完全透明的,僅由系統編程人員涉及。應用程式員雖然自己能直接操作內存,那也只能在操作系統給你分配的內存段操作。

Ⅳ 虛擬地址和物理地址有什麼區別和聯系

物理地址是永遠都不會改變的,除非你強行改變它
虛擬地址是隨時可以改變的
他好像是一個不存在的環境
但是他卻可以起到存儲器的效果
虛擬地址在你不用的時候他就沒有內存
而物理地址是永遠都有內存除非你用完了

Ⅳ 程序計數器PC裡面是虛擬地址還是物理地址

在程序里,計數器用的變數方式計數,也可以說是虛擬地址,物理地址由系去搞定。

Ⅵ linux:誰能給我解釋下虛擬地址和物理地址的聯系

這個問題很大。。。。我盡自己所能給你解釋一下吧,如果你不能完全看懂,以後可以回頭再翻翻來看。關於虛擬內存的事情,大概是這樣的:
首先你要明確什麼是虛擬內存。虛擬內存實際上是操作系統對於內存管理的一種方式,比如說,對每個程序而言,它的內存編址都從0x00到0xff,但是實際上,這些內存對應的物理地址,應用程序本身是無法知道的,在這里就可以理解成操作系統對內存管理的一層抽象。
比如,可能進程init的虛擬地址0x00對應了物理地址的0x10,而kthreadd的虛擬地址0x00對應物理地址0x20,etc.
而且虛擬內存也是一種有效的進程間隔離的方式,極大的提升了進程的安全性和操作系統的穩定性,也就是我一個進程不管做什麼,都是在它自己的地址空間里做的,不會影響到其他進程和OS。
當然這是理想情況,實際上還有進程間通信啦之類,這就不在這個問題的范圍之內了。
而具體怎麼把這些虛擬地址對應到物理地址上,這是操作系統做的事情,估計這個也就是你的問題。
----以上是背景1-----
然後我要明確一下:地址匯流排4位的意思是說內存用4個bit位來表達地址,所以能夠index的地址位就是2^0-2^4,也就是0x0到0xf,就是16個bit的內存空間。
然後我們再來細化一下你的例子,就比方說在你的16bit的內存的機器上有1個OS,上面跑著2個程序。一般來說OS會保留地址的高位,比如11-15bit的位置,作為kernel space;然後0-10bit是user space。
在以上的前提下,虛擬內存的效果是:在每一個程序看來,這個程序都有0x0到0xf的地址可以用,並且它們的0xb-0xf都是shared kernel space,然後0x0-0xa都是自己的user space,這樣彷彿就有了32個bit的地址一樣。這就是你所謂的是用虛擬地址可以使總的地址操作物理地址。至於os是怎麼做到這點的,繼續往下看。
-----以上是背景2-----
操作系統對每一個進程有一個進程式控制制塊,叫PCB,Process Control Block,里邊存儲了每一個進程的進程信息,比如說寄存器,file descriptor,還有我們最關心的內存映射信息。每一個進程有一個遞增的id號,叫pid,也就是Process IDentifier.
-----以上是背景3-----
進程間切換,也就是說,比如說你一個系統只有1個CPU,但是有兩個進程要跑,而且要讓我們看起來好像是兩個進程同時在跑一樣。為什麼我要提到這個呢,後面繼續看。
-----以上是背景4-----
好,現在來講如何把虛擬地址映射到物理地址。從程序的角度來看,從malloc開始講起,比如,在某一時刻,一個進程調用了malloc,在堆(heap)上申請了2bits的空間。實際上這個行為的流程是,程序調用malloc,進入內核模式之後,調用mmap,如果成功,操作系統會從物理地址上取一塊2bits的內存,交給應用程序編入虛擬地址空間。更詳細一點說,每個進程對內存管理是一個紅黑樹的結構,也就是說,在每一個進程的PCB,里維護了一顆紅黑樹,然後動態的將所有的新分配的內存加到這個紅黑樹里邊,以保證程序對每一塊內存的訪問時間是差不多的。然後不知道你們教材中有沒有提到頁表(page table),頁表也是PCB中的一項,你們教材中應該會對頁表有詳細的講解,將如何對內存的地址進行換算,之類的。然後你要明確,頁表實際上是紅黑樹的cache,這樣可以加速程序對於常用的內存的訪問速度。
以上是操作系統對內存管理的一個大致概括,就是一塊物理的內存如何映射成為一塊虛擬的內存。
我在背景2中說,兩個程序都看到自己有16個bit的虛擬地址,總共有32bit,但是實際上硬體只有16bits,也就是說,不管你在紅黑樹和頁表中怎麼映射,一定會有沖突發生,比如,可能物理地址的0x02對應了進程1中的0x04,又在進程2的PCB中映射到了pid2的虛擬地址位0x06上。操作系統如何解決這個矛盾呢,首先在進程pid 1運行的時候,這個0x02對應的是pid1中的0x04;然後這個時候進程切換發生了,pid 2開始運行。當pid2需要用到它的0x04時,os發現0x02這個地址在pid1中也有映射,於是它就把0x02這個地址上的內容存到硬碟上的一個叫swap的空間內,然後把這個地址交給pid2使用。這樣就達到了擴大虛擬地址的效果。
但是這樣做是有代價的,因為一旦這個page被swap出去,那麼在pid1再來調用的時候會發生一系列的miss,從L1 cache miss到 L2 cache miss到L3 cache miss,然後頁表miss,memory miss,會對程序的性能造成極大的影響。影響有多大呢,平均來說:
L1 cache hit: 0.5ns
L2 cache hit: 7ns
主內存引用:100ns
順序從內存中讀取1MB:250,000ns
硬碟尋道:10,000,000ns
從硬碟上順序讀取1MB:30,000,000ns
所以你就可以知道這種行為是以極大的性能為代價的。
----講完啦-----
總的來說這個很大的話題,我剛才所寫的東西的就是試圖讓你對虛擬內存這個東西有一個基本的概念,然後大致的了解內存是如何映射的。就我現在能想到的,對這個虛擬內存話題的討論還包括多級頁表,進程間隔離&通信以及memory fragment。
個人水平有限,如果以上有什麼地方說錯的或者遺漏的,還請各位多多補充和批評,謝謝。

Ⅶ win7虛擬地址轉換為物理地址

保護模式下虛擬地址轉物理地址,一般都是系統在做的,我還沒見過書上有講怎麼轉。一般書上講的都是實模式下轉的方法。
使用實模式下的匯編語言能夠做的事情是很有限的,當然你說的改數據。。。不太明白你是什麼意思,但是現在的系統都是在保護模式下的了,你在系統上運行的實模式的匯編語言,其實也只是系統模擬給你看的,本質上還是在保護模式下的。
當然如果你真正是將整個電腦進入了實模式,那你用匯編還是想改什麼改什麼,但是這樣做,你得先自己編寫引導,如果是要改文件數據,你還得在實模式下用匯編寫讀取和修改硬碟數據的代碼,這難度。。。有點大。。。你要是都會。。。應該可以直接去微軟應聘了。

Ⅷ 關於虛擬地址和物理地址的一道題(電腦)

內存問題吧,先換個內存PC插槽試試,在不行按照我下面的方法試試。

運行中輸入cmd,在命令提示符下輸入:
for %1 in (%windir%\system32\*.dll) do regsvr32.exe /s %1 注意,
是在命令提示符下,不是在「運行框」中!!

完了 重啟電腦

讀卡器有問題 去換1個把

或者是 不是顯卡不夠就是內存不夠 如果全是硬體問題就換電腦好了!!!
內存問題吧,先換個內存PC插槽試試,在不行按照我下面的方法試試。運行中輸入cmd,在命令提示符下輸入: for %1 in (%windir%\system32\*.dll) do regsvr32.exe /s %

Ⅸ 什麼是線性地址,邏輯地址,虛擬地址,物理地址

邏輯地址( Address) 是指由程式產生的和段相關的偏移地址部分。例如,你在進行C語言指針編程中,能讀取指針變數本身值(&操作),實際上這個值就是邏輯地址,他是相對於你當前進程數據段的地址,不和絕對物理地址相干。只有在Intel實模式下,邏輯地址才和物理地址相等(因為實模式沒有分段或分頁機制,Cpu不進行自動地址轉換);邏輯也就是在Intel保護模式下程式執行代碼段限長內的偏移地址(假定代碼段、數據段如果完全相同)。應用程式員僅需和邏輯地址打交道,而分段和分頁機制對你來說是完全透明的,僅由系統編程人員涉及。應用程式員雖然自己能直接操作內存,那也只能在操作系統給你分配的內存段操作。
線性地址(Linear Address) 是邏輯地址到物理地址變換之間的中間層。程式代碼會產生邏輯地址,或說是段中的偏移地址,加上相應段的基地址就生成了一個線性地址。如果啟用了分頁機制,那麼線性地址能再經變換以產生一個物理地址。若沒有啟用分頁機制,那麼線性地址直接就是物理地址。Intel 80386的線性地址空間容量為4G(2的32次方即32根地址匯流排定址)。
物理地址(Physical Address) 是指出目前CPU外部地址匯流排上的定址物理內存的地址信號,是地址變換的最終結果地址。如果啟用了分頁機制,那麼線性地址會使用頁目錄和頁表中的項變換成物理地址。如果沒有啟用分頁機制,那麼線性地址就直接成為物理地址了。
虛擬內存(Virtual Memory)是指計算機呈現出要比實際擁有的內存大得多的內存量。因此他允許程式員編制並運行比實際系統擁有的內存大得多的程式。這使得許多大型項目也能夠在具有有限內存資源的系統上實現。一個非常恰當的比喻是:你不必非常長的軌道就能讓一列火車從上海開到北京。你只需要足夠長的鐵軌(比如說3公里)就能完成這個任務。採取的方法是把後面的鐵軌即時鋪到火車的前面,只要你的操作足夠快並能滿足需求,列車就能象在一條完整的軌道上運行。這也就是虛擬內存管理需要完成的任務。在Linux0.11內核中,給每個程式(進程)都劃分了總容量為64MB的虛擬內存空間。因此程式的邏輯地址范圍是0x0000000到0x4000000。有時我們也把邏輯地址稱為 虛擬地址。因為和虛擬內存空間的概念類似,邏輯地址也是和實際物理內存容量無關的。邏輯地址和物理地址的「差距」是0xC0000000,是由於虛擬地址->線性地址->物理地址映射正好差這個值。這個值是由操作系統指定的。機理 邏輯地址(或稱為虛擬地址)到線性地址是由CPU的段機制自動轉換的。如果沒有開啟分頁管理,則線性地址就是物理地址。如果開啟了分頁管理,那麼系統程式需要參和線性地址到物理地址的轉換過程。具體是通過設置頁目錄表和頁表項進行的。

熱點內容
老師面試班 發布:2025-07-11 23:57:06 瀏覽:802
如何鋪地磚 發布:2025-07-11 22:46:37 瀏覽:232
田靜老師 發布:2025-07-11 22:21:52 瀏覽:758
文科生物會考知識點 發布:2025-07-11 21:32:18 瀏覽:808
班主任工作案例小學 發布:2025-07-11 21:21:02 瀏覽:729
寶藍色校園 發布:2025-07-11 20:31:21 瀏覽:714
幼兒教師演講稿精選 發布:2025-07-11 14:51:14 瀏覽:105
燃料電池歷史 發布:2025-07-11 13:49:58 瀏覽:96
什麼心理 發布:2025-07-11 11:13:50 瀏覽:198
天都教育 發布:2025-07-11 09:35:37 瀏覽:447