一、記憶體對映介紹
linux對外設的一般操作,使用者空間不能直接對外設訪問,而是通過核心空間間接訪問,如下圖訪問磁碟
二、linux記憶體對映函式
mmap對映函式
功能:將乙個檔案或者其它物件對映進記憶體。檔案被對映到多個頁上,如果檔案的大小不是所有頁的大小之和,最後乙個頁不被使用的空間將會清零
返回:成功,返回被對映區的指標失敗時,失敗,返回map_failed(其為(void*)-1)
void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offsize);
引數:start:對映區的開始位址
length:對映區的長度
prot:對映區域的保護方式。可以為以下幾種方式的組合
prot_exec //頁內容可以被執行
prot_read //頁內容可以被讀取
prot_write //頁可以被寫入
prot_none //頁不可訪問
flags:指定對映物件的型別,對映選項和對映頁是否可以共享。它的值可以是乙個或者多個以下位的組合體
map_fixed //使用指定的對映起始位址,如果由 start和len 引數指定的記憶體區重疊於現存的對映空間,重疊部分將會被丟 棄。如果指定的起始位址不可用,操作將會失敗。並且起始位址必須落在頁的邊界上
map_shared //與其它所有對映這個物件的程序共享對映空間。對共享區的寫入,相當於輸出到檔案。直到 msync()或者munmap() 被呼叫,檔案實際上不會被更新
map_private //建立乙個寫入時拷貝的私有對映。記憶體區域的寫入不會影響到原檔案。這個標誌和以上標誌是互斥的,只能使用其中乙個
map_denywrite //這個標誌被忽略
map_executable //同上
map_noreserve //不要為這個對映保留交換空間。當交換空間被保留,對對映區修改的可能會得到保證。當交換空間不被保留,同時記憶體不足,對對映區的修改會引起段違例訊號
map_locked //鎖定對映區的頁面,從而防止頁面被交換出記憶體
map_growsdown //用於堆疊,告訴核心vm系統,對映區可以向下擴充套件
map_anonymous //匿名對映,對映區不與任何檔案關聯
map_anon //map_anonymous 的別稱,不再被使用
map_file //相容標誌,被忽略
map_32bit //將對映區放在程序位址空間的低 2gb,map_fixed 指定時會被忽略。當前這個標誌只在 x86-64平台上得到支援
map_populate //為檔案對映通過預讀的方式準備好頁表。隨後對對映區的訪問不會被頁違例阻塞。
map_nonblock //僅和map_populate 一起使用時才有意義。不執行預讀,只為已存在於記憶體中的頁面建立頁表入口
fd:有效的檔案描述詞。
offset:被對映物件內容的起點
munmap取消對映函式
功能:刪除特定位址區域的物件對映
返回:成功 0 失敗 -1
int munmap(void *start, size_t length);
引數:start:對映區的開始位址
length:對映區的長度
三、示例
1、lcd顯示屏
fbfd =
open
("/dev/fb0"
, o_rdwr)
;fbp =
mmap(0
,screensize,prot_read | prot_write,map_shared, fbfd,0)
;*(fbd + y*vinfo.xres + x)
= c;
Linux記憶體對映
使用記憶體對映處理大檔案很方便,在windows系統中,實現了這樣的藉口。在linux中我們也可以通過mmap函式來實現。以下內容完全參考自 如有冒犯,請諒解 mmap函式實現把乙個檔案對映到乙個記憶體區域,從而我們可以像讀寫記憶體一樣讀寫檔案,他比單純呼叫read write也要快上許多。在某些時...
Linux記憶體對映
本文討論的linux版本是linux 2.6.26.5,體系結構是smdk2410,採用arm s3c2410。在該版本中虛擬位址是32位位址,採用四級頁表結構,依次是 pgd pud pmd pte offset page shift pmd shift pud shift pgdir shift...
linux記憶體對映
記憶體管理分為對連續物理記憶體區管理和非連續記憶體區管理,本文主要講解連續的物理記憶體區管理的技術中所涉及到的核心線性位址空間對映的相關知識。涉及到的東西有 頁框,管理區 高階記憶體,低端記憶體 高階記憶體對映等,這些知識是掌握夥伴系統演算法和slab分配器的基礎。一 頁框 頁框為物理記憶體分配的基...