linux mamp 设备内存
2019獨角獸企業(yè)重金招聘Python工程師標準>>>
mamp把文件內(nèi)容映射到一段內(nèi)存上(準確說是虛擬內(nèi)存空間上), 通過對這段內(nèi)存的讀取和修改, 實現(xiàn)對文件的讀取和修改,不需要read和write了。
頭文件:
<unistd.h>
<sys/mman.h>
原型: void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offsize);
返回值: 成功則返回映射區(qū)起始地址, 失敗則返回MAP_FAILED(-1).
參數(shù):
addr: 指定映射的起始地址, 通常設(shè)為NULL, 由系統(tǒng)指定
length: 將文件的多大長度映射到內(nèi)存
prot: 映射區(qū)的保護方式, 可以是:
???????PROT_EXEC: 映射區(qū)可被執(zhí)行.
???????PROT_READ: 映射區(qū)可被讀取.
???????PROT_WRITE: 映射區(qū)可被寫入.
???????PROT_NONE: 映射區(qū)不能存取.
flags: 映射區(qū)的特性, 可以是:
???? ?MAP_SHARED: 對映射區(qū)域的寫入數(shù)據(jù)會復(fù)制回文件, 且允許其他映射該文件的進程共享.
???? ?MAP_PRIVATE: 對映射區(qū)域的寫入操作會產(chǎn)生一個映射的復(fù)制(copy-on-write), 對此區(qū)域所做的修改不會寫回原文件.
fd: 由open返回的文件描述符, 代表要映射的文件.
offset: 以文件開始處的偏移量, 必須是分頁大小的整數(shù)倍, 通常為0, 表示從文件頭開始映射.
int munmap(void *start, size_t lenght)關(guān)閉內(nèi)存映射
start 起始地址上面函數(shù)返回的地址 lenght 長度 ;成功返回 0
映射步驟
用open系統(tǒng)調(diào)用打開文件, 并返回描述符fd.
用mmap建立內(nèi)存映射, 并返回映射首地址指針start.
對映射(文件)進行各種操作, 顯示(printf), 修改(sprintf).
用munmap(void *start, size_t lenght)關(guān)閉內(nèi)存映射.
用close系統(tǒng)調(diào)用關(guān)閉文件fd.
注意:memp不能更改文件中字符的長度,當寫入數(shù)據(jù)長度大于原來長度時,只保存原來長度的寫入值,如果數(shù)據(jù)小于原來長度,則只替換寫入的數(shù)據(jù),原來數(shù)據(jù)大于寫入數(shù)據(jù)長度的保留不變。
如源文件值12345 如果寫入 abcdefg 則只能寫入abcde ?如果寫入 abc 則值變?yōu)?abc45
想查看的話 地址如何分配指令
vi /proc/2074/maps ?(到/proc目錄下 查看模塊號 查看2074進程的地址分配情況)
使用mmap完成頁表的建立
remap_pfn_range 一次建立所有頁表
int remap_pfn_range(struct vm_area_struct *vma, unsigned long virt_addr, unsigned long pfn, unsigned long size, pgprot_t prot);?
wma:虛擬內(nèi)存區(qū)域指針 系統(tǒng)分配
virt_addr:虛擬地址的起始值
pfn:要映射的物理地址所在的物理頁幀號,可將物理地址>>PAGE_SHIFT得到
size:要映射的區(qū)域的大小
prot:vma保護屬性
例子
VM_IO將VMA標記為一個內(nèi)存映射的I/O區(qū)域
VM_RESERVED標記內(nèi)存區(qū)域不能被換出
轉(zhuǎn)載于:https://my.oschina.net/u/274829/blog/285840
總結(jié)
以上是生活随笔為你收集整理的linux mamp 设备内存的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: http://blog.csdn.net
- 下一篇: 关于linux特殊重定向的理解