关闭

mmap设备操作

514人阅读 评论(0) 收藏 举报

mmap系统调用如下:

void* mmap(void *start, size_t length, int prot, int flags, int fd, off_t offset);

addr:指定映射的起始地址,通常设置为NULL,由系统指定;

length:映射到内存的文件长度;

prot:映射区的保护方式,可以是PROT_EXEC,PROT_READ,PROT_WRITE;

flags:映射区的特性,可以是MAP_SHARED,MAP_PRIVATE;

fd:由open返回的文件描述符,表示要映射的文件;

offset:文件开始处的偏移量,必须是分页大小的整数倍,通常为0,表示从文件头开始映射;

内存映射函数mmap:负责把文件内容映射到进程的虚拟地址空间中,映射之后,通过对这段内存的读取和修改,来实现对文件的读取和修改,而不需要再调用read,write等函数。

(文件在open之后直接mmap映射,然后用指针操作即可)

 

munmap系统调用如下:

int munmap(void *start,size_t length);

取消参数start所指向的映射内存,参数length表示欲取消映射的内存的大小;

(close之前要先调用munmap解除映射)

 

代码实例:

#include <stdio.h>

#include <sys/types.h>

#include <sys/stat.h>

#include <fcntl.h>

#include <unistd.h>

#include <string.h>

#include <sys/mman.h>

 

int main(int argc, char** argv)

{

        int fd = 0;

        char *start =NULL;

        charbuffer[100] = {0};

 

        fd =open("testfile", O_RDWR);

 

        start =mmap(NULL, 100, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

 

        strcpy(buffer,start);

       printf("buffer = %s\n", buffer);

 

        strcpy(start,"now buffer is not null!");

 

        munmap(start,100);

 

        close(fd);

 

        return 0;

}

执行结果:


(mmap系统调用不会影响原来文件的长度)


虚拟内存区域

虚拟内存区域是进程的虚拟地址空间中的一个同质区间,即具有同样特性的连续地址范围。

一个进程的内存映像由下面几部分组成:程序代码,数据,BSS,栈区域,以及内存映射的区域。

(每个进程都有自己独立的虚拟地址空间)

进程的虚拟内存区域可以通过/proc/pid/maps查看:


每一行的域为:

start-end perm offset major:minor inode

start:该区域的起始虚拟地址;

end:该区域的结束虚拟地址;

perm:读写和执行权限,表示对这个区域,允许进程做什么,这个域的最后一个字符要么是p表示私有的,要么是s表示共享的;

offset:被映射部分在文件中的起始地址;

major、minor:主次设备号;

inode:索引节点;

 

Linux内核中,使用结构vm_area_struct(<linux/mm_types.h>)来描述虚拟内存区域:

 struct vm_area_struct
{
struct mm_struct * vm_mm;/* The address space we belong to. */
unsigned long vm_start;/* Our start address within vm_mm. */
unsigned long vm_end;/* The first byte after our end address within vm_mm. */

/* linked list of VM areas per task, sorted by address */
struct vm_area_struct *vm_next;

pgprot_t vm_page_prot;/* Access permissions of this VMA. */
unsigned long vm_flags;/* Flags, see mm.h. */

...

};


映射一个设备是指把用户空间的一段地址关联到设备内存(设备的物理地址)上,用户空间的地址会由系统提供,设备内存的地址通过查询可以获得,因此我们只需要关心“物理地址与虚拟地址如何关联”?

建立虚拟地址到物理地址的页表。

那么又是“如何建立页表”?

方法有两种:

1、 使用remap_pfn_range一次建立所有页表;

2、 使用nopageVMA方法每次建立一个页表;

 

int remap_pfn_range(struct vm_area_struct *vma, unsigned longaddr,

                  unsigned long pfn, unsigned long size,pgprot_t prot)

remap_pfn_range - remap kernel memory to userspace;

vma: user vma to map to,虚拟内存区域指针;

addr: target user address to start at,虚拟地址的起始值;

pfn: physical address of kernel memory,要映射的物理地址所在的物理页帧号,可将物理地址>>PAGE_SHIFT得到;

size: size of map area,要映射的区域的大小;

prot: page protection flags for this mapping,VMA的保护属性;



0
0
查看评论

mmap 设备操作

mmap内存映射是现代 Unix 系统最有趣的特性之一. 至于驱动, 内存映射可被实现来提供用户程序对设备内存的直接存取.
  • shaoguangleo
  • shaoguangleo
  • 2010-08-18 19:55
  • 1946

设备IO之一(mmap、直接IO以及异步IO)

现在,在linux中经常可以看到在用户空间编写的驱动程序,比如X服务器,一些厂商的私有驱动等等,这就意味着用户空间取得了对硬件的访问能力,这通常是通过mmap将设备内存映射到了用户进程空间,从而使得用户可以通过读写这些内存来获取对硬件的访问能力。 内核一般会对I/O操作进行缓冲以获取更好的性能,但是...
  • goodluckwhh
  • goodluckwhh
  • 2013-11-22 18:58
  • 4776

Linux设备驱动之mmap设备操作(memdev.c字符设备驱动分析)

from:  http://blog.csdn.net/mirkerson/article/details/8232422 http://blog.chinaunix.net/uid-25906157-id-1754499.html 1.mmap系统调用 void *mmap(v...
  • damotiansheng
  • damotiansheng
  • 2015-04-02 16:26
  • 2142

mmap设备操作

mmap设备操作 映射一个设备是指把用户空间的一段地 址关联到设备内存上。当程序读写这段 用户空间的地址时,它实际上是在访问 设备。 mmap设备方法需要完成什么功能? mmap方法是file_oprations结构的成员,在mmap 系统调用发出时被调用。在此之前,内核已经完成 了...
  • weicao1990
  • weicao1990
  • 2014-11-24 13:58
  • 394

利用mmap()操作硬件寄存器

树莓派的gpio
  • litao31415
  • litao31415
  • 2015-02-12 10:47
  • 1135

linux设备驱动之mmap函数

1.mmap系统调用 void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset); 功能:负责把文件内容映射到进程的虚拟地址空间,通过对这段内存的读取和修改来实现对文件的读取和修改,而不需要再调用re...
  • luckywang1103
  • luckywang1103
  • 2013-11-28 18:03
  • 972

