Linux关于地址空间和MMAP映射
非常有用.应用程序使用mremap来改变应该映射区域的边界地址.mremap系统调用的原型如下:
void * mremap(void *old_address, size_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的样例代码)得一个简单的分析: 拥有帝国一切,皆有可能。欢迎访问phome.net/* * 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_oper |
凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢! |