當前位置:首頁 » 操作系統 » linux虛擬地址物理地址

linux虛擬地址物理地址

發布時間: 2024-09-20 06:23:29

linux 虛擬地址,到底怎麼理解

不是僅僅 Linux 是這么設計的,整個現代流行的操作系統都是這么設計的。
應用程序被讀入內存後,為了保證系統的統一性,所有的程序都有同樣的一套定址規范。這個定址就是虛擬地址。這個虛擬地址是系統提供轉換的,不是程序的工作。

如果系統不提供這個功能,那麼應用程序就需要自己去尋找沒有被使用的內存,以及還要自己去處理內存容量的問題,而且如果程序調用外部的一些函數庫,這些函數庫也需要分配內存,這會導致應用程序的設計難度非常大,每個應用程序實際上就是一個操作系統了。多個程序共同運行導致內存使用混亂也很容易出現。
應用程序申請內存,使用的是操作系統的內存分配功能。這樣操作系統可以根據實際情況給應用程序內存,程序不需要考慮因為內存位置不同而必須不同編寫的難度。而且操作系統還可以提供虛擬內存等等各種方式來擴充內存,這樣的內存對於應用程序來說是不需要考慮的,一切都有系統打理。

使用虛擬地址後,對於應用程序來說,他的內存使用不需要考慮其他的程序佔用,也不需要考慮內存容量的問題,也不需要考慮內存塊位置,函數庫的調用也都扔給操作系統打理。這使得應用程序不需要考慮具體如何管理內存,只需要考慮作為應用程序的應用部分。

而且,因為內存是虛擬的,應用程序一些函數調用,操作系統可以把多個應用程序的調用都用同一套數據來處理,這樣,既可以節約內存使用(就是啟動100個應用程序,也只需要內存里有一套函數庫而已),也可以做到外部函數庫和應用程序沒有直接關聯,純粹是由系統做虛擬地址過渡。

至於為什麼 4G ,這是傳統+一些兼容的考慮。
以前沒有這個技術時,每個程序都可以完全使用整個系統,整個空間是連續的。到了這種虛擬地址的方式後,每個程序還是有自己「獨立」的一整套內存地址。但每個程序內存使用量肯定不一樣。那麼多少內存空間才完全夠用呢?當時因為正好使用了 32 位系統。那麼就把整個 32 位環境支持的 4G 內存容量作為這個極限。
不過因為內存地址是虛擬的。實際應用程序要用內存,是需要先申請的,所以只有程序申請後,真實內存才會被佔用。這個 4G 只是在演算法上作為極限。

不過因為 4G 也是硬體極限。所以 4G 以外的地址都是不能使用的,這就導致另一個問題,一些硬體有存儲器,有些硬體需要存儲空間做交互(比如 PCI ,比如各種硬體,比如 AGP 顯卡)。這些存儲區域怎麼處理?
所以,Windows Vista 的 32 位版在 4G 內存的機器上曾經報出只有 3.5G (有的機器甚至只有 3.25G 可以用)。就是這個問題的解決辦法導致的:把硬體的內存用虛擬地址的方式,放到虛擬地址的最後面。這樣應用程序調用硬體存儲時,可以直接按照內存的方式讀寫。這樣應用程序就很好的統一了存儲界面:只有 4G 的內存范圍,不存在其他方式的存儲調用方式(硬碟需要用讀寫功能讀取到內存後才能處理,而不是直接進行處理)。這樣應用程序的開發就很簡單,而且整個內存的使用每個程序都一樣。不存在各種硬體的原因而不同導致的需要重新設計內存管理演算法。操作系統也能根據實際應用程序的需要隨時分配數據,也可以根據每個程序的運行情況,區別的提供物理內存或者虛擬的內存。

這么設計最大的一個好處是,硬體環境和應用程序是無關的,中間由操作系統做轉換。而且應用程序互相之間也沒有影響,就好象整個內存都由他自己一個程序使用一樣。

PS:說了半天,我發現我自己也說不清楚其中的緣由……

❷ linux kvm虛擬機求救多個虛擬機無法通信

你克隆後,這四個虛擬機擁有相同的MAC地址而導致的。
解決方法:
刪除 /etc/udev/rules.d/70-persistent-net.rules
命令: rm -fr /etc/udev/rules.d/70-persistent-net.rules
將/etc/sysconfig/network-scripts/ifcfg-eth0中的MAC地址用#注釋掉
重啟機器。
若有問題,給我留言。

❸ Linux 內核的內存管理 - 概念

Concepts overview — The Linux Kernel documentation