Linux设备驱动之mmap设备操作

1.mmap系统调用 void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset); 功能:负责把文件内容映射到进程的虚拟地址空间,通过对这段内存的读取和修改来实现对文件的读取和修改,而不需...
  • a8039974
  • a8039974
  • 2014-11-16 10:49
  • 445

Linux 设备驱动--- mmap设备操作

mmap 系统调用-映射:           void   * mmap  ( void  * addr , size_t  len ,  int  prot , int  f...
  • yikai2009
  • yikai2009
  • 2013-03-09 18:33
  • 1689

mmap设备操作-内存映射,把文件映射到内存中(国嵌笔记)

1.mmap 功能:内存映射,负责把文件内容映射到进程的虚拟地址空间,通过对这段内存的读取和修改,来实现对文件的读取和修改,而不需要再调用read,write等操作。 返回:起始地址 2.参数 addr:指定映射的起始地址,通常设为NULL,由系统指定 length:映射到内存的文件长度。...
  • G1036583997
  • G1036583997
  • 2015-03-10 20:47
  • 1112

Linux驱动mmap内存映射

mmap
  • chenshengfa
  • chenshengfa
  • 2016-01-14 19:50
  • 3117
    个人资料
    • 访问:515490次
    • 积分:6910
    • 等级:
    • 排名:第4004名
    • 原创:297篇
    • 转载:7篇
    • 译文:2篇
    • 评论:53条
    文章分类
    最新评论