免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4403 | 回复: 7
打印 上一主题 下一主题

使用do_mmap_pgoff出现的问题,急! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-11-22 18:34 |只看该作者 |倒序浏览
我写了一个模块,反复映射内存,然后去除映射,结果总是出错,错误为:
Nov 22 14:22:15 node2 kernel: do_munmap error =-22  invalid argument
Nov 22 14:22:15 node2 kernel: end i=348837


以下为内核模块代码,请大家帮忙看看:



#include <linux/module.h>
#include <linux/init.h>
#include <linux/kernel.h>
#include <linux/mm.h>
#include <asm/mman.h>


static int __init tpgoff_init(void)
{
  int error = 0;
  unsigned long ubuf=0;
  size_t count = 0;
  unsigned long i=0;
  unsigned long t=1000000;
  
  printk("tpgoff kernel module init!\n");

        count = 1024 * 1024;
        for (i=0;i<t;i++) {
                 ubuf = 0;
                 down_write(&current->mm->mmap_sem);
                 ubuf = do_mmap_pgoff(NULL, 0, count, PROT_READ|PROT_WRITE,
                                MAP_PRIVATE|MAP_ANONYMOUS, 0);
                 up_write(&current->mm->mmap_sem);
                 if (ubuf==0) {
                printk("ubuf=0\n");
                 return 0;
                }
                if (ubuf!=0) {
                    error = do_munmap(NULL, ubuf, count);
                if (error) {
                        printk("do_munmap error =%d\n",error);
                        break;
                }
              }
             }

  printk("end i=%ld\n",i);
  return error;

}


static void __exit tpgoff_cleanup(void)
{

  printk("tpgoff kernel module exit!\n");

}

module_init(tpgoff_init);
module_exit(tpgoff_cleanup);
MODULE_LICENSE("Dual BSD/GPL");

论坛徽章:
0
2 [报告]
发表于 2007-11-22 18:36 |只看该作者
代码没有排好版,抱歉!

论坛徽章:
0
3 [报告]
发表于 2007-11-22 23:38 |只看该作者
不知道,很奇怪.帮忙顶

论坛徽章:
0
4 [报告]
发表于 2007-11-23 12:17 |只看该作者
问题解决:

error = do_munmap(NULL, ubuf, count);
改为:
error = do_munmap(current->mm, ubuf, count);
即可。
在取消映射时,由于第一个参数传的为NULL,其实并没有取消映射。
但更深层的原因估计还得看do_munmap实现才能确认。

论坛徽章:
0
5 [报告]
发表于 2007-11-23 12:18 |只看该作者
另外,在取消映射时也需要使用
down_write(&current->mm->mmap_sem);

up_write(&current->mm->mmap_sem);

论坛徽章:
0
6 [报告]
发表于 2010-04-13 11:47 |只看该作者
谢谢
很需要

论坛徽章:
0
7 [报告]
发表于 2011-03-01 09:15 |只看该作者
修改如下:没有出错,打印:end i=1000000
  1. #include <linux/module.h>
  2. #include <linux/init.h>
  3. #include <linux/kernel.h>
  4. #include <linux/mm.h>
  5. #include <asm/mman.h>
  6. #include <linux/rwsem.h>
  7. #include <linux/err.h>

  8. static int __init tpgoff_init(void)
  9. {
  10.       int error = 0;
  11.       unsigned long ubuf=0;
  12.       size_t count = 0;
  13.       unsigned long i=0;
  14.       unsigned long t=1000000;
  15.       
  16.        printk("tpgoff kernel module init!\n");

  17.     count = 1024 * 1024;
  18.     for (i=0;i<t;i++)
  19.     {
  20.              ubuf = 0;

  21.              down_write(&current->mm->mmap_sem);
  22.              ubuf = do_mmap_pgoff(NULL, 0, count, PROT_READ|PROT_WRITE,
  23.                                                     MAP_PRIVATE|MAP_ANON, 0);
  24.              up_write(&current->mm->mmap_sem);

  25.              if (IS_ERR((void*)ubuf))
  26.             {
  27.                  printk(KERN_INFO"do_mmap_pgoff  failed\n");
  28.                  break;
  29.             }
  30.             else               
  31.             {
  32.                 down_write(&current->mm->mmap_sem);
  33.                 error = do_munmap(current->mm, ubuf, count);
  34.                 up_write(&current->mm->mmap_sem);
  35.                 if (error)
  36.                 {
  37.                         printk("do_munmap error =%d\n",error);
  38.                         break;
  39.                 }
  40.             }
  41.     }

  42.   printk("end i=%ld\n",i);
  43.   return error;

  44. }


  45. static void __exit tpgoff_cleanup(void)
  46. {

  47.   printk("tpgoff kernel module exit!\n");

  48. }

  49. module_init(tpgoff_init);
  50. module_exit(tpgoff_cleanup);
  51. MODULE_LICENSE("GPL");
复制代码

论坛徽章:
22
丑牛
日期:2014-08-15 14:32:0015-16赛季CBA联赛之同曦
日期:2017-12-14 15:28:14黑曼巴
日期:2017-08-10 08:14:342017金鸡报晓
日期:2017-02-08 10:39:42黑曼巴
日期:2016-11-15 15:48:38CU十四周年纪念徽章
日期:2016-11-09 13:19:1015-16赛季CBA联赛之同曦
日期:2016-04-08 18:00:03平安夜徽章
日期:2015-12-26 00:06:30程序设计版块每日发帖之星
日期:2015-12-03 06:20:002015七夕节徽章
日期:2015-08-21 11:06:17IT运维版块每日发帖之星
日期:2015-08-09 06:20:002015亚冠之吉达阿赫利
日期:2015-07-03 08:39:42
8 [报告]
发表于 2011-03-01 13:50 |只看该作者
终于见到女生来内核版了。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP