linuxmmu
Ⅰ 嵌入式linux驅動要學哪些
1、 編寫Linux設備驅動要求工程師有非常好的硬體基礎,懂得SRAM、Flash、SDRAM、磁碟的讀寫方式,UART、I2C、USB等設備的介面以及輪詢、中斷、DMA的原理,PCI匯流排的工作方式以及CPU的內存管理單元(MMU)等。
2、編寫Linux設備驅動要求工程師有非常好的C語言基礎,能靈活地運用C語言的結構體、指針、函數指針及內存動態申請和釋放等。
3、編寫Linux設備驅動要求工程師有一定的Linux內核基礎,雖然並不要求工程師對內核各個部分有深入的研究,但至少要明白驅動與內核的介面。尤其是對於塊設備、網路設備、Flash設備、串口設備等復雜設備,內核定義的驅動體系架構本身就非常復雜。
4、編寫Linux設備驅動要求工程師有非常好的多任務並發控制和同步的基礎,因為在驅動中會大量使用自旋鎖、互斥、信號 量、等待隊列等並發與同步機制。朱,有,鵬的驅動開發講得還不錯。
Ⅱ Uclinux是什麼意思 全稱是什麼
uclinux表示micro-control linux.即微控制器領域中的Linux系統,是Lineo公司的主打產品,同時也是開放源碼的嵌入式Linux的典範之作。uCLinux主要是針對目標處理器沒有存儲管理單元MMU(Memory
Management Unit)的嵌入式系統而設計的。它已經被成功地移植到了很多平台上。由於沒有MMU,其多任務的實現需要一定技巧。
Linux是一種很受歡迎的操作系統,它與UNIX系統兼容,開放源代碼。它原本被設計為桌面系統,現在廣泛應用於伺服器領域。而更大的影響在於它正逐漸的應用於嵌入式設備。uClinux正是在這種氛圍下產生的。在uClinux這個英文單詞中u表示Micro,小的意思,C表示Control,控制的意思,所以uClinux就是Micro-Control-Linux,字面上的理解就是"針對微控制領域而設計的Linux系統"。
Ⅲ 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絀洪棿涔嬪栫殑鍏ㄩ儴絀洪棿錛屾墍浠ヨ櫄鎷熷唴瀛樼┖闂磋繙榪滃ぇ浜庣墿鐞嗗唴瀛樼┖闂達紝榪欏氨璇村悓涓鍧楃墿鐞嗗唴瀛樺彲鑳芥槧灝勫埌澶氬勮櫄鎷熷唴瀛樺湴鍧絀洪棿銆
Ⅳ 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的啟動的哪個環節中開始使能了mmu
MMU可以讓你不再以平面的方式使用內存,然後程序地址重定位之類的才可以實現。 這是我知道的最重要的一點。
Ⅵ 璇﹁ВLinux緋葷粺鍐呭瓨瀵誨潃鐨勫垎欏墊満鍒
鍒嗛〉鏈哄埗鍦ㄦ墊満鍒朵箣鍚庤繘琛岋紝浠ュ畬鎴愮嚎鎬р旂墿鐞嗗湴鍧鐨勮漿鎹㈣繃紼嬨傛墊満鍒舵妸閫昏緫鍦板潃杞鎹涓虹嚎鎬у湴鍧錛屽垎欏墊満鍒惰繘涓姝ユ妸璇ョ嚎鎬у湴鍧鍐嶈漿鎹涓虹墿鐞嗗湴鍧銆
紜浠朵腑鐨勫垎欏
鍒嗛〉鏈哄埗鐢盋R0涓鐨凱G浣嶅惎鐢ㄣ傚侾G=1錛屽惎鐢ㄥ垎欏墊満鍒訛紝騫朵嬌鐢ㄦ湰鑺傝佹弿榪扮殑鏈哄埗錛屾妸綰挎у湴鍧杞鎹涓虹墿鐞嗗湴鍧銆傚侾G=0錛岀佺敤鍒嗛〉鏈哄埗錛岀洿鎺ユ妸孌墊満鍒朵駭鐢熺殑綰挎у湴鍧褰撲綔鐗╃悊鍦板潃浣跨敤銆傚垎欏墊満鍒剁$悊鐨勫硅薄鏄鍥哄畾澶у皬鐨勫瓨鍌ㄥ潡錛岀О涔嬩負欏 (page)銆傚垎欏墊満鍒舵妸鏁翠釜綰挎у湴鍧絀洪棿鍙婃暣涓鐗╃悊鍦板潃絀洪棿閮界湅鎴愮敱欏電粍鎴愶紝鍦ㄧ嚎鎬у湴鍧絀洪棿涓鐨勪換浣曚竴欏碉紝鍙浠ユ槧灝勪負鐗╃悊鍦板潃絀洪棿涓鐨勪換浣曚竴欏(鎴戜滑鎶婄墿鐞嗙┖闂翠腑鐨勪竴欏靛彨鍋氫竴涓欏甸潰鎴栭〉妗(page frame))銆
銆銆80386 浣跨敤4K瀛楄妭澶у皬鐨勯〉銆傛瘡涓欏甸兘鏈4K瀛楄妭闀匡紝騫跺湪4K瀛楄妭鐨勮竟鐣屼笂瀵歸綈錛屽嵆姣忎竴欏電殑璧峰嬪湴鍧閮借兘琚4K鏁撮櫎銆傚洜姝わ紝80386鎶4G瀛楄妭鐨勭嚎鎬у湴鍧絀洪棿錛屽垝鍒嗕負1G涓欏甸潰錛屾瘡欏墊湁4K瀛楄妭澶у皬銆傚垎欏墊満鍒墮氳繃鎶婄嚎鎬у湴鍧絀洪棿涓鐨勯〉錛岄噸鏂板畾浣嶅埌鐗╃悊鍦板潃絀洪棿鏉ヨ繘琛岀$悊錛屽洜涓烘瘡涓欏甸潰鐨勬暣涓4K瀛楄妭浣滀負涓涓鍗曚綅榪涜屾槧灝勶紝騫朵笖姣忎釜欏甸潰閮藉歸綈4K瀛楄妭鐨勮竟鐣岋紝鍥犳わ紝綰挎у湴鍧鐨勪綆12浣嶇粡榪囧垎欏墊満鍒剁洿鎺ュ湴浣滀負鐗╃悊鍦板潃鐨勪綆12浣嶄嬌鐢ㄣ
涓轟粈涔堜嬌鐢ㄤ袱綰ч〉琛
鍋囪炬瘡涓榪涚▼閮藉崰鐢ㄤ簡4G鐨勭嚎鎬у湴鍧絀洪棿錛岄〉琛ㄥ叡鍚1M涓琛ㄩ」錛屾瘡涓琛ㄩ」鍗4涓瀛楄妭錛岄偅涔堟瘡涓榪涚▼鐨勯〉琛ㄨ佸崰鎹4M鐨勫唴瀛樼┖闂淬備負浜嗚妭鐪侀〉琛ㄥ崰鐢ㄧ殑絀洪棿錛屾垜浠浣跨敤涓ょ駭欏佃〃銆傛瘡涓榪涚▼閮戒細琚鍒嗛厤涓涓欏電洰褰曪紝浣嗘槸鍙鏈夎瀹為檯浣跨敤欏佃〃鎵嶄細琚鍒嗛厤鍒板唴瀛橀噷闈銆備竴綰ч〉琛ㄩ渶瑕佷竴嬈″垎閰嶆墍鏈夐〉琛ㄧ┖闂達紝涓ょ駭欏佃〃鍒欏彲浠ュ湪闇瑕佺殑鏃跺欏啀鍒嗛厤欏佃〃絀洪棿銆
涓ょ駭欏佃〃緇撴瀯
涓ょ駭琛ㄧ粨鏋勭殑絎涓綰хО涓洪〉鐩褰曪紝瀛樺偍鍦ㄤ竴涓4K瀛楄妭鐨勯〉闈涓銆傞〉鐩褰曡〃鍏辨湁1K涓琛ㄩ」錛屾瘡涓琛ㄩ」涓4涓瀛楄妭錛屽苟鎸囧悜絎浜岀駭琛ㄣ傜嚎鎬у湴鍧鐨勬渶楂10浣(鍗充綅31~浣32)鐢ㄦ潵浜х敓絎涓綰х殑緔㈠紩錛岀敱緔㈠紩寰楀埌鐨勮〃欏逛腑錛屾寚瀹氬苟閫夋嫨浜1K涓浜岀駭琛ㄤ腑鐨勪竴涓琛ㄣ
涓ょ駭琛ㄧ粨鏋勭殑絎浜岀駭縐頒負欏佃〃錛屼篃鍒氬ソ瀛樺偍鍦ㄤ竴涓4K瀛楄妭鐨勯〉闈涓錛屽寘鍚1K涓瀛楄妭鐨勮〃欏癸紝姣忎釜琛ㄩ」鍖呭惈涓涓欏電殑鐗╃悊鍩哄湴鍧銆傜浜岀駭欏佃〃鐢辯嚎鎬у湴鍧鐨勪腑闂10 浣(鍗充綅21~浣12)榪涜岀儲寮曪紝浠ヨ幏寰楀寘鍚欏電殑鐗╃悊鍦板潃鐨勯〉琛ㄩ」錛岃繖涓鐗╃悊鍦板潃鐨勯珮20浣嶄笌綰挎у湴鍧鐨勪綆12浣嶅艦鎴愪簡鏈鍚庣殑鐗╃悊鍦板潃錛屼篃灝辨槸欏佃漿鍖栬繃紼嬭緭鍑虹殑鐗╃悊鍦板潃銆
銆銆欏電洰褰曢」
銆銆絎31~12浣嶆槸20浣嶉〉琛ㄥ湴鍧錛岀敱浜庨〉琛ㄥ湴鍧鐨勪綆12浣嶆諱負0錛屾墍浠ョ敤楂20浣嶆寚鍑32浣嶉〉琛ㄥ湴鍧灝卞彲浠ヤ簡銆傚洜姝わ紝涓涓欏電洰褰曟渶澶氬寘鍚1024涓欏佃〃鍦板潃銆
絎0浣嶆槸瀛樺湪浣嶏紝濡傛灉P=1錛岃〃紺洪〉琛ㄥ湴鍧鎸囧悜鐨勮ラ〉鍦ㄥ唴瀛樹腑錛屽傛灉P=0錛岃〃紺轟笉鍦ㄥ唴瀛樹腑銆
絎1浣嶆槸璇/鍐欎綅錛岀2浣嶆槸鐢ㄦ埛/綆$悊鍛樹綅錛岃繖涓や綅涓洪〉鐩褰曢」鎻愪緵紜浠朵繚鎶ゃ傚綋鐗規潈綰т負3鐨勮繘紼嬭佹兂璁塊棶欏甸潰鏃訛紝闇瑕侀氳繃欏典繚鎶ゆ鏌ワ紝鑰岀壒鏉冪駭涓0鐨勮繘紼嬪氨鍙浠ョ粫榪囬〉淇濇姢銆
絎3浣嶆槸PWT(Page Write-Through)浣嶏紝琛ㄧず鏄鍚﹂噰鐢ㄥ啓閫忔柟寮忥紝鍐欓忔柟寮忓氨鏄鏃㈠啓鍐呭瓨(RAM)涔熷啓楂橀熺紦瀛,璇ヤ綅涓1琛ㄧず閲囩敤鍐欓忔柟寮
絎4浣嶆槸PCD(Page Cache Disable)浣嶏紝琛ㄧず鏄鍚﹀惎鐢ㄩ珮閫熺紦瀛,璇ヤ綅涓1琛ㄧず鍚鐢ㄩ珮閫熺紦瀛樸
絎5浣嶆槸璁塊棶浣嶏紝褰撳歸〉鐩褰曢」榪涜岃塊棶鏃訛紝A浣=1銆
絎7浣嶆槸Page Size鏍囧織錛屽彧閫傜敤浜庨〉鐩褰曢」銆傚傛灉緗涓1錛岄〉鐩褰曢」鎸囩殑鏄4MB鐨勯〉闈錛岃風湅鍚庨潰鐨勬墿灞曞垎欏點
絎9~11浣嶇敱鎿嶄綔緋葷粺涓撶敤錛孡inux涔熸病鏈夊仛鐗規畩涔嬬敤銆
欏甸潰欏
銆銆80386鐨勬瘡涓欏電洰褰曢」鎸囧悜涓涓欏佃〃錛岄〉琛ㄦ渶澶氬惈鏈1024涓欏甸潰欏癸紝姣忛」4涓瀛楄妭錛屽寘鍚欏甸潰鐨勮搗濮嬪湴鍧鍜屾湁鍏寵ラ〉闈㈢殑淇℃伅銆傞〉闈㈢殑璧峰嬪湴鍧涔熸槸4K鐨勬暣鏁板嶏紝鎵浠ラ〉闈㈢殑浣12浣嶄篃鐣欎綔瀹冪敤銆
絎31~12浣嶆槸20浣嶇墿鐞嗛〉闈㈠湴鍧錛岄櫎絎6浣嶅栫0鍀5浣嶅強9~11浣嶇殑鐢ㄩ斿拰欏電洰褰曢」涓鏍鳳紝絎6浣嶆槸欏甸潰欏圭嫭鏈夌殑錛屽綋瀵規秹鍙婄殑欏甸潰榪涜屽啓鎿嶄綔鏃訛紝D浣嶈緗1銆
4GB鐨勫唴瀛樺彧鏈変竴涓欏電洰褰曪紝瀹冩渶澶氭湁1024涓欏電洰褰曢」錛屾瘡涓欏電洰褰曢」鍙堝惈鏈1024涓欏甸潰欏癸紝鍥犳わ紝鍐呭瓨涓鍏卞彲浠ュ垎鎴1024脳1024=1M涓欏甸潰銆傜敱浜庢瘡涓欏甸潰涓4K涓瀛楄妭錛屾墍浠ワ紝瀛樺偍鍣ㄧ殑澶у皬姝eソ鏈澶氫負4GB銆
綰挎у湴鍧鍒扮墿鐞嗗湴鍧鐨勮漿鎹
銆銆32浣嶇嚎鎬у湴鍧鍒扮墿鐞嗗湴鍧鐨勮漿鎹
1.CR3鍖呭惈鐫欏電洰褰曠殑璧峰嬪湴鍧錛岀敤32浣嶇嚎鎬у湴鍧鐨勬渶楂10浣岮31~A22浣滀負欏電洰褰曠殑欏電洰褰曢」鐨勭儲寮曪紝灝嗗畠涔樹互4錛屼笌CR3涓鐨勯〉鐩褰曠殑璧峰嬪湴鍧鐩稿姞錛屽艦鎴愮浉搴旈〉琛ㄧ殑鍦板潃銆
2.浠庢寚瀹氱殑鍦板潃涓鍙栧嚭32浣嶉〉鐩褰曢」錛屽畠鐨勪綆12浣嶄負0錛岃繖32浣嶆槸欏佃〃鐨勮搗濮嬪湴鍧銆傜敤32浣嶇嚎鎬у湴鍧涓鐨凙21~A12浣嶄綔涓洪〉琛ㄤ腑鐨勯〉闈㈢殑緔㈠紩錛屽皢瀹冧箻浠4錛屼笌欏佃〃鐨勮搗濮嬪湴鍧鐩稿姞錛屽艦鎴32浣嶉〉闈㈠湴鍧銆
3.灝咥11~A0浣滀負鐩稿逛簬欏甸潰鍦板潃鐨勫嚲縐婚噺錛屼笌32浣嶉〉闈㈠湴鍧鐩稿姞錛屽艦鎴32浣嶇墿鐞嗗湴鍧銆
鎵╁睍鍒嗛〉
浠庡旇吘澶勭悊鍣ㄥ紑濮嬶紝Intel寰澶勭悊鍣ㄥ紩榪涗簡鎵╁睍鍒嗛〉錛屽畠鍏佽擱〉鐨勫ぇ灝忎負4MB銆
銆銆鍦ㄦ墿灞曞垎欏電殑鎯呭喌涓,鍒嗛〉鏈哄埗鎶32浣嶇嚎鎬у湴鍧鍒嗘垚涓や釜鍩燂細鏈楂10浣嶇殑鐩褰曞煙鍜屽叾浣22浣嶇殑鍋忕Щ閲忋
欏甸潰楂橀熺紦瀛
銆銆鐢變簬鍦ㄥ垎欏墊儏鍐典笅錛屾瘡嬈″瓨鍌ㄥ櫒璁塊棶閮借佸瓨鍙栦袱綰ч〉琛錛岃繖灝卞ぇ澶ч檷浣庝簡璁塊棶閫熷害銆傛墍浠ワ紝涓轟簡鎻愰珮閫熷害錛屽湪386涓璁劇疆涓涓鏈榪戝瓨鍙栭〉闈㈢殑楂橀熺紦瀛樼‖浠舵満鍒訛紝瀹 鑷鍔ㄤ繚鎸32欏瑰勭悊鍣ㄦ渶榪戜嬌鐢ㄧ殑欏甸潰鍦板潃錛屽洜姝わ紝鍙浠ヨ嗙洊128K瀛楄妭鐨勫瓨鍌ㄥ櫒鍦板潃銆傚綋榪涜屽瓨鍌ㄥ櫒璁塊棶鏃訛紝鍏堟鏌ヨ佽塊棶鐨勯〉闈㈡槸鍚﹀湪楂橀熺紦瀛樹腑錛屽傛灉鍦錛 灝變笉蹇呯粡榪囦袱綰ц塊棶浜嗭紝濡傛灉涓嶅湪錛屽啀榪涜屼袱綰ц塊棶銆傚鉤鍧囨潵璇達紝欏甸潰楂橀熺紦瀛樺ぇ綰︽湁98%鐨勫懡涓鐜囷紝涔熷氨鏄璇存瘡嬈¤塊棶瀛樺偍鍣ㄦ椂錛屽彧鏈2%鐨勬儏鍐靛繀欏昏塊棶涓ょ駭鍒嗛〉鏈烘瀯銆傝繖灝卞ぇ澶у姞蹇浜嗛熷害銆
Linux涓鐨勫垎欏墊満鍒
Linux浣跨敤浜嗕竴涓閫傚悎32浣嶅拰64浣嶇郴緇熺殑鍒嗛〉鏈哄埗銆
銆銆欏靛叏灞鐩褰
欏甸《綰х洰褰
欏典腑闂寸洰褰
欏佃〃
欏靛叏灞鐩褰曞寘鍚鑻ュ共欏典笂綰х洰褰曠殑鍦板潃錛岄〉涓婄駭鐩褰曞張渚濇″寘鍚鑻ュ共欏典腑闂寸洰褰曠殑鍦板潃錛岃岄〉涓闂寸洰褰曞張鍖呭惈鑻ュ共欏佃〃鐨勫湴鍧銆傛瘡涓涓欏佃〃欏規寚鍚戜竴涓欏墊嗐傜嚎鎬у湴鍧鍥犳よ鍒嗘垚浜斾釜閮ㄥ垎銆傚浘涓娌℃湁鏄劇ず浣嶆暟錛屽洜涓烘瘡涓閮ㄥ垎鐨勫ぇ灝忎笌鍏蜂綋鐨勮$畻鏈轟綋緋葷粨鏋勬湁鍏熾
瀵逛簬娌℃湁鍚鐢ㄧ墿鐞嗗湴鍧鎵╁睍鐨32浣嶇郴緇燂紝涓ょ駭欏佃〃宸茬粡瓚沖熶簡銆備粠鏈璐ㄤ笂璇達紝Linux閫氳繃浣庫滈〉涓婄駭鐩褰曗濅綅鍜屸滈〉涓闂寸洰褰曗濅綅鍏ㄤ負0錛屽交搴曞彇娑堜簡欏典笂綰х洰褰曞拰欏典腑闂寸洰褰曞瓧孌點備笉榪囷紝欏典笂綰х洰褰曞拰欏典腑闂寸洰褰曞湪鎸囬拡搴忓垪涓鐨勪綅緗琚淇濈暀錛屼互渚垮悓鏍風殑浠g爜鍦32浣嶇郴緇熷拰64浣嶇郴緇熶笅閮借兘浣跨敤銆傚唴鏍鎬負欏典笂綰х洰褰曞拰欏典腑闂寸洰褰曚繚鐣欎簡涓涓浣嶇疆錛岃繖鏄閫氳繃鎶婂畠浠鐨勯〉鐩褰曢」鏁拌劇疆涓1錛屽苟鎶婅繖涓や釜鐩褰曢」鏄犲皠鍒伴〉鍏ㄥ矓鐩褰曠殑涓涓鍚堥傜殑鐩褰曢」鑰屽疄鐜扮殑銆
鍚鐢ㄤ簡鐗╃悊鍦板潃鎵╁睍鐨32 浣嶇郴緇熶嬌鐢ㄤ簡涓夌駭欏佃〃銆侺inux鐨勯〉鍏ㄥ矓鐩褰曞瑰簲80脳86 鐨勯〉鐩褰曟寚閽堣〃(PDPT)錛屽彇娑堜簡欏典笂綰х洰褰曪紝欏典腑闂寸洰褰曞瑰簲80脳86鐨勯〉鐩褰曪紝Linux鐨勯〉琛ㄥ瑰簲80脳86鐨勯〉琛ㄣ
鏈鍚庯紝64浣嶇郴緇熶嬌鐢ㄤ笁綰ц繕鏄鍥涚駭鍒嗛〉鍙栧喅浜庣‖浠跺圭嚎鎬у湴鍧鐨勪綅鐨勫垝鍒嗐
鎬葷粨
榪欓噷鎴戜滑涓嶈ㄨ轟唬鐮佸疄鐜幫紝鍙鍏蟲敞鍘熺悊銆備粠涓婇潰鐨勮ㄨ哄彲浠ョ湅鍒板垎欏墊満鍒朵富瑕佷緷璧栫‖浠剁殑瀹炵幇銆侺inux閲囩敤鐨勫洓綰ч〉琛ㄥ彧鏄涓轟簡鏈澶у寲鍏煎逛笉鍚岀殑紜浠跺疄鐜幫紝鍗曞氨IA32鏋舵瀯鐨凜PU鏉ヨ達紝灝辨湁澶氱嶅垎欏靛疄鐜幫紝甯歌勫垎欏墊満鍒訛紝PAE鏈哄埗絳夈
鎴戜滑鉶界劧璁ㄨ虹殑鏄疞inux鐨勫垎欏墊満鍒訛紝瀹為檯涓婃垜浠鐢ㄤ簡澶ч儴鍒嗙瘒騫呮潵璁ㄨ篒ntel CPU鐨勫垎欏墊満鍒跺疄鐜般傚洜涓篖inux鐨勫垎欏墊満鍒舵槸寤虹珛鍦ㄧ‖浠跺熀紜涔嬩笂鐨勶紝涓嶅悓鐨勫鉤鍙伴渶瑕佹湁涓嶅悓鐨勫疄鐜般侺inux鍦ㄨ蔣浠跺眰闈㈡瀯閫犵殑鉶氭嫙鍦板潃錛屾渶緇堣繕鏄瑕侀氳繃MMU杞鎹涓虹墿鐞嗗湴鍧錛屼篃灝辨槸璇達紝涓嶇Linux鐨勫垎欏墊満鍒舵槸鎬庢牱瀹炵幇鐨勶紝CPU鍙鎸夌収瀹冪殑鍒嗛〉瀹炵幇鏉ヨВ璇葷嚎鎬у湴鍧錛屾墍浠Linux浼犵粰CPU鐨勭嚎鎬у湴鍧蹇呯劧鏄婊¤凍紜浠跺疄鐜扮殑銆備緥濡傝達細Linux鍦32浣岰PU涓婏紝瀹冪殑鍥涚駭欏佃〃緇撴瀯灝變細鍏煎瑰埌紜浠剁殑涓ょ駭欏佃〃緇撴瀯銆傚彲瑙侊紝Linux鍦ㄨ蔣浠跺眰闈涓婂仛浜嗕竴灞 鎶借薄錛岀敤鍥涚駭欏佃〃鐨勬柟寮忓吋瀹32浣嶅拰64浣岰PU鍐呭瓨瀵誨潃鐨勪笉鍚岀‖浠跺疄鐜般
Ⅶ 內存映射是怎麼回事
內存映射文件是由一個文件到一塊內存的映射,使進程虛擬地址空間的某個區域與磁碟上某個文件的部分或全部內容的建立映射。
建立映射後,通過該區域可以直接對被映射的磁碟文件進行訪問.而不必執行文件I/O操作也無需對文件內容進行緩沖處理。
就好像整個被映射的文件都載入到了內存一樣,因此內存文件映射非常適合於用來管理大文件。
內存映射文件對程序的提速,只在處理大文件或非常頻繁的文件讀寫操作時效果才明顯。
通過內存映射,相當於將磁碟上的文件所在空間建立成一塊虛擬內存,程序訪問時可按內存的方式進行,省去了普通io方式的一些環節,其實真正要讀寫操作時,會進行換頁,將這些個「虛擬內存」讀到物理內存中。
總之,內存映射文件是應用虛擬內存的技術來達到加速處理的