- 浏览: 17331 次
最新评论
mmap内存映射操作之一
2011年06月09日
本博客文章欢迎转载,请务必注明出处。 转载请注明出处:http://blog.csdn.net/jarvis_xian 版权所有:jarvis_xian 个人邮箱:jarvis_xian@163.com
我们在驱动的代码当中,经常需要把硬件地址映射到虚拟内存上面去,这就是我们需要学习mmap的原因所在了!正所谓磨刀不误砍柴工,让我们静下心来学习一下这个十分有用的工具吧。
prototype : void *mmap(void *start, size_t length, int prot, int flags,
int fd, off_t offset);
parameter : start : 映射区的开始地址。(一般建议为null,让内核帮我们自动寻找一个合适的地址)
length : 映射区的长度。
prot:期望的内存保护标志,不能与文件的打开模式冲突。是以下的某个值,可以通过or运
算合理地组合在一起。
PROT_EXEC //页内容可以被执行
PROT_READ //页内容可以被读取
PROT_WRITE //页可以被写入
PROT_NONE //页不可访问
flags:指定映射对象的类型,映射选项和映射页是否可以共享。它的值可以是一个或者多
个以下位的组合体。
MAP_SHARED //与其它所有映射这个对象的进程共享映射空间。对共享区的写
入,相当于输出到文件。直到msync()或者munmap()被调
用,文件实际上不会被更新。
MAP_PRIVATE //建立一个写入时拷贝的私有映射。内存区域的写入不会影响到原
文件。这个标志和以上标志是互斥的,只能使用其中一个。
(还有更多可选参数,具体网上易得) fd:有效的文件描述词。 offset:被映射对象内容的起点。
return : 返回所映射的虚拟内存首地址。
例程如下 #include #include #include #include #include #include int main() { int fd; char *start; char buf[100]; /*打开文件*/ fd = open("testfile",O_RDWR); start=mmap(NULL,100,PROT_READ|PROT_WRITE,MAP_SHARE D,fd,0); /* 读出数据 */ strcpy(buf,start); printf("buf = %s\n",buf); /* 写入数据 */ strcpy(start,"Buf Is Not Null!"); munmap(start,100); /*解除映射*/ close(fd); return 0; } 1、测试例程先打开测试文件testfile,取得文件描述符fd。并通过调用mmap函数把测试文件映射到虚拟内存当中去,其首地址返回到指针start。
2、读出数据时,直接strcpy,从虚拟内存的首地址开始复制字符串到buf,其实质就是把测试文件testfile的内容复制到buf(事先已经做了映射)。
3、写入数据时,同样通过strcpy即可,但是需要注意的事,写入数据的动作,不会改变测试文件的长度。亦即测试文件原来内容的长度为10个字节,如果我们写入多于10个字节的内容进去,文件只会保存前10个。如果写入少于10个字节长度的内容,那后面没有实际内容的空余字节会出现乱码。
4、munmap函数的作用是解除映射,一般与mmap配对使用,该函数相对简单,在这里不做详细介绍。
通过以上分析,我们采用了内存映射的方法来代替了传统的read、write等系统调用,可能相对于文件来说其便捷性还不能充分得以展示,倘若运用在硬件物理地址映射到虚拟内存地址上,其效果就能很好地体现出来了。
发表评论
-
MTD NAND Analysis 1
2012-01-20 08:14 706MTD NAND Analysis 1 2011年05月06 ... -
内存映射对于大文件的使用
2012-01-20 08:14 655内存映射对于大文件的使用 2011年04月28日 平时很 ... -
rtems 下linkcmd分析代码
2012-01-20 08:14 960rtems 下linkcmd分析代码 2010年11月09日 ... -
连傻瓜都能看懂的基于代码注入的线程守护技术
2012-01-20 08:14 1650连傻瓜都能看懂的基于 ... -
S7-300 PLC的串口无线通讯在火电厂污水处理中的应用
2012-01-19 13:31 672S7-300 PLC的串口无线通讯 ... -
IIS32位和64位切换
2012-01-19 13:31 856IIS32位和64位切换 2011年12月22日 X64 ... -
两平台下的自动登录telnet设置
2012-01-19 13:30 630两平台下的自动登录telnet设置 2011年12月28日 ... -
延时批处理
2012-01-19 13:30 784延时批处理 2012年01月12日 举个例子,我们要延时 ... -
ActionScript垃圾回收
2012-01-17 03:20 944ActionScript垃圾回收 2011年10月26日 ... -
计算机故障大全(二)
2012-01-17 03:20 630计算机故障大全(二) 2010年06月02日 硬盘 ... -
琢石成器――windows环境下32位汇编语言程序设计(第三版)笔记
2012-01-17 03:20 2060琢石成器――windows环境下32位汇编语言程序设计(第三版 ... -
WinCE驱动开发问题精华集锦
2012-01-17 03:20 586WinCE驱动开发问题精华 ... -
钢蹦爸爸的自白
2012-01-16 01:54 659钢蹦爸爸的自白 2009年10月24日 怀着复杂的心情 ... -
爱韩庚的100个理由
2012-01-16 01:54 621爱韩庚的100个理由 2009 ... -
火车上的随想
2012-01-16 01:54 543火车上的随想 2011年02 ... -
jbpm3通过processDefinition.createProcessInstance()为什么能保存ProcessInstance之迷
2012-01-11 01:53 698jbpm3通过processDefinition.create ... -
Android自定义VIEW取得XML的自定义值
2012-01-11 01:53 665Android自定义VIEW取得XML的自定义值 2011年 ... -
常用的正则表达式--Java
2012-01-11 01:53 698常用的正则表达式--Java 2011年08月01日 是 ... -
图片传输问题,IO操作
2012-01-11 01:52 580图片传输问题,IO操作 2011年08月01日 原题: ... -
jsp编码过滤器的配置和使用-用心做程序-iteye技术网站
2012-01-11 01:52 677jsp编码过滤器的配置和使用-用心做程序-iteye技术网站 ...
相关推荐
而 Posix或系统V的共享内存IPC则纯粹用于共享目的,当然mmap()实现共享内存也是其主要应用之一。 mmap系统调用使得进程之间通过映射同一个普通文件实现共享内存。普通文件被映射到进程地址空间后,进程可以像访问...
mmap内存映射机制分析
建立一个文件的内存映射将使用操作系统虚拟内存来直接访问文件系统上的数据,而不是使用常规的I/O函数访问数据。内存映射通常可以提供I/O性能,因为使用内存映射是,不需要对每个访问都建立一个单独的系统调用,也不...
这个是摄像头内存映射方式的使用方法,很适合初学者使用
linux下的内存映射函数mmap详解及示例代码.pdf
内含实验报告+实验源码+截图 ...③编写应用程序利用mmap进行内存映射,读写映射内存区域,通过打印输出观察具体每个页面实际进行内存映射的时机; ④在卸载驱动程序时利用free_pages释放申请到的64KB空间
再进行分页显示,表格固定的是一百行,每次操作对这一百行数据进行刷新,虚拟出完整表格的效果。 测试:QTableWidge分页显示1千万行数据,建立mmap文件映射,只读取需要显示的部分文件内容,此种方式速度快,占用...
介绍应用使用mmap以及到kernel内部的映射实现过程以及实例代码
linux下的内存映射函数mmap详解及示例代码.doc
使用mmap函数查看内存/寄存器 因为开发板没有装gdb,所以用这个来代替查看物理内存/寄存器等. 注意mmap是基于页对齐映射的.所以地址必须是4k的倍数.
Linux设备驱动之mmap设备操作,对mmap函数的解释,值得一看
这个linux下,实现内核内存地址映射到用户空间例程
平凡的MMAP Trivial-MMAP 是一个 Common Lisp 库,旨在提供一个高级的、易于使用的 API 来处理内存映射文件。 该库导出以下符号: mmap-file一个将文件映射到内存并返回一个包含指向内存映射文件的指针以及其他元...
液晶屏在设计驱动的时候,都要设置显存,液晶屏上显示的内容都是来自于显存。把要显示的内容(数据)写入显存,液晶屏上就显示了图片、文字...在这里使用内存映射(mmap函数)实现了对bmp图片的显示,硬件平台为GEC6818
Linux下的内存映射实现方式,mmap和unmmap介绍
mmap作为Linux内存管理的关键之一.docx
里面包括 1. 一个用户空间的mmap将文件映射到内存进行操作的例子 2. 一个mmap内核驱动及对应的mmap用户空间的程序。
详细介绍mmap 内核态映射到用户态的使用
编写Linux内存映射驱动时在网页上查找到的资料,自认为不错。