快速业务通道

Linux关于地址空间和MMAP映射

作者 佚名技术 来源 Linux系统 浏览 发布时间 2012-04-24
ize_t old_size , size_t new_size, unsigned long flags);

  Linux的mremap实现没有通知驱动程序被映射区域的变化.事实上,当区域减小时,它会通过unmap方法通知驱动程序;但区域变大时,却没有相应的回调函数可以利用.

  换句话说,在映射区域增长时驱动程序不会得到通知,nopage方法会在将来完成相应的工作,从而不必在真正需要之前使用内存.因此,如果我们需要支持mremap系统调用,就实现nopage方法.

  nopage方法必要的实现步骤如下:

  计算想得到的物理地址,然后用__va()将它转换为逻辑地址,用virt_to_page将逻辑地址转成一个struct page, 返回指向这个struct page的指针.一般来说,直接从物理地址获得struct page是可能的,但是这样的代码很难在不同的体系结构之间移植.

  remap_page_range的一个有意思的限制是,它只能对保留页和物理内存之外的物理地址给予访问.也就是说,remap_page_range不会允许你重映射常规地址(常规物理内存对应的地址),相反,它会改为映射到零页.因此,如果需要映射RAM的话,我们只能使用nopage方法.

  下面是对simple.c(ldd2的样例代码)得一个简单的分析:

  /*

  * Simple - REALLY simple memory mapping demonstration.

  *

  * Copyright (C) 2001 Alessandro Rubini and Jonathan Corbet

  * Copyright (C) 2001 O''Reilly & Associates

  *

  * The source code in this file can be freely used, adapted,

  * and redistributed in source or binary form, so long as an

  * acknowledgment appears in derived source files. The citation

  * should list that the code comes from the book "Linux Device

  * Drivers" by Alessandro Rubini and Jonathan Corbet, published

  * by O''Reilly & Associates. No warranty is attached;

  * we cannot take responsibility for errors or fitness for use.

  *

  * $Id: simple.c,v 1.8 2001/07/18 22:28:18 rubini Exp $

  */

  #ifndef __KERNEL__

  # define __KERNEL__

  #endif

  #ifndef MODULE

  # define MODULE

  #endif

  #include <linux/config.h>

  #include <linux/module.h>

  #include <linux/kernel.h> /* printk() */

  #include <linux/malloc.h> /* kmalloc() */

  #include <linux/fs.h> /* everything... */

  #include <linux/errno.h> /* error codes */

  #include <linux/types.h> /* size_t */

  #include <asm/page.h>

  #include "sysdep.h"

  #ifdef LINUX_20

  # error "This module can''t run with Linux-2.0"

  #endif

  static int simple_major = 0;

  MODULE_Parm(simple_major, "i");

  MODULE_AUTHOR("Jonathan Corbet");

  /*

  * Forwards for our methods.

  */

  int simple_open (struct inode *inode, struct file *filp);

  int simple_release(struct inode *inode, struct file *filp);

  int simple_remap_mmap(struct file *filp, struct vm_area_struct *vma);

  int simple_nopage_mmap(struct file *filp, struct vm_area_struct *vma);

  /*

  * Our various sub-devices.

  */

  /* Device 0 uses remap_page_range */

  struct file_operations simple_remap_ops = {

  open: simple_open,

  release: simple_release,

  mmap: simple_remap_mmap,

  };

  /* Device 1 uses nopage */

  stru

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号