- 浏览: 17635 次
最新评论
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 722MTD NAND Analysis 1 2011年05月06 ... -
内存映射对于大文件的使用
2012-01-20 08:14 666内存映射对于大文件的使用 2011年04月28日 平时很 ... -
rtems 下linkcmd分析代码
2012-01-20 08:14 986rtems 下linkcmd分析代码 2010年11月09日 ... -
连傻瓜都能看懂的基于代码注入的线程守护技术
2012-01-20 08:14 1660连傻瓜都能看懂的基于 ... -
S7-300 PLC的串口无线通讯在火电厂污水处理中的应用
2012-01-19 13:31 685S7-300 PLC的串口无线通讯 ... -
IIS32位和64位切换
2012-01-19 13:31 869IIS32位和64位切换 2011年12月22日 X64 ... -
两平台下的自动登录telnet设置
2012-01-19 13:30 644两平台下的自动登录telnet设置 2011年12月28日 ... -
延时批处理
2012-01-19 13:30 797延时批处理 2012年01月12日 举个例子,我们要延时 ... -
ActionScript垃圾回收
2012-01-17 03:20 964ActionScript垃圾回收 2011年10月26日 ... -
计算机故障大全(二)
2012-01-17 03:20 642计算机故障大全(二) 2010年06月02日 硬盘 ... -
琢石成器――windows环境下32位汇编语言程序设计(第三版)笔记
2012-01-17 03:20 2085琢石成器――windows环境下32位汇编语言程序设计(第三版 ... -
WinCE驱动开发问题精华集锦
2012-01-17 03:20 599WinCE驱动开发问题精华 ... -
钢蹦爸爸的自白
2012-01-16 01:54 668钢蹦爸爸的自白 2009年10月24日 怀着复杂的心情 ... -
爱韩庚的100个理由
2012-01-16 01:54 634爱韩庚的100个理由 2009 ... -
火车上的随想
2012-01-16 01:54 553火车上的随想 2011年02 ... -
jbpm3通过processDefinition.createProcessInstance()为什么能保存ProcessInstance之迷
2012-01-11 01:53 710jbpm3通过processDefinition.create ... -
Android自定义VIEW取得XML的自定义值
2012-01-11 01:53 674Android自定义VIEW取得XML的自定义值 2011年 ... -
常用的正则表达式--Java
2012-01-11 01:53 715常用的正则表达式--Java 2011年08月01日 是 ... -
图片传输问题,IO操作
2012-01-11 01:52 590图片传输问题,IO操作 2011年08月01日 原题: ... -
jsp编码过滤器的配置和使用-用心做程序-iteye技术网站
2012-01-11 01:52 692jsp编码过滤器的配置和使用-用心做程序-iteye技术网站 ...
相关推荐
### Linux设备驱动之内存映射详解 #### 一、引言 在Linux系统中,内存映射技术是一项关键技能,特别是在设备驱动开发领域。本文旨在深入解析Linux设备驱动中的内存映射机制,涵盖其概念、原理及具体实现方式,帮助...
Linux下的内存映射机制mmap是Linux内核中的一种机制,允许进程将文件映射到自己的地址空间中,从而实现文件I/O操作。该机制是基于虚拟存储(Virtual Memory,VM)概念的,VM是Linux内核中的一种机制,用于管理进程的...
总之,Linux内存映射是其强大功能之一,为开发者提供了高效、灵活的数据访问手段。理解和掌握这一技术对于编写高效的系统级代码和驱动程序至关重要。在实际开发中,根据具体需求选择合适的映射类型,结合良好的内存...
### Linux 设备驱动之 mmap 设备操作详解 #### 一、mmap 系统调用 mmap 是一种用于将文件或设备映射到进程地址空间的重要系统调用。通过这种方式,用户可以直接对映射区域进行读写操作,从而达到对文件或设备进行...
总之,mmap是Linux内存管理中不可或缺的一部分,它提供了高效、灵活的内存映射功能,使得文件操作和进程间通信更为便捷。理解并掌握mmap的使用,对于优化系统性能和编写高效的系统级程序至关重要。
V4L2支持多种视频设备,例如摄像头、电视卡等,并且可以利用内存映射(mmap)和直接I/O读取(read)的方式来采集视频数据。内存映射方式特别适合连续视频数据的采集,因为它可以减少数据复制的开销,提高效率。 ...
### Linux下的内存映射...通过`mmap()`和`munmap()`系统调用,Linux操作系统为开发者提供了一种简单有效的方式来管理和操作内存映射。无论是用于共享内存还是高效文件访问,内存映射都是现代操作系统不可或缺的一部分。
ioremap 和 mmap 是 Linux 内存的关键操作,用于将外设的 I/O 内存资源映射到内核的虚拟地址空间上。 在 Linux 系统中,物理地址、总线地址和虚拟地址是 üç种不同的地址空间。物理地址是 CPU 地址总线传来的地址...
### Linux之V4L2基础编程_内存映射详解 #### 一、概述与背景 在Linux环境下,视频设备(如摄像头)的操作通常涉及到复杂的I/O控制和数据处理。为了提高性能并简化开发过程,V4L2(Video for Linux 2)提供了多种...
在Linux内核中,mmap不仅仅是一个简单的内存映射操作,它还包含了对映射区域保护属性的设置。保护属性定义了映射区域的访问权限,如是否可读、可写、可执行等。这些保护属性对于确保进程的安全性至关重要。Linux内核...
mmap是Linux系统调用之一,它允许用户空间程序直接映射内核空间的物理地址到其虚拟地址空间,从而实现用户空间与内核空间的数据交换,而无需通过系统调用来传递数据。这种方式减少了上下文切换的开销,提高了I/O...
虚拟内存和内存映射文件在概念上有相似之处,都是一种将部分数据存储在物理内存中,其余部分存储在硬盘上的机制。它们都是程序动态运行的基础,对用户透明。虚拟内存实际上是硬盘的一部分,是RAM和硬盘之间的数据...
`mmap`是内存映射文件的一种技术,允许用户空间程序直接与内核空间共享同一块物理内存,从而高效地读写大块数据。在本案例中,`fb.tar.gz_fb mmap_frambuffer_linux fb mmap`的标题暗示我们将探讨如何使用mmap函数与...
在 Linux 中,内存管理的基本思想之一,是只有在真正访问一个地址的时候才建立这个地址的物理映射。这意味着,Linux 只有在进程真正需要使用内存时,才将虚拟地址空间映射到内存中。这可以提高内存的使用效率,并...
Linux内存管理编程是操作系统核心部分的关键技术之一,它涉及到如何高效地分配、使用和回收内存资源。本实验旨在帮助你深入理解Linux环境下的内存管理机制,主要包括内存映射(mapping)和解除映射(unmapping),...
mmap文件是一种基于内存映射的文件格式,常用于思维导图软件MindManager中,它可以将文件内容直接映射到内存,从而提高读取和编辑的效率。MindManager是一款功能强大的思维导图软件,它支持创建、分享和协作编辑复杂...
`do_mmap_pgoff()`是建立文件映射的核心函数之一,位于`src/linux-2.4.20/mm/mmap.c`文件中。此函数负责处理映射的创建,包括文件映射和匿名映射。它接收要映射的文件`file`、推荐的映射地址`addr`以及映射的长度`...
内存管理是计算机编程最为基本的领域之一。在很多脚本语言中,您不必担心内存是如何管理的,这并不能使得内存管理的重要性有一点点降低。对实际编程来说,理解您的内存管理器的能力与局限性至关重要。在大部分系统...
在Linux操作系统中,内存管理是其核心功能之一,它对系统的稳定性和性能有着至关重要的影响。本资料将深入探讨Linux内核如何进行内存管理和映射,以帮助你更好地理解和优化Linux系统。 首先,Linux内存管理的目标是...