`
helloyesyes
  • 浏览: 1307159 次
  • 性别: Icon_minigender_2
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

Linux驱动修炼之道-内存映射

阅读更多

努力成为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常见驱动源码分析(kernel hacker修炼之道全集)--李万鹏

    Linux驱动修炼之道-内存映射.pdf Linux驱动修炼之道-看门狗框架源码分析.pdf Linux驱动修炼之道-触摸屏驱动之s3c2410_ts源码分析.pdf Linux驱动修炼之道-SPI驱动框架源码分析(中).pdf Linux驱动修炼之道-...

    Linux设备驱动之内存映射

    ### Linux设备驱动之内存映射详解 #### 一、引言 在Linux系统中,内存映射技术是一项关键技能,特别是在设备驱动开发领域。本文旨在深入解析Linux设备驱动中的内存映射机制,涵盖其概念、原理及具体实现方式,帮助...

    Linux之V4L2基础编程-内存映射

    以上就是使用内存映射方式在Linux下进行V4L2视频数据采集的基本流程和原理。这种方式可以有效地应用于视频流的采集和处理,尤其是在对实时性要求较高的场景下。而在实际应用中,通常还需要配合数据压缩编码等处理,...

    进程间通讯基础方法-----内存映射

    2 创建磁盘文件内存映射对象,通过操作内存映射对象来修改磁盘文件内容,可以实现修改非常巨大文件的修改(16EB)。 3 在分页系统(虚存)上建立命名内存映射对象,然后不同进程间通过此对象实现海量数据共享或交换。 ...

    Linux设备驱动开发详解-基于最新的Linux4.0内核》配套代码.zip

    5. **I/O端口和内存映射**:驱动程序可能需要访问硬件的I/O端口或内存地址,Linux提供了相应的API进行操作。 6. **文件操作结构体**:对于字符和块设备,驱动需要定义一个`file_operations`结构体,包含读、写、...

    linux驱动开发中文版-1_linux驱动开发_linux_

    而内存管理则包括物理内存分配、页表管理、内存映射等内容,对于驱动程序正确地访问和操作内存至关重要。 “第一章.doc”可能包含了与“第一章 Linux内核简介.doc”重复或补充的内容,这部分可能会进一步讨论内核的...

    内存映射技术在Linux驱动程序中的应用和实现.pdf

    内存映射技术在Linux驱动程序中的应用和实现 内存映射技术在Linux驱动程序中的应用和实现可以解决高速设备的驱动程序中传统的驱动实现读写系统调用的问题。传统的驱动实现读写系统调用的方式已经不能很好地利用操作...

    Linux内核修炼之道精华版

    《Linux内核修炼之道》是一本深度探讨Linux内核的权威书籍,旨在帮助读者深入了解这个开源操作系统的灵魂。书中的内容涵盖了从内核基础到高级技术的方方面面,为那些希望提升Linux内核理解和开发能力的读者提供了...

    linux 内存映射机制

    总结来说,Linux内存映射机制是操作系统管理内存、隔离进程、提高内存利用效率的关键技术之一。通过虚拟内存和物理内存之间的映射,Linux系统能够在有限的物理内存资源下,为每个进程提供看似无限的地址空间。此外,...

    常见驱动源码分析(kernel hacker修炼之道)-李万鹏

    这本书是“Linux kernel hacker修炼之道”的一部分,通过深入剖析各种常见的驱动源码,帮助读者提升在Linux系统中的驱动开发能力。 在Linux操作系统中,驱动程序是连接硬件与内核的桥梁,它们负责管理和控制硬件...

    Linux系统下的内存映射原理

    内存映射是Linux系统中的一项关键技术,它允许进程直接访问物理内存或文件,而不必通过传统的I/O操作。本文将深入探讨Linux下内存映射的原理及其在不同内存区域的应用。 首先,Linux系统中的内存管理依赖于MMU...

    linux驱动开发中文版-3_linux驱动开发_linux_

    《Linux驱动开发中文版》是针对Linux内核驱动程序开发的一本重要教程,它涵盖了Linux系统下硬件设备的驱动编写和管理的多个方面。以下是基于提供的文件名所涉及的主要知识点的详细阐述: 1. **第二章 编写和运行...

    Linux设备驱动程序学习(8)-分配内存 - Linux设备驱动程序

    本篇文章将深入探讨Linux设备驱动程序中的内存分配机制,这是编写高效、稳定驱动程序的关键部分。 内存分配在设备驱动程序中扮演着至关重要的角色,因为错误或低效的内存管理可能导致系统崩溃、资源浪费或性能下降...

    Linux_mem.rar_Linux内核源代码解读--内存管理

    在Linux操作系统中,内存管理是内核的核心组成部分之一,它负责高效、安全地分配和管理系统的内存资源。本文将深入探讨Linux内核源代码中的内存管理机制,主要基于"Linux_mem.rar"压缩包中的"Linux物理内存管理.pdf...

    arm linux 内存映射.pdf

    ### ARM Linux 内存映射知识点详解 #### 一、概览 《ARM Linux 内存映射》是一篇深入探讨ARM架构下Linux系统如何管理内存映射的文章。该文档由作者张俊岭编写,发布于2009年8月5日。文档主要介绍了在ARM Linux环境...

    Linux内核分析与应用课件第4章-动手实践-Linux内存映射基础.pdf

    4. **字符设备驱动**:在Linux中,内存映射也可用于字符设备驱动。字符设备通常不连续地提供数据,而是按需读取或写入。通过mmap,可以直接将设备的缓冲区映射到进程地址空间,使得设备操作更加高效。 5. **内存...

    C# - 使用内存映射文件的高效文件 I/O

    在这个例子中:我们为内存映射文件定义文件路径 ( filePath) 和大小 ( )。fileSize在本例中,我们正在处理一个 100 MB 的文件。我们使用创建或打开内存映射文件MemoryMappedFile.CreateFromFile。如果该文件不存在,...

    内存映射修改大文件_内存映射_MemoryFile_超大文件读写_

    内存映射(Memory Mapping)是一种高效处理大文件的技术,它允许程序通过操作系统将磁盘上的文件映射到进程的虚拟地址空间中,从而实现对文件的读写操作如同操作内存一样简便快速。这种方式大大提升了超大文件的读写...

    Linux设备驱动模型(ahb-apb-pci)

    - `probe`函数的功能包括获取设备资源、内存映射、申请中断等。 #### 三、实例分析 以`ath9k`无线网卡驱动为例: 1. **注册** - 在驱动初始化函数`ath9k_init()`中,使用`module_init`注册驱动。 - 调用`ath_...

    file_内存映射_C++_

    内存映射是计算机科学中的一种技术,特别是在C++编程中,它允许程序高效地访问大文件,仿佛这些文件是程序的内存部分。标题中的“file_内存映射_C++_”指的是利用C++来实现内存映射文件的技术,用于创建一个小型...

Global site tag (gtag.js) - Google Analytics