努力成为linux kernel hacker的人李万鹏原创作品,为梦而战。转载请标明出处
http://blog.csdn.net/woshixingaaa/archive/2011/06/02/6462151.aspx
内存映射函数mmap负责把文件内容映射到进程的虚拟内存空间,通过对这段内存的读取和修改,来实现对文件的读取和修改,而不需要再调用read,write等操作。
addr:指定映射的起始地址,通常设为NULL,由系统指定。
length:映射到内存的文件长度。
prot:映射的保护方式,可以是:
PROT_EXEC:映射区可被执行
PROT_READ:映射区可被读取
PROT_WRITE:映射区可被写入
PROT_NONE:映射区不能存取
Flags:映射区的特性,可以是:
MAP_SHARED:
写入映射区的数据会复制回文件,且允许其他映射该文件的进程共享。
MAP_PRIVATE:
对映射区的写入操作会产生一个映射区的复制(copy_on_write),对此区域所做的修改不会写回原文件。
fd:由open返回的文件描述符,代表要映射的文件。
offset:以文件开始处的偏移量,必须是分页大小的整数倍,通常为0,表示从文件头开始映射。
解除映射:
功能:取消参数start所指向的映射内存,参数length表示欲取消的内存大小。
返回值:解除成功返回0,否则返回-1,错误原因存在于errno中。
虚拟地址区域:vm_area_struct
Linux内核使用结构vm_area_struct(<linux/mm_types.h>)描述虚拟内存区域,其中几个主要成员如下:
unsigned long vm_start 虚拟内存区域起始地址
unsigned long vm_end 虚拟内存区域结束地址
unsigned long vm_flags 该区域的标志
如:VM_IO和VM_RESERVED。VM_IO将该VMA标记为内存映射的IO区域,VM_IO会阻止系统将该区域包含在进程的存放转存(core dump)中,VM_RESERVED标志内存区域不能被换出。
mmap设备操作
映射一个设备是指把用户空间的一段地址关联到设备内存上,当程序读写这段用户空间的地址时,它实际上是在访问设备。这里需要做的两个操作:
1.找到可以用来关联的虚拟地址区间
2.关联
其中找到可以用来关联的虚拟地址区间是由内核完成的,mmap只要关联这个操作。
mmap方法是file_operations结构的成员,在mmap系统调用发出时被调用。在此之前,内核已经完成了很多工作。mmap设备方法所需要做的就是建立虚拟地址到物理地址的页表。
其中第二个参数struct vm_area_struct *相当于内核找到的,可以拿来用的虚拟内存区间。
mmap完成页表的建立:
方法有二:
1.使用remap_pfn_range一次建立所有页表;
2.使用nopage VMA方法每次建立一个页表;
构造页表的工作可由remap_pgn_range函数完成,原型如下:
vma是内核为我们找到的虚拟地址空间,addr要关联的是虚拟地址,pfn是要关联的物理地址,size是关联的长度是多少。
mmap设备操作实例:
先说一下对于ARM而言虚拟地址与物理地址的关系:
在arch/arm/include/asm/memory.h中:
上面转换过程的PAGE_OFFSET通常为3G,而PHYS_OFFSET则定于为系统DRAM内存的基地址。因此,对于我们的开发板,并不是将0地址映射到3G,而是将外接的SDRAM的首地址映射到3G。注意:这里的virt_to_phys和phys_to_virt方法仅适用于896MB以下的低端内存,高端内存的虚拟地址与物理地址之间不存在如此简单的换算关系。下边是fbmem.c中的mmap操作,示意图如下:
分享到:
相关推荐
Linux驱动修炼之道-内存映射.pdf Linux驱动修炼之道-看门狗框架源码分析.pdf Linux驱动修炼之道-触摸屏驱动之s3c2410_ts源码分析.pdf Linux驱动修炼之道-SPI驱动框架源码分析(中).pdf Linux驱动修炼之道-...
2 创建磁盘文件内存映射对象,通过操作内存映射对象来修改磁盘文件内容,可以实现修改非常巨大文件的修改(16EB)。 3 在分页系统(虚存)上建立命名内存映射对象,然后不同进程间通过此对象实现海量数据共享或交换。 ...
这篇文章描述的在linux下设备驱动的内存映射
NXP的Cortex-M0内核LPC111x系列中文手册-内存映射
python读书笔记,包含记录数组-内存映射-从 Matlab 到 Numpy
计算机软件-商业源码-内存映射文件Delphi7源码.zip
详细介绍使用mmap实现V4L2视频处理机制,包括具体流程,部分参考代码,原理讲解,相信对初学同学有一定帮助
内存映射技术在Linux驱动程序中的应用和实现.pdf
很好的内存映射的说明,讲述了X86在linux上是怎么进行物理内存到虚拟内存的映射的
本文完整阐述了内存映射的机理。对于提供了MMU(存储管理器,辅助操作系统进行内存管理,提供虚实地址转换等硬件支持)的处理器而言,Linux提供了复杂的存储管理系统,使得进程所能访问的内存达到4GB。 进程的4GB...
一个简单的嵌入式linux内存映射例子,包括静态映射和动态映射。
而 Posix或系统V的共享内存IPC则纯粹用于共享目的,当然mmap()实现共享内存也是其主要应用之一。 mmap系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以像访问...
分析了Win32系统下的虚拟内存系统模式及内存映射文件的工作机理,介绍了如何用Windows API将文件映射至内存,并通过实验数据得出,采用内存映射文件在对大数据量文件进行存取,其效率远远高于传统的基于I/O方式的...
| `-- 静态映射范例 | `-- mach-smdk2440.c |-- 12 | |-- NVRAM驱动 | | `-- generic_nvram.c | |-- 触摸屏驱动 | | |-- 作为input设备 | | | |-- s3c2410_ts.c | | | `-- s3c2410_ts.h | | `-- 作为普通字符设备 | ...
| `-- 静态映射范例 | `-- mach-smdk2440.c |-- 12 | |-- NVRAM驱动 | | `-- generic_nvram.c | |-- 触摸屏驱动 | | |-- 作为input设备 | | | |-- s3c2410_ts.c | | | `-- s3c2410_ts.h | | `-- 作为普通字符设备 | ...
1.掌握字符设备驱动程序中利用nopage进行内存映射的方法。 2.掌握利用get_free_pages进行连续物理地址空间申请的方法 二、实验环境 Linux 3.14.0 嵌入式开发板 三、实验内容及实验原理 写一个简单的驱动程序,...
实际工作中遇到超大文件读写时很多系统需要等待较长时间,给用户体验不佳。本文结合源码讲解了超大文件的内存映射读写方式。内存映射方式极大的提高了读写效率,提升用户体验感。
linux内存映射
Linux 设备驱动开发详解 linuxdriver_code_tool |-- 03 | `-- 2.6内核升级工具 | |-- device-mapper-1.00.19-2.i386.rpm | |-- lvm2-2.00.25-1.01.i386.rpm | |-- mkinitrd-4.2.0.3.tar.tar | |-- module-init-tools...
LINUX下PC104总线接口的内存映射.pdf