Linux作業系統:快速記憶體操作技術(轉)

ba發表於2007-08-12
Linux作業系統:快速記憶體操作技術(轉)[@more@]我們總希望能在核心空間和使用者空間自由交換資料,傳統的方式是採用核心提供的vma機制,透過copy_to/from_user之類的方法來實現。這對於高速資料塊傳送是不可取的。

其實kswapd有時交換資料至外存時,效能相當差,一般而言,你的PC主存並不見得就用盡了,而且很多應用並是你所關心的,但卻實實在在消耗你的計算資源,此時,你可能會想到採用實地址操作你的應用(儘管有MMU的支援),在uClinux中,當沒有MMU時,工作起來是挺爽的。

最方便的,最高效的,無非是實地址下,操作實體記憶體,相當於DMA。儘管Linux 2.6核心在VMA方面的效能要優於2.4,但swap機制有一定的缺限。在VxWorks中,對記憶體的管理是很細緻且精確的。如果你在Linux下申請大塊記憶體操作時,當觸發kswap快速交換回主存時,你會發現你的計算機

哪一段時間,幾乎要休息幾分鐘,儘管你看起來free輸出的頁面已經很多了,但此時的外存幾乎一直忙著,且CPU負荷相當重,這時也可能你根本就沒做任何操作。

有沒有辦法既在VMA機制下工作,又能直接處理主存資料呢?

回答是肯定的:

核心啟動後,會將主存對映為/dev/mem,當我們在VMA中申請一塊邏輯區間後,將轉換的實體地址傳與使用者空間,使用者空間就可以線性操作這段區間了,直接採用mmap就可以在物理主存中讀寫。

還有更快的方式嗎?不採用mmap行嗎?

當然有,當VMA將物理區塊地址及大小傳與使用者空間後,使用者完全可以採用地址讀寫模式,這幾近於機器指令操作了。(可以獨立於OS之外)

此種實現方式很簡單,首先開啟/dev/mem,直接定位至VMA傳上來的地址就可以操作了,無需mmap。通知使用者空間,可以採用procfs/sysfs等。

強烈建議:在邊界控制上,一定要精確細緻,不推薦初學者採用,一旦越界,可能引起“Kernel Panic”

更有可能就DOWN了。

對於此實現方式,建議參考mapper(LDD3)程式。

同時,也可以用mapper檢查讀寫是否正確。

新的IA32中,PAGE_SIZE = 4K MAX_ORDER = 11

gfp最大申請4M線性邏輯空間,減去PAGE_OFFSET即可得到實體地址。

如果採用了HIMEM和NUMA,請參見Kernel關於記憶體對映的演算法。

當主存達到1G或超過時,請減小使用者空間大小。

隨著硬體技術的發展,VMA在主存相當大時,可以考慮進行修正,完全可以集中採用物理對映方式。沒必要交換了。否則,反而影響效能。

32位平臺,如果主存2G,採用SWAP會使得效能有較大下降。

而在大容量資料傳輸時,也不可能採用SWAP方式的,不允許換出。

建議Linus在VMA中加入程式分類,不平類別的應用,分配不同的記憶體塊。

小資料PAGE_SIZE = 4K/大資料4M/128M

地址模式全轉換為64位,相容32位,當應用於Embedded系統時,直接使用32位模式。

如將做成多個微系統,不同微核,執行不同應用(不同的程式管理,記憶體管理,檔案管理),只是介面可以統一,不同標誌而已。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10617731/viewspace-950406/,如需轉載,請註明出處,否則將追究法律責任。

相關文章