Linux中的內存管理是一個復雜的系統,經過多年的發展,它包含越來越多的功能,以支持從 MMU-less microcontrollers 到 supercomputers 的各種系統。
沒有MMU內存管理的系統被稱為 nommu ,它值得寫一份專門的文檔進行描述。
盡管有些概念是相同的,這里我們假設MMU可用,CPU可以將虛擬地址轉換為物理地址。

計算機系統中的物理內存是有限資源,即便支持內存熱插拔,其可以安裝的內存也有限的。物理內存不一定必須是連續的;它可以作為一組不同的地址范圍被訪問。此外,不同的CPU架構,甚至同架構的不同實現對如何定義這些地址范圍都是不同的。

這使得直接處理物理內存異常復雜,為了避免這種復雜性,開發了 虛擬內存 (virtual memory) 的概念。

虛擬內存從應用軟體中抽象出物理內存的細節,只允許在物理內存中保留需要的信息 (demand paging) ,並提供一種機制來保護和控制進程之間的數據共享。

通過虛擬內存,每次內存訪問都訪問一個 虛擬地址 。當CPU對從系統內存讀取(或寫入)的指令進行解碼時,它將該指令中編碼的虛擬地址轉換為內存控制器可以理解的物理地址。

物理內存被切分為 頁幀 page frames 頁 pages 。頁的大小是基於架構的。一些架構允許從幾個支持的值中選擇頁大小;此選擇在內核編譯時設置到內核配置。

每個物理內存頁都可以映射為一個或多個 虛擬頁(virtual pages) 。映射關系描述在 頁表(page tables) 中,頁表將程序使用的虛擬地址轉換為物理內存地址。頁表以層次結構組織。

最底層的表包含軟體使用的實際內存頁的物理地址。較高層的表包含較低層表頁的物理地址。頂層表的指針駐留在寄存器中。
當CPU進行地址轉換的時候,它使用寄存器訪問頂級頁表。

虛擬地址的高位,用於頂級頁表的條目索引。然後,通過該條目訪問下級,下級的虛擬地址位又作為其下下級頁表的索引。虛擬地址的最低位定義實際頁內的偏移量。

地址轉換需要多次內存訪問,而內存訪問相對於CPU速度來說比較慢。為了避免在地址轉換上花費寶貴的處理器周期,CPU維護著一個稱為 TLB (Translation Lookaside Buffer)的用於地址轉換緩存(cache)。通常TLB是非常稀缺的資源,需要大內存工作應用程序會因為TLB未命中而影響性能。

很多現代CPU架構允許頁表的高層直接映射到內存頁。例如,x86架構,可以通過二級、三級頁表的條目映射2M甚至1G內存頁。在Linux中,這些內存頁稱為 大頁 (Huge) 。大頁的使用顯著降低了TLB的壓力,提高了TLB命中率,從而提高了系統的整體性能。

Linux提供兩種機制開啟使用大頁映射物理內存。

第一個是 HugeTLB 文件系統,即 hugetlbfs 。它是一個偽文件系統,使用RAM作為其存儲。在此文件系統中創建的文件,數據駐留在內存中,並使用大頁進行映射。
關於 HugeTLB Pages

另一個被稱為 THP (Transparent HugePages) ,後出的開啟大頁映射物理內存的機制。
hugetlbfs 不同,hugetlbfs要求用戶和/或系統管理員配置系統內存的哪些部分應該並可以被大頁映射;THP透明地管理這些映射並獲取名稱。
關於 Transparent Hugepage Support

通常,硬體對不同物理內存范圍的訪問方式有所限制。某些情況下,設備不能對所有可定址內存執行DMA。在其他情況下,物理內存的大小超過虛擬內存的最大可定址大小,需要採取特殊措施來訪問部分內存。還有些情況,物理內存的尺寸超過了虛擬內存的最大可定址尺寸,需要採取特殊措施來訪問部分內存。

Linux根據內存頁的使用情況,將其組合為多個 zones 。比如, ZONE_DMA 包含設備用於DMA的內存, ZONE_HIGHMEM 包含未永久映射到內核地址空間的內存, ZONE_NORMAL 包含正常定址內存頁。
內存zones的實際層次架構取決於硬體,因為並非所有架構都定義了所有的zones,不同平台對DMA的要求也不同。

多處理器機器很多基於 NUMA (Non-Uniform Memory Access system - 非統一內存訪問系統 )架構。 在這樣的系統中,根據與處理器的「距離」,內存被安排成具有不同訪問延遲的 banks 。每個 bank 被稱為一個 node ,Linux為每個 node 構造一個獨立的內存管理子系統。 Node 有自己的zones集合、free&used頁面列表,以及各種統計計數器。
What is NUMA?
NUMA Memory Policy

