`
ckw90ckw
  • 浏览: 17091 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

驱动之路-内存管理机制及mmap方法

阅读更多

驱动之路-内存管理机制及mmap方法
2011年11月07日
  一、重点知识
  1. Linux内存管理机制
  Linux 2.6.29内核为每种CPU提供统一的界面,采用四级页面管理构架。来兼容二级、三级、四级管理架构的CPU。通过页式管理机制完成虚拟地址(线性地址)到物理地址的映射。一般每个页大小为4K。cr3寄存器中保存了创建进程时分配的值。
  
  
  
  Linux操作系统采用虚拟内存管理技术,使得每个进程都有独立的进程地址空间,该空间大小是3G,用户看到和接触的都是虚拟地址,无法看到实际的物理地址。利用这种虚拟地址不但能起到保护操作系统的作用,而且更重要的是用户程序可使用比实际物理内存更大的地址空间。
  Linux将4G的虚拟地址空间划分为两个部分――用户空间与内核空间。用户空间从0到0xbfffffff,内核空间从3G到4G。用户进程通常情况下只能访问用户空间的虚拟地址,不能访问内核空间,例外是用户进程通过系统调用访问内核空间。
  每个用户空间是完全独立的,互不想干的。用户空间对应进程,所有每当进程切换,用户空间就会跟着变化。
  实际的物理内存只有当进程真的去访问新获取的虚拟地址时,才会由“请页机制”产生“缺页异常”,从而进入分配实际页框程序。
  内核空间是由内核负责映射,它并不会跟着进程改变,是固定的。
  物理内存896MB以上的部分称之为高端内存。
  
  
  
  2. mmap方法
  实现mmap方法,驱动程序只需要为该地址范围建立合适的页表,并将vma->ops替换成一系列的新操作就可以了。
  void *mmap(void *addr, size_t len, intprot, int flags, int fd, off_t offset)
  内存映射函数,负责把文件内存映射到虚拟内存空间,返回映射地址空间地址。
  参数说明:
  addr:指定映射的起始地址,通常设为NULL,由系统指定。
  length:映射到内存的文件长度
  prot:映射区的保护模式,可以是PROT_EXEC(可执行)、PROT_READ(可读)、PROT_WRITE(可写)。
  flag:映射区的特性,可以是
  MAP_SHARED:写入映射区的数据会复制回文件,且允许其他映射该文件的进程共享。
  MAP_PRIVATE:对映射区的写入操作会产生一个映射区的复制,对此区域的修改不会写回原文件。
  fd:要映射的文件描述符
  offet:以文件开始出的偏移量,通常为0,从文件头开始映射。
  int munmap(void *start, size_t length)
  解除映射。
  struct vm_area_struct
  内核用来描述虚拟内存区域的结构。
  int remap_pfn_range(structvm_area_struct *vma, unsigned long virt_add, unsigned long pfn, unsigned longpfn, unsigned long size, pgprot_t prot)
  int io_remap_page_range(structvm_area_struct *vma, unsignde long virt_add, unsigned long phys_add, unsignedlong size, pgprot_t prot)
  mmap的核心函数。他们映射了物理地址中从pfn表示的页号开始的size个字节到虚拟地址virt_add上。相关虚拟地址的保护位在port中指定。如果目标地址在I/O地址空间的话,使用io_remap_page_range函数。
  二、驱动代码
  staticint mem_mmap(struct file *filp, struct vm_area_struct *vma)   {          intret = 0;          structmem_dev *dev;          dev= filp->private_data;                   ret = remap_pfn_range(vma,vma->vm_start, virt_to_phys(dev->data)>>PAGE_SHIFT, vma->vm_end- vma->vm_start, vma->vm_page_prot);          //建立页表              if(ret)                 return-EAGAIN;                          returnret;   }       static const struct file_operationsmem_fops = {          .owner= THIS_MODULE,          .open= mem_open,          .write= mem_write,          .read= mem_read,          .release= mem_release,          .llseek= mem_llseek,          .ioctl= mem_ioctl,          .poll= mem_poll,          .mmap= mem_mmap,   };  
  staticint mem_mmap(struct file *filp, struct vm_area_struct *vma){intret = 0;structmem_dev *dev;dev= filp->private_data;ret = remap_pfn_range(vma,vma->vm_start, virt_to_phys(dev->data)>>PAGE_SHIFT, vma->vm_end- vma->vm_start, vma->vm_page_prot);          //建立页表if(ret)return-EAGAIN;returnret;}static const struct file_operationsmem_fops = {.owner= THIS_MODULE,.open= mem_open,.write= mem_write,.read= mem_read,.release= mem_release,.llseek= mem_llseek,.ioctl= mem_ioctl,.poll= mem_poll,.mmap= mem_mmap,};
分享到:
评论

相关推荐

    史上最强的嵌入式底层驱动开发课程 Linux系统开发+Linux高级程序+主板开发+ARM等

    │ ├16 - Linux命令类库机制及常用命令_命令操练1.mp4 │ ├17 - 命令操练2.mp4 │ ├18 - 命令操练3.mp4 │ ├19 - 命令操练4.mp4 │ ├20 - 命令操练5.mp4 │ ├21 - 命令操练6.mp4 │ ├22 - 命令操练7.mp4 │ ...

    Linux内核情景分析(非扫描版)

    1. 3 i386的页式内存管理机制 1. 4 Linux内核源代码中的C语言代码 1.5 Linux内核源代码中的汇编语言代码 第2章 存储管理 2.1 Linux内存管理的基本框架 2.2 地址映射的全过程 2.3 几个重要的数据结构和函数 2.4 ...

    Linux内核情景分析

    1. 3 i386的页式内存管理机制 1. 4 Linux内核源代码中的C语言代码 1.5 Linux内核源代码中的汇编语言代码 第2章 存储管理 2.1 Linux内存管理的基本框架 2.2 地址映射的全过程 2.3 几个重要的数据结构和函数 2.4 ...

    Linux内核情景分析(二级标题).pdf

    1.3 i386的页式内存管理机制 1.4 Linux 内核源代码中的C语言代码 1.5 Linux内核代码中的汇编语言代码 第2章 存储管理 2.1 Linux内存管理的基本框架 2.2 地址映射的全过程 2.3 几个重要的数据结构和函数 2.4 ...

    linux 内核源代码分析

    1. 3 i386的页式内存管理机制 1. 4 Linux内核源代码中的C语言代码 1.5 Linux内核源代码中的汇编语言代码 第2章 存储管理 2.1 Linux内存管理的基本框架 2.2 地址映射的全过程 2.3 几个重要的数据结构和函数...

    linux设备驱动程序第三版

    1. Linux 设备驱动第三版 .................................................................................................................... 5 2. 第 1 章 设备驱动简介 ....................................

    UNIX 高级教程系统技术内幕

    14.2.1 mmap 及相关系统用 14.3 VM 设计原理 14.4 基本抽象概念 14.4.1 物理内存 14.4.2 地址空间 14.4.3 地址映射 14.4.4 匿名页面 14.4.5 硬件地址转换 14.5 段驱动程序 14.5.1 seg-vn 14.5.2 seg-map 14.5.3 ...

    Linux内核源代码情景分析 (上下册 高清非扫描 )

    1.3 i386的页式内存管理机制 1.4 Linux内核源代码中的C语言代码 1.5 Linux内核源代码中的汇编语言代码 第2章 存储管理 2.1 Linux内存管理的基本框架 2.2 地址映射的全过程 2.3 几个重要的数据结构和函数 2.4 越界...

    linux内核源代码情景分析

    1.3 i386的页式内存管理机制 1.4 Linux内核源代码中的C语言代码 1.5 Linux内核源代码中的汇编语言代码 第2章 存储管理 2.1 Linux内存管理的基本框架 2.2 地址映射的全过程 2.3 几个重要的数据结构和函数 2.4...

    FreeBSD操作系统设计与实现

    2.5.1 BSD内存管理设计要点 2.5.2 内核中的内存管理 2.6 I/O系统 2.6.1 描述符与I/O 2.6.2 描述符管理 2.6.3 设备 2.6.4 套接口IPC 2.6.5 分散/聚集I/O 2.6.6 多文件系统支持 2.7 设备 2.8 文件系统 2.9 网络文件...

    Linux程序设计 第4版.haozip01

    7.1 内存管理 214 7.1.1 简单的内存分配 214 7.1.2 分配大量的内存 215 7.1.3 滥用内存 218 7.1.4 空指针 219 7.1.5 释放内存 220 7.1.6 其他内存分配函数 221 7.2 文件锁定 222 7.2.1 创建锁文件 222 ...

    Linux程序设计 第4版.haozip02

    7.1 内存管理 214 7.1.1 简单的内存分配 214 7.1.2 分配大量的内存 215 7.1.3 滥用内存 218 7.1.4 空指针 219 7.1.5 释放内存 220 7.1.6 其他内存分配函数 221 7.2 文件锁定 222 7.2.1 创建锁文件 222 ...

Global site tag (gtag.js) - Google Analytics