1. 程式人生 > >mmap內存映射

mmap內存映射

虛擬 lag 新的 pen 起點 技術 alt lose 文件描述符

前提:本文是基於Linux系統下的學習

補充:Linux系統下,一切皆文件

技術分享圖片

段錯誤的原因:

  訪問了沒有物理地址映射的虛擬地址或者是對改地址沒有訪問權限

#include <sys/mman.h>
void *mmap(void *addr, size_t length, int prot, int flags,
int fd, off_t offset);
功能:映射文件或設備到進程的虛擬地址空間
參數:
addr:指定了新的映射區的首地址。
length:指定了新的映射區的長度。NULL有內核選擇進程的映射區域。
prot:
PROT_EXEC Pages may be executed.
PROT_READ Pages may be read.
PROT_WRITE Pages may be written.
PROT_NONE Pages may not be accessed.

flags:
二選一:
MAP_SHARED:共享映射區域。對映射區域的更新顯示給另外的進程並同步到底層的文件。
MAP_PRIVATE:私有映射區域。對映射區域的內容進行的更改不顯示另外的映射到同一文件的進程。更新也不同步到底層的文件

MAP_ANONYMOUS:匿名映射,此時會忽略fd,不涉及文件。而且映射區域無法和其他進程共享。

fd:文件描述符
offset:被映射對象內容的起點

返回值:
成功 返回映射區域的首地址
錯誤 MAP_FAILED errno被設置

int munmap(void *addr, size_t length);
功能:解除映射區域
參數:
addr:映射區域的首地址。必須是頁的整數倍
length:指定了映射區域的長度
返回值:
成功 0
錯誤 -1 errno被設置

//將文件映射到虛擬內存,對其進行修改
#include <stdio.h>
#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
int main(int argc,char* argv[]){
    //以可讀可寫的方式打開文件
    int fd=open(argv[1],O_RDWR);
    if(fd==-1){
        perror("open"
); return -1; } int port=PROT_READ|PROT_WRITE; //將文件映射到虛擬內存 void* p=mmap(NULL,10,port,MAP_SHARED,fd,0); if(p==NULL){ perror("mmap"); return -1; } //映射成功後就可關閉文件 close(fd); //修改文件內容 strcpy((char*)p,"hahahaha"); //解除映射 munmap(p,10); return 0; }

mmap內存映射