物理內存易失,將數據放入內存的常見情況是讀取文件。讀取文件時,數據會放入 頁面緩存(page cache) ,可以在再次讀取時避免耗時的磁碟訪問。同樣,寫文件時,數據也會被放入 頁面緩存 ,並最終進入存儲設備。被寫入的頁被標記為 臟頁(dirty page) ,當Linux決定將其重用時,它會將更新的數據同步到設備上的文件。

匿名內存 anonymous memory 匿名映射 anonymous mappings 表示沒有後置文件系統的內存。這些映射是為程序的stack和heap隱式創建的,或調用mmap(2)顯式創建的。通常,匿名映射只定義允許程序訪問的虛擬內存區域。讀,會創建一個頁表條目,該條目引用一個填充有零的特殊物理頁。寫,則分配一個常規物理頁來保存寫入數據。該頁將被標記為臟頁,如果內核決定重用該頁,則臟頁將被交換出去 swapped out

縱貫整個系統生命周期,物理頁可用於存儲不同類型的數據。它可以是內核內部數據結構、設備驅動DMA緩沖區、讀取自文件系統的數據、用戶空間進程分配的內存等。
根據內存頁使用情況,Linux內存管理會區別處理。可以隨時釋放的頁面稱為 可回收(reclaimable) 頁面,因為它們把數據緩存到了其他地方(比如,硬碟),或者被swap out到硬碟上。
可回收頁最值得注意的是 頁面緩存 匿名頁面

在大多數情況下,存放內部內核數據的頁,和用作DMA緩沖區的頁無法重用,它們將保持現狀直到用戶釋放。這樣的被稱為 不可回收頁(unreclaimable)
然而,在特定情況下,即便是內核數據結構佔用的頁面也會被回收。
例如,文件系統元數據的緩存(in-memory)可以從存儲設備中重新讀取,因此,當系統存在內存壓力時,可以從主內存中丟棄它們。

釋放可回收物理內存頁並重新調整其用途的過程稱為 (surprise!) reclaim
Linux支持非同步或同步回收頁,取決於系統的狀態。
當系統負載不高時,大部分內存是空閑的,可以立即從空閑頁得到分配。
當系統負載提升後,空閑頁減少,當達到某個閾值( low watermark )時,內存分配請求將喚醒 kswapd 守護進程。它將以非同步的方式掃描內存頁。如果內存頁中的數據在其他地方也有,則釋放這些內存頁;或者退出內存到後置存儲設備(關聯 臟頁 )。

隨著內存使用量進一步增加,並達到另一個閾值- min watermark -將觸發回收。這種情況下,分配將暫停,直到回收到足夠的內存頁。

當系統運行時,任務分配並釋放內存,內存變得碎片化。
雖然使用虛擬內存可以將分散的物理頁表示為虛擬連續范圍,但有時需要分配大的連續的物理內存。這種需求可能會提升。例如,當設備驅動需要一個大的DMA緩沖區時,或當THP分配一個大頁時。
內存地址壓縮(compaction ) 解決了碎片問題。
該機制將佔用的頁從內存zone的下部移動到上部的空閑頁。壓縮掃描完成後,zone開始處的空閑頁就並在一起了,分配較大的連續物理內存就可行了。

reclaim 類似, compaction 可以在 kcompactd守護進程中非同步進行,也可以作為內存分配請求的結果同步進行。

在存在負載的機器上,內存可能會耗盡,內核無法回收到足夠的內存以繼續運行。
為了保障系統的其餘部分,引入了 OOM killer

OOM killer 選擇犧牲一個任務來保障系統的總體健康。選定的任務被killed,以期望在它退出後釋放足夠的內存以繼續正常的操作。

❹ linux 鉶氭嫙鍦板潃錛屽埌搴曟庝箞鐞嗚В

linux鐨勮櫄鎷熷湴鍧鍒嗕負鐗╃悊鍦板潃鍜岃櫄鎷熷湴鍧 銆

Linux緋葷粺涓鐨勭墿鐞嗗瓨鍌ㄧ┖闂村拰鉶氭嫙瀛樺偍絀洪棿鐨勫湴鍧鑼冨洿鍒嗗埆閮芥槸浠0x00000000鍒0xFFFFFFFF錛屽叡4GB銆
1銆佺墿鐞嗗湴鍧
Linux鐨勭墿鐞嗗瓨鍌ㄧ┖闂村竷灞涓庡勭悊鍣ㄧ浉鍏籌紝璇︾粏鎯呭喌鍙浠ヤ粠澶勭悊鍣ㄧ敤鎴鋒墜鍐岀殑瀛樺偍絀洪棿鍒嗗竷琛錛坢emory map錛夌浉鍏崇珷鑺備腑鏌ュ埌錛屾垜榪欓噷鍙鍒楀嚭浠ヤ笅鍑犵偣娉ㄦ剰浜嬮」錛
1錛夋渶澶node鍙穘涓嶈兘澶т簬MAX_NUMNODES-1銆
2錛塎AX_NUMNODES琛ㄧず緋葷粺鏀鎸佺殑鏈澶歯ode鏁般傚湪ARM緋葷粺涓錛孲harp鑺鐗囨渶澶氭敮鎸16涓猲odes錛屽叾浠栬姱鐗囨渶澶氭敮鎸4涓猲odes銆
3錛塶umnodes鏄褰撳墠緋葷粺涓瀹為檯鐨勫唴瀛榥ode鏁般
4錛夊湪涓嶆敮鎸丆ONFIG_DISCONTIGMEM閫夐」鐨勭郴緇熶腑錛屽彧鏈変竴涓鍐呭瓨node銆 5錛夋渶澶bank鍙穖涓嶈兘澶т簬NR_BANKS-1銆
6錛塏R_BANKS琛ㄧず緋葷粺涓鏀鎸佺殑鏈澶у唴瀛榖ank鏁幫紝涓鑸絳変簬澶勭悊鍣ㄧ殑RAM鐗囬夋暟銆侫RM緋葷粺涓錛孲harp鑺鐗囨渶澶氭敮鎸16涓猙anks錛屽叾浠栬姱鐗囨渶澶氭敮鎸8涓猙anks銆
2銆佽櫄鎷熷瓨鍌ㄧ┖闂村竷灞
鍦ㄦ敮鎸丮MU鐨勭郴緇熶腑錛屽綋緋葷粺鍋氬畬紜浠跺垵濮嬪寲鍚庡氨浣胯兘MMU鍔熻兘錛岃繖鏍鋒暣涓緋葷粺灝辮繍琛屽湪鉶氭嫙瀛樺偍絀洪棿涓錛屽疄鐜拌櫄鎷熷瓨鍌ㄧ┖闂村埌鐗╃悊瀛樺偍絀洪棿鏄犲皠鍔熻兘鐨勬槸澶勭悊鍣ㄧ殑MMU錛岃岃櫄鎷熷瓨鍌ㄧ┖闂翠笌5璺瀛樺偍絀洪棿鐨勬槧灝勫叧緋誨垯鏄鐢盠inux鍐呮牳鏉ョ$悊鐨勩32浣嶇郴緇熶腑鐗╃悊瀛樺偍絀洪棿鍗4GB絀洪棿錛岃櫄鎷熷瓨鍌ㄧ┖闂村悓鏍峰崰4GB絀洪棿錛孡inux鎶婄墿鐞嗙┖闂翠腑瀹為檯瀛樺湪鐨勮繙榪滃皬浜4GB鐨勫唴瀛樼┖闂存槧灝勫埌鏁翠釜4GB鉶氭嫙瀛樺偍絀洪棿涓闄ゆ槧灝処/O絀洪棿涔嬪栫殑鍏ㄩ儴絀洪棿錛屾墍浠ヨ櫄鎷熷唴瀛樼┖闂磋繙榪滃ぇ浜庣墿鐞嗗唴瀛樼┖闂達紝榪欏氨璇村悓涓鍧楃墿鐞嗗唴瀛樺彲鑳芥槧灝勫埌澶氬勮櫄鎷熷唴瀛樺湴鍧絀洪棿銆

熱點內容
sql資料庫安全 發布:2024-09-20 08:31:32 瀏覽:87
蘋果連接id伺服器出錯是怎麼回事 發布:2024-09-20 08:01:07 瀏覽:502
編程鍵是什麼 發布:2024-09-20 07:52:47 瀏覽:651
學考密碼重置要求的證件是什麼 發布:2024-09-20 07:19:46 瀏覽:477
電腦主伺服器怎麼開機 發布:2024-09-20 07:19:07 瀏覽:728
2022款瑞虎升級哪些配置 發布:2024-09-20 06:59:07 瀏覽:265
資料庫與asp 發布:2024-09-20 06:55:25 瀏覽:727
python解釋編譯 發布:2024-09-20 06:52:57 瀏覽:648
舞蹈豐收腳本 發布:2024-09-20 06:36:26 瀏覽:595
linux進程埠號 發布:2024-09-20 06:36:11 瀏覽:80